Tonhöhe von Wave-Daten ändern...



  • hi leute!

    Hat jemand zufällig code (C/C++) zum ändern der tonhöhe von wave-daten, die ich im speicher oder von mir aus auch in einer datei habe??? außerdem wäre ich auch noch sehr dankbar für code zur wiedergabe von wave-daten unter Linux (also ALSA oder direkt mit DSP, letzteres hab ich schon fast, aber was fertiges wäre noch besser) danke schon im vorraus!!



  • hmm, der einfachst weg ist, die sample-rate im buffer-descriptor zu verbiegen - vorausgesetzt, deine HW verarbeitet variable sampleraten. hat allerdings den nachteil, das sich nicht nur die pitch ändert sondern auch die geschwindigkeit.

    algos zum thema "pitch shift without time stretch" sind aufwendig und erfordern eine menge know-how - schlechte geräte/sw hierzu gibt es haufenweise, richtig gute nur sehr wenige. daher glaube ich kaum, dass dir jemand seinen code vermachen wird, sofern hier jemand einen hat.

    so far ...



  • Hm... nur sone Idee, wie wärs denn für die Tonhöhenänderung ne FFT vorzunehmen, dann einfach alle Frequenzanteile nach oben verschieben und dann nach inverser FFT wieder abspeichern.



  • Aber nicht linear nach oben verschieben. in der Musik ist alles logarithmisch!



  • ...und was ist bitte FFT??? irgendwas mit frequenz, right? hmmm. ich brauch das aber, schreibe (oder besser gesagt habs vor) ein synthesizer/musik-composing-programm für linux und für den anfang will ich erstmal nur für jedes instrument eine wave-datei haben, die ich dann für jede note entsprechend "pitche", effekt sollen dann auch noch kommen... die sache mit tracks usw. ist dann eher nebensächlich, das komplizierte ist halt das angesprochene problem, das leider immer noch nicht gelöst ist...



  • FFT heißt "Fast Fourier Transformation", aber schau Dir auf alle Fälle mal den ats (Audio Time Stretcher) für Linux an, braucht zwar IIRC leider eine alte Version der libsndfile aber funktioniert ganz ok...



  • und für den anfang will ich erstmal nur für jedes instrument eine wave-datei haben

    na, das ergebnis wird enttäuschend ausfallen, da du ein audio-signal nicht endlos in die höhe/tiefe pitchen kannst. damit es einigermassen human klingt, brauchst du schon mindestens ein sample pro oktave und selbst das ist noch wenig.

    gerade synth-sound wie square/tri/pulse sind sehr kritisch was die transponierung der oberwellen betrifft.



  • etechniker schrieb:

    Hm... nur sone Idee, wie wärs denn für die Tonhöhenänderung ne FFT vorzunehmen, dann einfach alle Frequenzanteile nach oben verschieben und dann nach inverser FFT wieder abspeichern.

    hmm, theoretisch denkbar, aber praktisch ? das problem wird sein, das die frequenz-raster zwischen den einzelnen koeefizienten bei der fft/dft gleich gross sind. da ist es fraglich, ob überhaupt einer die genaue frequenz eines tones trifft.

    nehmen wir mal an, du willst den ton a (440hz) um einen halbton pitchen. erstmal ist es unwahrscheinlich das einer der coeff den ton genau erfasst und wenn überhaupt dann wird spätestens der "shift" nicht mehr funktionieren, da du auf "ais" wohl kaum einen coeffizienten findest, wo du den koeffizienten "hinschieben" kannst. und dann stelle man sich das ganze statt eines "sinus" noch als komplexes signal mit oberwellen als vielfaches der grundfrequenz vor.

    ich denke das wird nicht funktionieren.



  • aber z.b. im nero wave-editor klappt das auch einwandfrei. und FruityLoops (1A-Synthesizer-Programm mit allem drum und dran, leider nur für Win**** und bei Nachfrage haben die geantwortet, dass das nicht auf Linux portierbar ist, weil das mit Delphi und jeder menge inline-asm geschrieben sei...) macht aus einem sample auch jede beliebige tonhöhe (bessergesagt sind das genau die samples, die ich verwenden will...)



  • Es gibt verfahren. Das Beste auf dem Markt soll MPEX sein, ist aber IMHO lizenzpflichtig. Ich hab mich mit dem Thema noch nicht ausführlich beschäftigt.



  • ich würde aber gerne opensource-code haben, bloß da gibts ja bekanntlicherweise so viel, dasss das viel zu viel arbeit wäre, da was für mein problem rauszufischen, deshalb hatte ich ja gehofft, dass jemand zufällig was da hat...


Anmelden zum Antworten