Ich habe mit experimentiert FM-Synthese um Audiodateien zu erstellen und zu verwenden ADSR Hüllkurven, um den resultierenden Klang zu formen. FM bedeutet Frequenzmodulation.ADSR bedeutet Attack, Decay, Sustain und Release. ADSR beschreibt eine Kurve, die bestimmt, wie schnell die Lautstärke einer Note ansteigt (Attack) und abfällt (Decay), wenn eine Taste gedrückt wird, wie hoch die anhaltende Lautstärke ist, wenn die Taste gehalten wird, und wie die Lautstärke der Note abklingt, wenn die Taste losgelassen wird. Ein typisches Bild einer ADSR-Kurve hat vier gerade Linien:
A, D, R are time; S is a levelA, D, R are time; S is a levelA, D, R are time; S is a levelA, D, R are time; S is a levelA, D, R sind Zeit; S ist eine Stufe
Die Wellenform unten hat keine Modulation (alle Spitzen und Täler sind gleichmäßig verteilt.)
Wenn Sie sich den oberen Rand des ersten Zyklus in der Grafik ansehen, sehen Sie einen kleinen Fehler. Da ich den Code schrieb, nahm ich an, dass ich einen Fehler gemacht hatte; Wenn Sie es zoomen, sieht es wie ein erheblicher Fehler aus, der den Klang ein wenig beeinträchtigen könnte.
Actually, two glitchesActually, two glitchesActually, two glitchesActually, two glitchesEigentlich zwei Pannen
Der Attack wurde auf 0,001 Sekunden eingestellt und das Decay auf 0,003; bei 44.100 Samples pro Sekunde endet der Attack bei Sample 44 und das Decay endet bei Sample 176. Ich habe eine Datentabelle erstellt, um eine vereinfachte Version zu erstellen, und schließlich festgestellt, dass der Fehler durch die scharfen Ecken in der ADSR-Kurve verursacht wird. Um dies zu beheben, passe ich einen Spline an die ADSR-Kurve an. Solange die Spannung des Keils hoch genug ist, ist der Fehler zu subtil, um ihn zu bemerken. (Dies sind vereinfachte Daten, nicht die Daten, die Sie oben und weiter unten gehört haben.)
The orange spline-based curves are hiding behind the purple curves; at this zoom they are nearly identical.The orange spline-based curves are hiding behind the purple curves; at this zoom they are nearly identical.The orange spline-based curves are hiding behind the purple curves; at this zoom they are nearly identical.The orange spline-based curves are hiding behind the purple curves; at this zoom they are nearly identical.Die orangefarbenen Spline-basierten Kurven verstecken sich hinter den violetten Kurven; bei diesem Zoom sind sie nahezu identisch.
Zoomen Sie ein wenig in die Ecke zwischen den Decay- und Sustain-Kurven:
The solid sine curve is rising, but slowing. The dotted purple decay curve is falling, but about to become flat (sustain.)The solid sine curve is rising, but slowing. The dotted purple decay curve is falling, but about to become flat (sustain.)The solid sine curve is rising, but slowing. The dotted purple decay curve is falling, but about to become flat (sustain.)The solid sine curve is rising, but slowing. The dotted purple decay curve is falling, but about to become flat (sustain.)Die durchgezogene Sinuskurve steigt an, verlangsamt sich aber. Die gepunktete violette Abklingkurve fällt, wird aber bald flach (Sustain).
Die gepunktete orangefarbene Kurve ist eine Spline-Interpolation der Punkte in der gepunkteten violetten Kurve. Die durchgezogene orangefarbene Kurve ist die ursprüngliche Sinuswelle, multipliziert mit der orangefarbenen Hüllkurve, um sie zu verkleinern. Der Fehler der violetten Kurve scheint etwa 1 Teil von 1000 zu sein; Ich bin mir nicht sicher, ob das hörbar sein wird oder nicht. Im Bereich +/- 32767 der Wave-Dateidaten wären das etwa 32, 2^5, vielleicht im 5. Bit einer 16-Bit-Zahl, vielleicht 60 dB nach unten. Ich denke mit gutem Equipment und jungen Ohren sollte es hörbar sein.
Vergrößert sieht es aus wie a schön verzerrte Sinuswelle.
The glitch is gone. The leading part of the sine wave is flattened by the rising gain of the attack.The glitch is gone. The leading part of the sine wave is flattened by the rising gain of the attack.The glitch is gone. The leading part of the sine wave is flattened by the rising gain of the attack.The glitch is gone. The leading part of the sine wave is flattened by the rising gain of the attack.Der Fehler ist weg. Der führende Teil der Sinuswelle wird durch die ansteigende Verstärkung des Attacks abgeflacht.
Datei angehängt. Unter Windows wird PlaySound in der Multimedia-DLL verwendet. Oben sind ein paar Schalter. Es verwendet keinen FM-Code, und je mehr ich darüber nachdenke, implementiert es wahrscheinlich eher Phasenmodulation als Frequenzmodulation. Es ist nicht bereit für mehr als diese Demo.