2010-11-21 15 views
1

Ich muss einen digitalen Synthesizer für ein Schulabschluss-Projekt programmieren, und während ich die meisten der Theorie bezüglich Synthesizern im Allgemeinen kenne, muss ich zugeben, ein Programmierneuling zu sein. Ich muss es in C tun, wie im Titel angegeben. Der einfachste Weg, um es zu tun, scheint mit Wavetable-Oszillatoren zu sein, auch so kann ich eine Rampenwelle als Basis für eine ADSR-Hüllkurve verwenden. Allerdings habe ich keine Ahnung, wie man sicherstellen kann, dass es in der richtigen Tonhöhe ist. Es ist leicht, die relative Tonhöhe des Oszillators durch Ändern des Inkrementzählers zu ändern, aber wie bestimmt man die absolute Tonhöhe des Oszillators?Ein einfacher Wavetable-Oszillator in C

J.Midtgaard

Antwort

4

Sie benötigen die sample rate des Audio-Stream kennen, die Sie produzieren. Wenn Ihre Abtastrate fs, und Sie versuchen, einen Ton mit einer Frequenz von f zu produzieren, dann müssen Sie alle fs/f Proben einen kompletten Zyklus (Periode) zu erzeugen. Alternativ müssen Sie während jeder Audio-Probe um f/fs eines Zyklus vorrücken. Also, wenn Ihr Wavetable n Einträge hat einen kompletten Zyklus darstellen, dann müssen Sie durch n * f/fs Einträge pro Hörprobe vorzurücken.

Zum Beispiel für fs = 44,1, f = 1kHz, n = 1024, muss die Schrittweite sein 1024 * 1000/44100 = 23,22 Einträge pro Probe.

Beachten Sie, dass Sie normalerweise einen nicht ganzzahligen Inkrementwert erhalten. Um die richtige Tonhöhe zu erhalten, sollten Sie diesen Wert beim Inkrementieren nicht runden. Stattdessen sollten Sie nur runden, wenn Sie Ihren Akkumulatorwert in den Tabellenindexwert umwandeln. (Ein komplizierterer Ansatz ist eine Art von Interpolation zwischen Einträgen.)