audioprogrammierung: wie pitch verändern?
-
hi folks...
kurze frage: wie kann ich den pitch eines audiobuffers höher oder niedriger machen ohne den speed zu verändern?
ach ja, und gibt es eine simple möglichkeit den pitch kontrolliert in ton-abständen zu verändern, so dass also eine veränderung in ton-werten möglich ist?
soll heissen: changepitch(buffer, +8); macht signal um 1 oktave höher.
-
Du musst dir deinen Audiobuffer bauen. Aus dem Samples holst du die Daten
mit einem Zeiger den du mit einem float-Wert inkrementierst.
Bei einem 44kHz-Sample von einer Sekunde mit einem 440 Hz Sinus-Ton, ist dein
Inkrement 1, wenn du A haben willst. Um den nächst höheren Halbton also A# zu erhalten rechnest du ein Inkrement mal sqrt(12), und holst aus deinem Sample jedes 1*sqrt(12)te Byte. Das H ist wieder der alte Wert mal sqrt(12), also holst du aus deinem Sample jedes sqrt(12)*sqrt(12)te Byte und so weiter und schreibst es in deinen Audiobuffer.
Bei allen Audiobibliotheken arbeites du ja ohnehin mit einem Buffer.
-
ok, das werde ich mal ausprobieren. danke

-
Die beschriebene Methode erzeugt aber auch wieder einen kürzeren/ längeren Ton. Eigentlich müsstest du deinen Ton aus dem Zeitbereich in den Frequenzbereich umrechenen, die Freuquenzen verändern, und wieder zurückrechnen.
Bye, TGGC (Demo or Die)
-
BTW: Alle die einen Einstieg in die Audioprogrammierung suchen finden hier ein Tutorial: http://turing.fh-landshut.de/~jamann/Audioprogrammierung unter Windows mit C++ fuer Computerspiele.pdf
-
@TGGC: ist mir auch schon aufgefallen... da ich eh vorhabe mich in digitalen sound einzuarbeiten werde ich wahrscheinlich über kurz oder lang die von dir beschriebene methode nutzen...
@Vertexwahn: danke für den link! sieht sehr interessant aus. nur geht das halt recht schnell über auf die reine nutzung einer API über.
wüsstest du noch was das sich mehr mit den grundlagen beschäftigt?
-
ich kenne nur zwei Bücher am Markt die sich mit Integration einer "dynamischen" Soundengine beschäftigen - läuft auch auf DirectAudio hinaus...