In article , "Markus" writes: |> Doch genau das. Du meinst doch hier erst per Interpolation |> länger oder kürzer ziehen und dann die Länge bei gleichbleibender |> Tonhöhe wieder der vorigen Länge gleichzusetzen oder würdest du |> hier anders vorgehen?
Ich bin zwar nicht Thomas, aber:
Du hast zwei Möglichkeiten. Entweder veränderst Du die Samplerate und läßt dafür die Auflösung der Wellenform gleich oder Du läßt die Samplerate konstant und überspringst dafür einzelne Samples (bzw. wiederholst diese mehrfach).
Erstes wäre ein programmierbarer Timer der einen Adreßzähler taktet, letzteres ein Phasenakkumulator. Damit's bei *dem* nicht quietscht, empfiehlt sich Interpolation, aber auch damit wirst Du nicht beliebig hochtransponieren können, denn irgendwann bleibt von Deiner Wellenform eben nur noch ein Rechteck über bzw. Du rennst schließlich in Aliasing rein.
Bei ersterem geht Dir dafür irgendwann die Puste aus, denn immerhin willst Du ja pro Oszillator nominal 88200 Speicherzugriffe pro Sekunde fahren (8 Bit, stereo, 44.1kHz) -- eine Oktave drüber sind's dann schon 176400, zwei Oktaven drüber 352800. Legst Du die 44.1kHz zufällig auf den Kammerton respektive MIDI-Note 69, hast Du nach oben noch fast 5 Oktaven, d.h. ballerst dort
*pro Oszillator* mit einer Zugriffsrate von knapp 3MHz auf den Bus.
Soll heißen: In den Controller selbst bekommst Du das sowieso nicht rein. Entweder fehlt Dir die Puste für die mindestens 16-Bit-Addition (achja, Du wolltest ja 30 Sekunden, also wird's eine 32-Bit-Addition), von denen Du osc*44100/s durchführen willst, oder es scheitert an den Buszugriffen.
Um externe Hardware kommst Du also so oder so nicht herum.
|> Bist du dir denn sicher dass nach einer solchen Transformation |> das Ergebnis noch gut bzw. perfekt klingt? Ich bin da zugegeben sehr |> skeptisch.
Was ist "perfekt"? Wenn Du es "perfekt" haben willst, dann solltest Du physical modelling betreiben und jeden Ton für sich anhand des mathematischen Modells des gewählten Klangs erzeugen :)
|> 6 Töne sollte es schon mindestens gleichzeitig erzeugen können.
In echtem Stereo, d.h. 12 * 44.1kHz? Das wiederum bedeutet, daß Du ein Zeitfenster von 529.2kHz hast, in dem Du alle notwendigen Operationen durchgeführt haben mußt -- da Du bei Interpolation mithilfe der Nachkommastelle des Phasenakkus zweimal auf den Speicher mußt, sind es sogar nur 24*44.1kHz, d.h. >1MHz.
In der Zeit also mindestens 1. Phasenakku einladen 2. Inkrementum draufaddieren 3a. Wellenformadresse aus Phasenakku erzeugen (z.B. die oberen 24 Bit) 3b. Wellenform laden 3c. Wellenformadresse +1 -> laden 3d. Interpolation anhand der unteren 8 Bit; sagen wir mal, die oberen 3 Bit hiervon reichen 4. Zumindest 3d wiederholen für zweiten Kanal; falls Speicher- interface zu klein, dann 3a-3d. 5. Ausgeben 6. Phasenakku rückschreiben
Und das mit einem AVR? Da wird sogar das 16MHz-Modell keuchen.
|> Das durfte sogar relativ einfach machbar sein mit ein paar msec Verzögerung.
Die willst Du aber nicht, diese "paar msec Verzögerung".
|> Ob das ein normaler Mikrocontroller schafft das zu berechnen weiß ich |> nicht, aber man könnte ja einen zweiten Controller dazu benutzen um die |> Samples zu puffern.
Es gäbe als Demonstratoren den Modulus Monowave, der *eine* Stimme (IIRC bestehend aus zwei Oszillatoren) mithilfe eines AVRs erzeugt, der nebenbei natürlich noch das Userinterface bedient (ein paar Drehregler und ein einzeiliges VFD), die Modulationsmatrix strickt und das ausgelesene Sample dann in die (analoge) Nachverarbeitung steckt. ->
formatting link
Dann wäre da noch der AVRsynth, welcher zwar keine Samples wiedergibt, aber quasi-analoge Synthese betreibt und sogar noch ein lustiges Digital- filter beisteuert. Auch der ist nicht sehr polyphon. ->
formatting link
Rainer