Selbstgenerierte Samples -> Schiefe Töne

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Thunder

Betreff: Selbstgenerierte Samples -> Schiefe Töne

BeitragMo, Jul 15, 2013 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

habe leider ein komisches Problem mit Sound und Musik, also Sachen mit denen ich mich nicht auskenne und normalerweise auch nicht beschäftige. Ich generiere mir selber verschiedene Audiosamples (alle Halbtöne einer Oktav in dem Beispiel) und spiele sie ab. Je nach Build-Variante (mit/ohne Debug, nicht/schon multithreaded) sind es verschieden viele Töne, die übersteuern oder zu laut sind...
Ich hoffe mir könnte jemand helfen. Wie gesagt, hier ein Beispiel:

BlitzMax: [AUSKLAPPEN]
Strict
Const TONECOEFF:Double = 2 ^ (1.0/12.0)
Global tones:TSound[]

tones = CreateTones(220)
PlaySample
Delay 1000
tones = CreateTones(440)
PlaySample
End


Function CreateTones:TSound[](basefreq:Double)
Local sample:TAudioSample, i
Local tone, freq:Double, sounds:TSound[], rate
Local amp

For tone = 0 Until 14
freq = basefreq * TONECOEFF ^ tone

rate = 48000/freq
sample = CreateAudioSample(rate, 48000, SF_MONO16BE)

For i = 0 To rate Step 2
amp = Sin(i * 360 / rate)*16000
If tone = 0 Then DebugLog "amp = "+amp+" ~t~t~tshort(amp) = "+Short(amp)
sample.samples[i] = (Short(amp) Shr 8) & $FF
sample.samples[i+1] = Short(amp) & $FF
Next
sounds :+ [TSound.Load(sample, True)]
Next
DebugLog "---"
Return sounds
EndFunction


Holzchopf

Meisterpacker

BeitragMo, Jul 15, 2013 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann das nicht nachvollziehen. Was macht denn die Funktion PlaySample? Spielt die alles auf einmal ab? Dann ist's klar, dass es übersteuert...
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Midimaster

BeitragDi, Jul 16, 2013 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
also der SF_MONO16LE hat die grobe Amplitude in den ungeraden Bytes und die feine Amplitude in dem geraden Bytes davor. Das ist genau anders herum als bei Dir...

Ich habe für Dich hier ein Beispiel aus meinen Codes, allerdings ist es die umgekehrte Funktion:

BlitzMax: [AUSKLAPPEN]
Global sample:TAudioSample=CreateAudioSample(Hertz*2,Hertz,SF_MONO16LE)
....
For I=0 To RealSamples-1
locSample=sample.samples[i*2+1]*256+sample.samples[i*2]
locSample=locSample-(128*256)
RohWert[i]=locSample


vollkommene Stille, also der Nulldurchgang entspricht einem Wert von 128*256.

hilft dir das?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Thunder

BeitragDi, Jul 16, 2013 8:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf: Nein, die spielt natürlich nicht alles auf einmal ab. Aber ich hab anscheinend sie irgendwie aus der Datei gelöscht, also nochmal alles:
BlitzMax: [AUSKLAPPEN]
Strict
Const TONECOEFF:Double = 2 ^ (1.0/12.0)
Global tones:TSound[]

tones = CreateTones(220)
PlaySample
Delay 1000
tones = CreateTones(440)
PlaySample
End


Function CreateTones:TSound[](basefreq:Double)
Local sample:TAudioSample, i
Local tone, freq:Double, sounds:TSound[], rate
Local amp

For tone = 0 Until 14
freq = basefreq * TONECOEFF ^ tone

rate = 48000/freq
sample = CreateAudioSample(rate, 48000, SF_MONO16BE)

For i = 0 To rate Step 2
amp = Sin(i * 360 / rate)*16000 + 256*128
If tone = 0 Then DebugLog "amp = "+amp+" ~t~t~tshort(amp) = "+Short(amp)
sample.samples[i] = (Short(amp) Shr 8) & $FF
sample.samples[i+1] = Short(amp) & $FF
Next
sounds :+ [TSound.Load(sample, True)]
Next
DebugLog "---"
Return sounds
EndFunction


Function PlaySample()
Local t:TSound, chan:TChannel
For t = EachIn tones
chan = PlaySound(t)
Delay 500
StopChannel chan
Next
EndFunction



Midimaster: Habe ja auch Big Endian Wink
Das mit dem Nulldurchgang ist aber ein guter Tipp, ich kann es nur nicht nachstellen: Das heißt also, wenn ich in meinem Beispiel amp auf 256*128 setze, dürfte kein Ton kommen oder? Ist aber.
Habe jetzt trotzdem probiert, den Wert zu amp dazuzuaddieren, aber es machen immer noch ein paar Töne Krach... :/
  • Zuletzt bearbeitet von Thunder am Mi, Jul 17, 2013 18:14, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Jul 16, 2013 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst Du mit "Töne machen Krach", dass es bei bestimmten Frequenzen zu einem Übersteuern kommt. Oder ist dann der ganze Sound unbrauchbar und macht wirklich sonderbare Geräusche?

Oder hast Du nur Knackser drin? Die kommen vom falschen aneinandersetzen der mit Sin() erzeugten Teilstücke. Prüfe, ob das Ende und der Anfang wirklich ein Nulldurchgang ist.

Ebenso könnte einfach die Karte schon übersteuern. Gerade dann, wenn Du versuchtst mehrere Sounds gleichzeitig abzuspielen, die alle bis an die Grenze ausgesteuert erstellt wurden. Versuch doch mal den Faktor von 16.000 auf 8.000 runterzusetzen.

Außerdem würde ich mal versuchen mit 44.100Hz statt 48.000 zu experimentieren. Vielleicht ist ja da die Ursache

Ja also wenn den finale Sound überall 128*256 hat, also so aussieht: 128,0,128,0,128,0,... dann müsste absolut nix zu hören sein.

Amp muss unbedingt an allen Stellen positiv sein, bevor Du es mod 255 in den finalen Sound reinkopierst.


Dein Amp müsste dann so gebildet werden:

BlitzMax: [AUSKLAPPEN]
amp = Sin(i * 360 / rate)*8000+128*256



Ach ja, Big Endian... das hatte ich falsch gesehen.


Schau Dir Deine Sounds doch mal mit Audacity an. Auch da kannst Du vielleicht schon erkennen woran es liegt.


Wozu brauchst Du die Sounds? Geht es Dir um die Synthese? Oder willst Du nur einfach eine Tonleiter. Dann sieh Dir mein Tool an:

https://www.blitzforum.de/foru...hp?t=37210
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Holzchopf

Meisterpacker

BeitragDi, Jul 16, 2013 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich heisse nicht DAK Wink

In der Hilfe steht übrigens zu SF_MONO16BE Zitat:
Mono signed 16 bit big endian

Also habe ich kurz folgendes ausprobiert BlitzMax: [AUSKLAPPEN]
amp = Sin(i * 360 / rate)*16000
und ZACK gings - wunderschöner Sinus Smile

BTW: Konnte ich dein Phänomen von wegen Buildvariante = anderes Ergebnis immer noch nicht nachvollziehen. Kannst du das bei dir nochmal ausprobieren?

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Thunder

BeitragMi, Jul 17, 2013 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoppla, sorry Holzchopf, das wird ein Fehler mit meinem eigenen Multitasking gewesen sein Embarassed habs ausgebessert.

Ja, Midimaster, einzelne Frequenzen haben übersteuert. Aber ich hab mir deinen Tipp zu Herzen genommen und mir die Töne in Audacity angeschaut und bemerkt, dass eine halbe Sinuskurve völlig normal und der Rest völlig durcheinander war und mir ist dann im Code aufgefallen, dass ich nicht alle sample[]-Felder befülle:
BlitzMax: [AUSKLAPPEN]
sample = CreateAudioSample(rate, 48000, SF_MONO16BE)

For i = 0 To rate Step 2
amp = Sin(i * 360 / rate)*16000 + 256*128
If tone = 0 Then DebugLog "amp = "+amp+" ~t~t~tshort(amp) = "+Short(amp)
sample.samples[i] = (Short(amp) Shr 8) & $FF
sample.samples[i+1] = Short(amp) & $FF
Next


Wegen dem Step 2 muss also im Kopf der For-Schleife rate gegen 2*rate getauscht werden und schon habe ich auch schöne Sinustöne.

Das macht auch die Sache mit unterschiedlichen Ergebnissen bei Debug/nicht Debug plausibel.

Ja, dein Tool habe ich schon im Vorhinein gefunden. Das sieht echt cool aus, aber die Töne sind für ein kleines virtuelles Keyboard, das ich gerade programmiere, und ich hatte vor, dass es möglichst auf externe Ressourcen verzichtet.

Danke euch beiden Very Happy

Eine zusätzliche Frage: Bei zwei Tönen, die knapp nebeneinander liegen habe ich trotzdem sehr unschöne Klänge. Kriegt man diese Schwebung irgendwie in den Griff? Ich hab's mit Phasenverschiebung versucht, aber ich glaube das bringt nichts Surprised

Holzchopf

Meisterpacker

BeitragMi, Jul 17, 2013 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh ja, das mit dem x2 ist mir auch aufgefallen. Hatte ich vergessen zu erwähnen Confused Aber inwiefern macht das "Sache mit unterschiedlichen Ergebnissen bei Debug/nicht Debug plausibel"? Das verstehe ich nicht.

Und wie hast du die Töne ins Audacity gebracht?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Thunder

BeitragMi, Jul 17, 2013 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, könnte mir vorstellen, dass auf Debug automatisch allokierte Speicherbereiche mit 0 initialisiert werden oder so. Dann würde der Fehler nicht so herausstechen.

Hab ein Klinkenkabel genommen und Lautsprecher- mit Mikrofon-Anschluss verbunden Very Happy (im Audiomanager dann von Mikrofon umgestellt auf Audioeingang).

ZEVS

BeitragMi, Jul 17, 2013 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Gegen die Schwebung könnten Obertöne helfen. Einfach den gleichen Ton mit kleinerer Lautstärke und 2, 3, ...-facher Frequenz dazusampeln. Z.B.
BlitzMax: [AUSKLAPPEN]
For i = 0 To rate Step 2
amp = Sin(i * 360 / rate)*16000 + Sin(2 * i * 360/rate)*8000 + Sin(3 * i * 360/rate)*4000 '+256*128 <- halte ich für unnötig
'evtl. muss dann die Amplitude allgemein kleiner gemacht werden
If tone = 0 Then DebugLog "amp = "+amp+" ~t~t~tshort(amp) = "+Short(amp)
sample.samples[i] = (Short(amp) Shr 8) & $FF
sample.samples[i+1] = Short(amp) & $FF
Next
(oder wie auch immer dein korrigierter Code aussieht)
Damit ist eigentlich immer ein Oberton zu hören und die Schwebeeffekte sollten geringer ausfallen. Phasenverschiebung ist eigentlich nur eine zeitliche Verschiebung der Schwebung, sollte also wenig helfen. Ich habe es aber ehrlich gesagt noch nie ausprobiert, ob Obertöne das Problem beheben.

ZEVS

DAK

BeitragDo, Jul 18, 2013 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder: Nimm doch für sowas einfach als Aufnahmegerät den Soundmixer. Dann hast du genau das, was du in Hardware löst, in Software. Braucht keine extra Kabel und gibt auch bessere Soundqualität.
Gewinner der 6. und der 68. BlitzCodeCompo

Midimaster

BeitragDo, Jul 18, 2013 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem Soundmixer interne Aufnahmen zu machen ist unter WIN-7 und WIN-8 so erschwert worden, dass man echt lange tüfteln muss, bis man die Ansicht "Aufnahme-Mixer" überhaupt zu Gesicht bekommt. Microsoft hat scheinbar was dagegen, dass die Leute Aufnahmen von dem machen, was sie auch gerade über die Lautsprecher hören.

Eine weitere Möglichkeit die eigenen Samples zu speichern seht ihr in meinem Tool. Dort gibt es im Quellcode das Modul axe.oggsaver , das Samples als OGG files abspeichert. Verwendung siehe:

https://www.blitzforum.de/forum...hp?t=37210
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Thunder

BeitragDo, Jul 18, 2013 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Dachte mir schon, dass es irgendwie über Software gehen könnte, aber hat ja so auch ganz gut funktioniert.
Danke ZEVS, dachte nicht, dass man Obertöne einfach nur "dazuaddiert" Smile
Ah super, Midimaster, sowas hab ich auch gesucht.

Danke sehr! Very Happy

DAK

BeitragDo, Jul 18, 2013 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, find's gar nicht so schwer in Win7... Weiß nicht, wie's in Win8 ist. Ich tu mir den Mist nicht an Wink

In Win7: Rechtsklick auf das Lautsprechersymbol im Systray -> Aufnahmegeräte -> Rechtsklick auf Stereomix -> Als Standardgerät auswählen

Fertig.
Gewinner der 6. und der 68. BlitzCodeCompo

Holzchopf

Meisterpacker

BeitragDo, Jul 18, 2013 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Off-Topic: Stereomix ist bei Win 7 (zumindest bei Home) standardmässig nicht in der Liste, da liegt das Problem. Habe mich dazu auch schon einmal totgesucht Rolling Eyes
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

DAK

BeitragFr, Jul 19, 2013 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, interessant, bei mir schon.
Bei einem älteren Computer von mir war da was von wegen Rechtsklick in das Fenster von vorhin -> Deaktivierte/Getrennte Geräte anzeigen
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group