rolfdegen Posted September 15, 2012 Report Share Posted September 15, 2012 (edited) Hallo Seit Anfang diesen Jahres baue ich an meinen eigenen Synthesizer auf Basis eines ATxmega128A1 Mikrocontrollers und analogen Filterbeistein SSM2044. Wenn Ihr Lust und Zeit habt, dann schaut doch mal ins Forum des ComputerClub 2 vorbei. Die Betreiber sind alte Bekannte vom ehemaligen WDR-ComputerClub. Bild 1: AVR-Synthesizer "WAVE 1" Features in the AVR-Synthi "WAVE 1": 2 Audiochanal 12 Bit 2 Oscillators per chanal 3 LFO's per chanal 1 Filter per chanal Noisegenerator Graphic display with Touch Panal Midi-In Bild 2: WAVE 1 Schema Auf soundcload.com gibts schon einige Klangbeispiele vom "WAVE 1":Listen on Soundcloud.com Bild 3: So soll er mal aussehen.. der kleine "WAVE 1" Es liegt auf jeden Fall noch viel Entwicklungsarbeit vor mir. Werde von Zeit zu Zeit hier berichten. MfG Rolf Edited December 31, 2012 by rolfdegen 2 Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 16, 2012 Author Report Share Posted September 16, 2012 (edited) Hallo zusammen Ich bin wieder fleißig am Synthi am werkeln. Die SSM2044 Filter haben mich etwas aufgehalten. Sie sind an den Steuereingängen etwas empfindlicher als die CEM3320 und so musste ich die Ansteuerung etwas abändern. Im Bild 1 ist der aktuelle Schaltplan zu sehen. Für die Ansteuerung der Filter Ein- und Ausgänge benutze ich die etwas rauschärmeren TL074 Operationsverstärker. Die TL084 sind im Rauschverhalten nicht so gut wie die TL074, eignen sich aber durch ihre hohe Slewrate (16V/µs) besser für die PWM-Filtersteuerung. Bild 1: Schaltplan AVR-Synthi Um den zweiten DAC-Kanal (DACB) auf dem XMEGA Xplained Board zu nutzen, ist eine kleine Änderung auf dem Xplained Board notwendig. Der DAC-Kanal (DACB) wird leider nicht nach außen auf eine Kontaktleiste geführt, sonder geht direkt über einen Kondensator (C403) an den internen Audioverstärker. Das Problem habe ich mit einer kleinen Drahtbrücke von Kondensator C403 an den Pin PA3 von Kontaktleiste J2 gelöst. MfG Rolf Edited December 31, 2012 by rolfdegen 1 Quote Link to comment Share on other sites More sharing options...
ilmenator Posted September 17, 2012 Report Share Posted September 17, 2012 Schoenes Projekt! Hast du keinen MIDI-Out vorgesehen? Wie werden dann Sounds und Einstellungen uebertragen und gespeichert? Gruesse, ilmenator Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 17, 2012 Author Report Share Posted September 17, 2012 (edited) Hallo ilmenator Danke :) Es sind noch viele Dinge geplant wzB Midi-Out, SD-Card. Dank des großen Speichers (8MB SDRAM) auf dem Xplained Board sind später auch Wavetables möglich. Was mich selber an meinem Synthi-Projekt so erstaunt, das die 12Bit Soundausgabe dank der analogen Filterbausteine SSM2044 gar nicht mal so schlecht klingt. Für die Leute, die später an einem Nachbau interessiert sind: Die Filterbausteine SSM2044 kann man auch in größeren Stückzahlen im Online-Shop von www.darisusgmbh.de bestellen. Gruß Rolf Edited September 17, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
nILS Posted September 17, 2012 Report Share Posted September 17, 2012 Um ganz ehrlich zu sein: mich würde der - gemessen am allgemeinen Funktionsumfang des Synths - exorbitant hohe Preis des Display von 70+€ abschrecken. Hast Du über günstigere Alternativen (DOGXL oder so) nachgedacht? Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 17, 2012 Author Report Share Posted September 17, 2012 (edited) Hallo Nils Ich wollte keine "Tausend" Potis und Schalter verwenden. Aus diesem Grund habe ich ein "intelligentes" Display mit Touchpanal verwendet. Der Einsatz eines DOG-Display mit Touchpanal wäre mit einer höhere Prozessorlast verbunden und das ginge dann auf Kosten der Soundqualität und Soundeffekte. Alternativ ist später vielleicht ein schickes LCD- oder OLED-Display geplant. Kann man sich auch selber gestalten wie man möchte. Ich werde die Software später veröffentlichen. Der größte Teil der Software ist in C geschrieben, nur der Soundteil in Assembler. Gruß Rolf Edited September 17, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 22, 2012 Author Report Share Posted September 22, 2012 (edited) Hallo Ich habe jetzt das Bedienschema fuer das Touch Panal Display fertig gestellt. Die Systemeinstellungen fuer den Synthesizer werden ueber mehrere Menue-Seiten aufgerufen und koennen dort veraendert und abgespeichert werden. Das Aufrufen der einzelnen Menue-Seiten erfolgt ueber die Tabreiter (siehe Youtube-Video). Bild 1: Touch Panal Menue AVR-Synthi Youtube Video Im Moment sind die Menue-Seiten noch leer. Ich werde mir jetzt Gedanken darueber machen muessen, wie ich die Synthesizer-Funktionen in den Menue-Seiten sinnvoll gestalte. MfG Rolf Edited December 31, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
Imp Posted September 22, 2012 Report Share Posted September 22, 2012 Das Bedienkonzept finde ich ziemlich gut! Was den Preis angeht, hat Nils schon recht. Aber wenn ich mir vorstelle, was damit möglich wäre, sind 70€ fst schon wieder akzeptabel. Ich würde nicht ganz auf Encoder/Potis verzichten. So 2-4, die immer die Parameter steuern, die grade auf dem Display sind würden sicher eine wesentlich flüssigere Bedienung ermöglichen. Quote Link to comment Share on other sites More sharing options...
ilmenator Posted September 22, 2012 Report Share Posted September 22, 2012 Ich würde nicht ganz auf Encoder/Potis verzichten. So 2-4, die immer die Parameter steuern, die grade auf dem Display sind würden sicher eine wesentlich flüssigere Bedienung ermöglichen. Und dann noch eine eigene Taste pro Reiter und das Touchpanel kann wieder in den Schrank! Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 22, 2012 Author Report Share Posted September 22, 2012 Hallo Imp Ja, den Tip mit den Encodern finde ich nicht schlecht. Mal schaun was sich da später machen lässt. Zur Zeit arbeite ich fieberhaft an der Software. Gruß Rolf Quote Link to comment Share on other sites More sharing options...
Imp Posted September 23, 2012 Report Share Posted September 23, 2012 Und dann noch eine eigene Taste pro Reiter und das Touchpanel kann wieder in den Schrank! Wenn das Menü so bleibt, haste recht. Aber ich denke da kommt noch Einiges, was sich dann eben nicht mehr mit einer Reihe Tastern bedienen lässt. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted September 23, 2012 Author Report Share Posted September 23, 2012 (edited) Hallo Habe Heute das Menü für den Audio-Filter im Synthesizer entwickelt (siehe Bild). Die Fader sind groß genug und lassen sich auch leicht mit einem Finger bedienen. Leichter und feinfühliger gehts natürlich auch mit einem Tabstift. Ich benutze zum Beispiel einen alten Kugelschreiber mit einer Kunststoffspitze. Funktioniert damit prima und hat nix gekostet. Bild: VCF1-Menü auf dem Touch Panel des AVR-Synthis Gruß Rolf Nachtrag: Durch die Anregung von Imp und Wolfgang aus dem CC2-Forum (alias Wiesolator), habe ich mich dazu entschieden, für die Parameter-Eingaben zusätzlich einen Drehencoder mit Rast- und Tasterfunktion zu verwenden. Damit werden die Parametereingaben noch leichter und komfortabler. Edited December 31, 2012 by rolfdegen 1 Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 4, 2012 Author Report Share Posted October 4, 2012 (edited) Hallo Es ist ein schöner sonniger Montag in Wuppertal und das hebt mal wieder die Laune und den Tatendrang in mir und für mein Projekt. Wie man auf den Bilder erkennen kann, arbeite ich gerade an den Menüfunktionen des AVR-Synthis. In der Tabreiterauswahl ist das "Main"-Menü hinzugekommen (Bild 1). Es vereinfacht die Navigation zu den vielen Menü-Seiten. Bild 1: Main-Menü Ferner gibt es auf jeder Menüseite einen sogenannten "Home"-Button (Bild 2: Kreis mit Kreuz Symbol unten Rechts), mit dem man schnell wieder ins Main-Menü gelangt. Die geänderten Parameter werden vor dem Schließen der Menüseite automatisch im EEPROM des ATxmegas abgespeichert. Bild 2: DCO1-Menü Im DCO1-Menü gibt es zur Zeit die Auswahl der Wellenformen und die Möglichkeit, mit dem "Detune"-Fader die Frequenz des Oszilators1 zu Oszilator2 ein wenig nach oben zu verstimmen um Schwebungseffekte zu erzeugen. Eine Frage stellt sich jetzt noch in Bezug auf die max. Höhe der Detune-Werte. Da tappe ich als "Anti-Musikus" etwas im Dunklen. Um einen Schwebungseffekt zu erzielen, reicht ja schon eine minimale Frequenzabweichung von weniger als 0,01 Hz. Meine Frage ist nun, wie groß dieser Wert maximal sein sollte. In einem Youtube-Video habe ich das ganze mal veranschaulicht (siehe Video-Link). Die Grundfrequenz beider Oszilatoren liegt bei 200Hz. Youtube-Video: Detune-Funktion im AVR-Synthi Am Ende des Videos demonstriere ich die Filterfunktion mit den neuen SSM2044 Filterbausteinen. Gruß Rolf Edited December 31, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 4, 2012 Author Report Share Posted October 4, 2012 (edited) Hallo zusammen Ich habe Probleme mit Phasen-Jitter in meinem Synthi-Projekt. Der Phasen-Jitter entsteht, wenn der Wert des Phasenaccus mit dem Wert für die Schrittweite nicht gerade teilbar ist. In meinem Fall beträgt der Jitterwert max 25µsec = 40KHz und das ist genau die Sample-Frequenz für die Tonausgabe (siehe Bild 1+2). Wenn ich für die Schrittweite eine Wert nehme, mit dem der Phasenaccu (24Bit) gerade teilbar ist, sind keine Störungen warnehmbar und auf dem Oszilloskop ist eine saubere Saw-Wellenform zu sehen (Bild 3+4). Phasenaccu 24Bit Schrittweite 24Bit Samplerate 25usec (40KHz) Gemessen am LP-Filterausgang Bild 1: SAW-Wellenform ca. 2031Hz mit Phasen-Jitter (max. 25usec / Div. 100µsec) Bild 2: SAW-Wellenform ca. 2031Hz mit Phasen-Jitter (max. 25usec / Div. 2msec) Bild 3: Saw-Wellenform ca. 2038Hz ohne Phasen-Jitter (Div. 100µsec) Bild 4: Saw-Wellenform ca. 2038Hz ohne Phasen-Jitter (Div. 2msec) Das Problem lässt sich nach meiner Meinung nur durch ein Zurücksetzen des Phasenaccus auf 0 beheben, wenn die Wellenform neu beginnt . Dadurch wird der Phasenaccu mit der Wellenformerzeugung synchronisiert und es ensteht kein Jitter mehr. Allerdings ist dann keine genau Frequenzeinstellung mehr möglich. Versuche mit Erhöhung der Bitbreite des Phasenaccus waren nicht erfolgreich. Der Phasen-Jitter reduzierte sich dadurch nicht.. Zur Information habe ich noch eine Infoseite gefunden, die das Phasen-Jitter Problem bei der DDS Synthese sehr anschaulich beschreibt: http://www.elektronik-labor.de/AVR/DDSGenerator.htm Gruß Rolf Edited December 31, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 5, 2012 Author Report Share Posted October 5, 2012 Hallo Stundenlagens Grübeln und die Notizen beim Schalfen unters Kopfkissen haben leider nicht geholfen Ich finde einfach keinen Lösungsansatz für mein Jitter-Problem. Würde man die Soundausgabe über einen Timer steuern, könnte man die DDS-Problematik vielleicht vergessen. Einen Lösungsweg wie es Olivier Gillet bei seinem Shruthi-Synth macht (Soundausgabe über PWM und ext. VCF+VCA) will ich nicht nachbauen. Ich möchte mein eigenes Hardware Konzept beibehalten. Link Shruthi Synth: http://mutable-instruments.net/shruthi1 Quote Link to comment Share on other sites More sharing options...
Imp Posted October 5, 2012 Report Share Posted October 5, 2012 Zum Detune: für eine Schwebung reichen 50 cents eigentlich aus, bei mehr wirds schräg. Ich würde aber zusätzlich eine gröbere Verstimmung ermöglichen, zb. in Halbtonschritten. Zum Jitter: Hört man das? Und wenn ja, ist es unangenehm? Wenn es nur eine rein technische Imperfektion ist, würde ich es ignorieren. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 5, 2012 Author Report Share Posted October 5, 2012 (edited) Hallo Imp Die Zwischentöne, die der Phasen-Jitter verursacht, kann man sehr deutlich ab einer Frequenz von 1KHz warnehmen. Hier ein Soundbeispiel mit einer SAW-Wellenform. Start 100Hz, Ende 5000Hz: In Bezug auf die Detune-Funktion werde ich im DCO-Menü einen Auswahl-Button "Low-Detune" und "High-Detune" für die Einstellung mit dem Bargraph integrieren. Gruß Rolf Edited October 5, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 5, 2012 Author Report Share Posted October 5, 2012 (edited) Hallo Ich habe hier einmal den relevanten Programmteil der für die Erzeugung der Sinus und Saw-Wellenform verantwortlich ist dargestellt. Die gesammte Sound-Routine (hier nicht abgebildet) wird in einem Timer-Interrupt alle 25µsec im Main-Programm (C-Code) aufgerufen. Wellenformspeicher für Sinus (4096 Werte 12Bit) 12Bit DAC-Wandlung im Xmega-Prozessor 1MHz-Wandlerate //=============================================================== // SUBTRAKTIVE KLANGSYSYNTHESE //=============================================================== SubSynthese: //--------------------------------------------------------------- // DCO-1 // * 24-Bit Akku-Breite // * 24-Bit Phasen-Delta (2,384185mHz/Unit) // * 12-Bit Sample // ( 38 Takte = 1,188 µsec) //--------------------------------------------------------------- // Phasen-Akku 1 incrementieren // ---------------------------- DCO1Calc: LDS delta0, schrittweite1+0 ; 2 Phasen-Delta aus SRAM laden LDS delta1, schrittweite1+1 ; 2 LDS delta2, schrittweite1+2 ; 2 LDS phakku0, phaccu1+0 ; 2 Phasen-Akku aus SRAM laden LDS phakku1, phaccu1+1 ; 2 LDS phakku2, phaccu1+2 ; 2 SUB phakku0, delta0 ; 1 Phasen-Akku + Phasen-Delta SBC phakku1, delta1 ; 1 SBC phakku2, delta2 ; 1 STS phaccu1+0, phakku0 ; 2 Phasen-Akku in SRAM zurückschreiben STS phaccu1+1, phakku1 ; 2 STS phaccu1+2, phakku2 ; 2 // Die oberen 12Bit des Phasen-Akkus extrahieren // --------------------------------------------- ANDI phakku1, 0xF0 ; 1 Lower Nibble in Byte 0 abnullen LSR phakku2 ; 1 Division durch 8 (16-Bit) ROR phakku1 ; 1 LSR phakku2 ; 1 ROR phakku1 ; 1 LSR phakku2 ; 1 ROR phakku1 ; 1 // Waveform-Selektion // ------------------ LDS dcowave, DcoWaveForm ; 2 Wellenform-Selektion laden SBRS dcowave, 0 ; 1/2 RJMP DCO1Sine ; 2 Sinus bestimmen // Saw über 1:1 Phase ausgeben // --------------------------- DCO1Saw: LSR phakku2 ; 1 Phasen-Akku / 2 ROR phakku1 ; 1 MOV dcomix0, phakku1 ; 1 Phase umladen MOV dcomix1, phakku2 ; 1 RJMP DCO1End ; 2 Fertig // Sample über aktive Phase aus Wavetable laden // -------------------------------------------- DCO1Sine: LDI R30, 0xFC ; 1 Basis-Adresse Sinus-Tabelle (Low-Byte) LDI R31, 0x03 ; 1 (High-Byte) ADD R30, phakku1 ; 1 Phasen-Pointer addieren ADC R31, phakku2 ; 1 LPM dcomix0, Z+ ; 3 Sample aus Wavetable laden (16-Bit) LPM dcomix1, Z ; 3 => in MixerSumme als Initialwert DCO1End: Gruß Rolf Edited October 5, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 5, 2012 Author Report Share Posted October 5, 2012 Hallo Ich habe einen guten Tip von Maik aus dem mikrocontroller.net Forum bekommen. Er meint: Den Jitter kann man vermeiden durch Reduzierung der Akkumulator-Breite (nicht beim Akkumulieren, sondern beim Ausgeben der Saw, bzw. beim Adressieren des Wavetables) ab bestimmten Frequenzen. Also im Prinzip kann man es so machen, dass man zB. ab 500Hz immer das LSB nullt, ab 1000Hz nullt man dann das LSB und das nächst höhere, usw. Diese Grenz-Frequenzen kann man anhand des Phasen-Deltas setzen. Diese Methode ist im Prinzip immer ein Abrunden, was dazu führt, das der geringfügige Jitter wegbleibt, weil er weggerundet wird. Das hat aber auch Nachteile: 1. Man verliert bei höheren Frequenzen die Auflösung 2. Höhere Frequenzen werden leiser 3. Man erzeugt automatisch ein DC-Offset, was man berücksichtigen sollte, oder besser noch, gleich im Oscillator kompensiert. Den Tip von Maik werde ich gleich Morgen versuchen umzusetzen. Werde dann hier berichten. Bin gespannt.. Gruß Rolf Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 7, 2012 Author Report Share Posted October 7, 2012 (edited) Hallo Hat leider nicht funktioniert. Der Phasen-Jitter bleibt unverändert. Aber vielleicht mach ich was falsch ??? Meinen Programmcode habe ich wegen der Übersicht etwas vereinfacht. Die markierte Zeile "ANDI phakku1,0b11111110" soll das Phasen-Jitter eliminieren indem sie das LSB im Low-Byte der Tabellenadresse löscht. Leider ohne Erfolg. Ich habe es auch mit kleineren Werten versucht, aber ohne Erfolg. Es ändert sich nur die Auflösung des Samples. Der Phasen-Jitter von +- 25µsec bleibt bestehen (siehe Pics). //************************************************************** // ATMEL Studio 6 Inline Assembler-Routine // Soudausgabe auf DACA Chanal 0 // TimeR1 Interruptroutine: alle 25usec = 40.0 KHz Samplerate // // (Laufzeit: ?,??? µsec = ??? Takte bei 32MHz) // // // (c) 06.10.2012 Version 1.0 //************************************************************** #include "avr/io.h" .extern sound_out // Name der Assembler-Funktion .global TCC1_OVF_vect // Timer1 Interrupt-Vektor //--------------------------------------------------------------- // Benutzte Prozessor-Register (Definition als Namen) //--------------------------------------------------------------- dcoout0 = 16 ; R16 DCO-Out Byte 0 dcoout1 = 17 ; R17 Byte 1 phakku0 = 18 ; R18 Phasen-Akku Byte 0 phakku1 = 19 ; R19 Byte 1 phakku2 = 20 ; R20 Byte 2 delta0 = 21 ; R21 Phasen-Delta Byte 0 delta1 = 22 ; R22 Byte 1 delta2 = 23 ; R23 Byte 2 //--------------------------------------------------------------- // Prozessor-Register inkl. Status-Register sichern // Interrupt-Routine Timer1-Overflow (40.000Hz) //--------------------------------------------------------------- TCC1_OVF_vect: PUSH R0 ; 2 R0 auf Stack schieben IN R0, SREG ; 1 Status-Register über bereits gesichertes PUSH R0 ; 2 R0 auf Stack schieben PUSH R1 ; 2 R1 auf Stack schieben PUSH R16 ; 2 R16 auf Stack schieben PUSH R17 ; 2 R17 auf Stack schieben PUSH R18 ; 2 R18 auf Stack schieben PUSH R19 ; 2 R19 auf Stack schieben PUSH R20 ; 2 R20 auf Stack schieben PUSH R21 ; 2 R21 auf Stack schieben PUSH R22 ; 2 R22 auf Stack schieben PUSH R23 ; 2 R23 auf Stack schieben PUSH R30 ; 2 R30 auf Stack schieben (ZL) PUSH R31 ; 2 R31 auf Stack schieben (ZH) //=============================================================== // SUBTRAKTIVE KLANGSYSYNTHESE //=============================================================== SubSynthese: //--------------------------------------------------------------- // DCO-1 // * 24-Bit Akku-Breite // * 24-Bit Phasen-Delta (2,384185mHz/Unit) // * 12-Bit Sample //--------------------------------------------------------------- // Phasen-Akku 1 incrementieren // ---------------------------- LDS delta0, schrittweite1+0 ; 2 Phasen-Delta aus SRAM laden LDS delta1, schrittweite1+1 ; 2 LDS delta2, schrittweite1+2 ; 2 LDS phakku0, phaccu1+0 ; 2 Phasen-Akku aus SRAM laden LDS phakku1, phaccu1+1 ; 2 LDS phakku2, phaccu1+2 ; 2 ADD phakku0, delta0 ; 1 Phasen-Akku + Phasen-Delta ADC phakku1, delta1 ; 1 ADC phakku2, delta2 ; 1 STS phaccu1+0, phakku0 ; 2 Phasen-Akku in SRAM zurückschreiben STS phaccu1+1, phakku1 ; 2 STS phaccu1+2, phakku2 ; 2 // Die oberen 12Bit des Phasen-Akkus extrahieren // --------------------------------------------- ANDI phakku1, 0xF0 ; 1 Lower Nibble in Byte 0 abnullen LSR phakku2 ; 1 Division durch 8 (16-Bit) ROR phakku1 ; 1 LSR phakku2 ; 1 ROR phakku1 ; 1 LSR phakku2 ; 1 ROR phakku1 ; 1 // SAW-Sample über aktive Phase aus Wavetable laden // ------------------------------------------------- LDI R30, 0xFC ; 1 Basis-Adresse Saw-Tabelle (Low-Byte) LDI R31, 0x03 ; 1 (High-Byte) //******************************************************************************** ANDI phakku1,0b11111110 ; Phasen-Jitter eliminieren //******************************************************************************** ADD R30, phakku1 ; 1 Phasen-Pointer addieren ADC R31, phakku2 ; 1 LPM dcoout0, Z+ ; 3 Sample aus Wavetable laden (12-Bit) LPM dcoout1, Z ; 3 // -------------------------------------------------------------- // Ausgabe am DAC-Converter (DACA Chanal 0) // -------------------------------------------------------------- STS 0x0318, dcoout0 ; 2 L-Byte to DAC-Register (CH0DATAL Adr. 0x0318) STS 0x0319, dcoout1 ; 2 H-Byte to DAC Register (CH0DATAH Adr. 0x0319) // -------------------------------------------------------------- // Prozessor-Register inkl. Status-Register wiederherstellen // -------------------------------------------------------------- POP R31 ; 2 R31 von Stack wiederherstellen (ZH) POP R30 ; 2 R30 von Stack wiederherstellen (ZL) POP R23 ; 2 R23 von Stack wiederherstellen POP R22 ; 2 R22 von Stack wiederherstellen POP R21 ; 2 R21 von Stack wiederherstellen POP R20 ; 2 R20 von Stack wiederherstellen POP R19 ; 2 R19 von Stack wiederherstellen POP R18 ; 2 R18 von Stack wiederherstellen POP R17 ; 2 R17 von Stack wiederherstellen POP R16 ; 2 R16 von Stack wiederherstellen POP R1 ; 2 R1 von Stack wiederherstellen POP R0 ; 2 Status-Register über R0 wieder OUT SREG, R0 ; 1 herstellen POP R0 ; 2 R0 von Stack wiederherstellen RETI ; 4 Return Interrupt und I-Flag quittieren // -------------------------------------------------------------- .end // Bild 1: Saw Frequenz 1KHz mit voller 12Bit Auflösung ANDI phakku1,0b11111111 ANDI phakku2,0b11111111 Bild 2: Saw Frequenz 1KHz mit 5Bit Auflösung ANDI phakku1,0b10000000 ANDI phakku2,0b11111111 Bild 3: Saw Frequenz 1KHz mit 3Bit Auflösung ANDI phakku1,0b00000000 ANDI phakku2,0b11111100 Mein Fazit: Das Jitter von 25µsec (Taktzyklus für den Zähler des Phasenaccus) werde ich prinzipiell nicht los. Beim Sinus ist das auch kein großes Problem. Dieser wird sauber und störungsfrei wiedergegeben . Aber für die anderen Wellenformen wzB. Sägezahn, Puls oder Rechteck ist die Softwaregenerierte DDS-Synthese bei einer Taktrate von 25µsec nicht zu gebrauchen. Muss mir also was anderes überlegen. Gruß Rolf Edited December 31, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
nILS Posted October 8, 2012 Report Share Posted October 8, 2012 Einfache, wenn auch kostenintensive Variante: Oversampling des Oszillators. Macht bei einem Rechteck schon ab 3x drastisch hörbare Unterschiede. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 9, 2012 Author Report Share Posted October 9, 2012 (edited) Hallo Ich hab bei Oliver Gillert, dem Entwickler des genialen Shruthi Synth, mal nachgefragt, wie er das so mit der Sounderzeugung im Shruthi macht und eine Antwort erhalten die ich hier mit Hilfe von Google übersetzt habe."Für die klassischer analoger Wellenformen auf dem Shruthi (Saw, Rechteck, Dreieck), verwende ich bandbegrenzten Wavetables . Die Wavetables werden durch integrierte bandbegrenzte Impulse (sinc-Funktionen) für verschiedene f0 / fs-Verhältnis Abstand mit 2 ** (16 / 12,0) Verhältnisse. Als Ergebnis gibt es ein Wavetable für jede Gruppe von 16 Noten. Um zu vermeiden, grobe Übergänge I Interpolieren zwischen jeder Wavetable. Für die höheren Töne, die Wellenform nähert sich einer sinusförmigen - von der erwartet wird, weil einer quadratischen Welle bei 8 kHz auf 44 kHz abgetastet ist in der Tat eine Sinuswelle (die dritte Oberwelle bei 24kHz oberhalb Nyquist-Frequenz). Hier ist eine Kurve der Wellenformen aus der Shruthi bei unterschiedlichen Frequenzen (50, 125, 320, 800, 2k, 5k, 12k):http://i.imgur.com/nZmMx.png Die quadratischen und Sägezahnwellen gefärbt sind - ich denke, diese Wellenformen sind viel interessanter als die "reinen" Sägezahn und "pure" eckig Welle. Die PWM-Wellenform wird durch Summieren von zwei bandbegrenzten Sägezahn erhalten mit einer Phasendifferenz - die Phasendifferenz steuert die PWM-Verhältnis. Ich habe versucht mit minBLEP und es verwendet, 70% der CPU. Auf der Shruthi-1 ist war keine Option, aber in Ihrem Projekt, das Sie mit einem XMega bei 32 MHz, so dass es machbar sein, um minBLEP verwenden. Ich würde empfehlen, diese Option wählen, da es klingt sehr gut und kann tun hardsync! minBLEP nicht tun können Dreiecke, aber Sie können bandbegrenzte Wavetables für diese Verwendung. Die Shruthi-1-Code ist Open Source und finden Sie Antworten auf Ihre zu finden Fragen Sie sich den Code:https://github.com/pichenettes/shruthi-1/" Ich werde mich jetzt mal schlau machen, was das "minBLEP" ist. Vielleicht bekomme ich dadurch eine Idee um mein Sound-Problem zu lösen. Ich wollte mal wissen wie sich so ein Square-Sound mit Bandbegrenzung (eng. band-limited square) auf meinem Synthi so anhört und habe mir die Mühe gemacht zwei Hörbeispiele aufzunehmen. Die Aufnahmen wurden am LowPass-Filterausgang bei offenem Filter gemacht. Die 8Bit Square-Sounds werden aus einer 256 Byte großen Waveform-Tabelle mit 40KHz Sampling-Frequenz an den DAC Ausgang gesendet. Bild 1: 1KHz Square-Sound 8Bit (Rechteck) ohne Bandbegrenzung auf dem AVR-Synthi Link soundcloud.com:Listen on Soundcloud.com Bild 2: 1KHz Square-Sound (aus dem Shruthi-Synth gestohlen ) mit Bandbegrenzung auf dem AVR-Synthi. Link soundcloud.com:Listen on Soundcloud.com Wie man hört, ist der Square-Sound mit Bandbegrenzung viel sauberer und ohne Nebengeräusche. Mal schaun wie ich als "Nicht Studierter" so einen minBlep-Oszillator auf meinen Xmega implementieren kann. Gruß Rolf Edited December 31, 2012 by rolfdegen Quote Link to comment Share on other sites More sharing options...
nILS Posted October 9, 2012 Report Share Posted October 9, 2012 Im Zweifelsfall gibt's hier noch ein paar schöne Erklärungen: http://www.kvraudio.com/forum/viewtopic.php?t=263028&postdays=0&postorder=asc&start=0&sid=3eeac552377d97776a4cd2335cc73549 :flowers: Die Sache mit den Wavetables funktioniert fein, so lange man statische Wellenformen hat. Bei so ulkigen Sachen wie PWM wird's dann ein wenig ätzend. Für PWM ist ein anderer recht simpler Ansatz nur sehr kleine Wavetables für den Übergang von Low zu High zu haben, für verschiedene Frequenzen (mit entsprechender Anzahl von Obertönen), immer wenn eine Flanke kommt einfach statt 1 oder 0 den Übergang abfahren (vorwärts oder rückwärts, je nach Übergang). Damit ist die Phase natürlich leicht verzögert aber 16-32 Samples früher oder später ist in den meisten Fällen eher egal. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 11, 2012 Author Report Share Posted October 11, 2012 Hallo Ich habe mich dazu entschieden, fertige Bandbegrenzte Wavefiles zu benutzen und diese in den Flash-Speicher des Xmegas zu schreiben. Dadurch spar ich mir das ganze Rumrechnen mit Sinus und Cosinus und haste nicht gesehen zur Laufzeit. Die Bandbegrenzten Wavefiles liegen mir als bin.Datei vor und ich möchte diese als ext. Datei in meinen Quellcode mit einbinden. Leider weis ich nicht wie das in Atmel Studio funktioniert. Ich habe mir ersteinmal damit geholfen, das ich die Wave-Datei über einen Hexeditor als Hexadezimal-Tabelle exportiere und in meinen C-Quellcode kopiere. Das funktioniert problemlos. Dadurch wird aber der Quellcode sehr lang und unübersichtlich. Ein Tip wär nicht schlecht. Danke euch. Gruß Rolf Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted October 14, 2012 Author Report Share Posted October 14, 2012 Hallo Bezüglich der Wave-Files habe von Humfrey aus dem CC2-Forum einen guten Vorschlag erhalten. Die Deklaration der Wave-Daten als Hexadezimal Werte in eine extra Quelltext-Datei schreiben und diese dann per #include in den normalen C-Quelltext mit einbinden. Funktioniert bestens. Gruß Rolf Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.