rolfdegen Posted May 3, 2013 Author Report Share Posted May 3, 2013 Hallo Die Formel für den Filtersteuerwert war nicht ganz korrekt. Der Fehler lag in der einfachen Addition von cutoff und amount am Ende der Formel. Das führte dazu, das in der Sustain-Phase der Filter mehr geöffnet war (siehe Bild 1). Neue Formel. Ich hoffe das es dieses mal stimmt uint16_t cutoff; uint16_t amount; cutoff = ((adsr2_out >>8)*(cutoff_value1 *2)>>8); amount = ((adsr2_out >>8)*(amount_value1*4)>>8); CV_VCF_Cha1 = cutoff+(((adsr2_out>>8)*amount) >>8); CV_VCF_Cha2 = cutoff+(((adsr2_out>>8)*amount) >>8); Bild 1: Filter-Hüllkurve (oben neue Formel, unten alte Formel) Bild 2: Filter-Hüllkurve gezoomt Bild 3-5: Filter-Einstellungen Gruß Rolf Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted May 4, 2013 Author Report Share Posted May 4, 2013 (edited) Hallo und guten Abend zusammen... Je später der Abend um so interessanter die Beiträge, hoffe ich zumindest Ich habe noch ein wenig an den Einstellungen für die Filtersteuerung im AVR-Synth programmiert. Folgende Filterfunktion stehen zur Zeit zur Verfühgung: ADSR, Cutoff, Resonanz und Env Amount. Keytracking "KTrack" ist zur Zeit noch nicht imlementiert. Die Veränderung des Resonanz-Parameter wird jetzt auch grafisch in der Filterkurve angezeigt. Besten dank an Wolfgang alias Wiesolator aus dem CC2-Frum für die Midi-Sequenz die mein Synth in dem Youtube-Video spielt.Youtube-Video: Filterfunktion im AVR-Synth Gruß Rolf Edited May 4, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted May 20, 2013 Author Report Share Posted May 20, 2013 (edited) Hallo Zur Zeit programmiere ich an neuen Grafik-Routinen für mein DOGXL160 Display. Für die Filterfunktion möchte ich ein kleines Oszilloskop programmieren, das die Wellenform des Audioausgangs vom Synth anzeigt. Somit sind die Wertänderungen von Cutoff und Resonanz nicht nur hörbar sonder auch sichtbar. Das Youtube-Video zeigt die Wellenform-Grafik noch in der alte und langsame Variante auf einem eDIP160W-7 Display an. Filterfunktion auf dem AVR-Synthesizer: Wer nähers über das DOGXL160 Display und seine Programmierung wissen will, der schaut bitte hier: http://www.mikrocontroller.net/topic/144500#new Gruß Rolf Edited May 22, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted May 26, 2013 Author Report Share Posted May 26, 2013 (edited) Hallo zusammen.. Meine Demo-Filmchen für den AVR-Synth hatte ich in der Vergangenheit immer mit meinem Nexus Smartphone aufgenommen und auf Youtube hochgeladen. Aber das Smartphone ist mir letzte Woche auf den Fliesenboden gefallen und in viele Einzelteile zersprungen. Reparatur zu teuer bzw unmöglich. Da ich im Moment etwas knapp bei Kasse bin, habe ich mir wieder ein kleines weißes Galaxy Ace Smartphone zugelegt. Das hatte ich mir vor zwei Jahren schon einmal gekauft und war recht begeistert. Gut.. kleine Abstriche muss man natürlich bei der Geschwindigkeit machen. Das Galaxy Ace hat nur einen 832MHz Prozessor mit einem CPU Kern, das Nexus einen DuoCore mit 1.2GHz. Aber leider macht die eingebaute Videocam im Galaxy Ace wegen ihrer geringen Auflösung von 640x480 Pixeln leider keine guten Aufnahmen. So hab ich mir als Alternative eine Logitech HD Webcam C525 gekauft und war überrascht, wie gut die Qualität einer Aufnahmen war. Im Vergleich zu meinem riesigen Smartphone passt die kleine neue Webcam viel besser auf mein kleines Stativ und kippt nicht immer um. Youtube-Video: Scope-Funktion im AVR-Synth Da ich gerade an einer Scope-Funktion für den AVR-Synth "bastle" habe ich mal schnell ein Video davon gemacht. Die Scope-Funktion bekommt später eine eigene Menü-Seite im AVR-Synth. Im Moment funktioniert sie sobald eine Taste auf dem Keyboard gedrückt wird. Meine Idee ist es, im Osc-Menü oben rechts ein kleines Mini-Fenster anzuordnen, in dem das Audiosignal vom Ausgang angezeigt wird. So kann man direkt sehen welchen Einfluss die ausgewählte Oszillator-Wellenform auf das Ausgangssignal hat. Gruß Rolf Edited May 26, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted May 27, 2013 Author Report Share Posted May 27, 2013 (edited) Hallo Ich habe Heute Morgen "mal eben auf die schnelle) eine Mini-Scope Funktion auf der Oscillator-Page implimentiert. Das ganze sieht jetzt so aus: Mini-Scope Funktion in AVR-Synthesizer "WAVE-1" Gruß Rolf Edited May 27, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 1, 2013 Author Report Share Posted June 1, 2013 (edited) Wellenform Darstellung auf LCD-Screen Hallo ihr Lieben Ich hoffe euch gehts gut. Ich habe die ganzen Feiertage genutzt um am Synth weiter zu programmieren. Zur Zeit arbeite ich noch an der Scope-Funktion vom Synth und habe ein kleines Problem was die Wellenform Darstellen auf dem LCD-Screen betrifft. Ich möchte auf der Scope-Page im AVR-Synth eine Funktion programmieren, die eine aufgenommenen Wellenform nicht als Wave sonder als Hüllkurve auf dem LCD-Screen darstellt. Scope-Funktionen wzB TimeBase und Trigger-Level funktionieren bereits prächtig. Die Trigger-Funktion konnte ich mit dem Analog Comparator im Xmega ohne zusätzlichen Portpin lösen. Im Xmega kann man dafür den zweiten-Eingang des Komparators auf die intern skalierbare Versorgungsspannung (VCC) legen. Um mein Darstellungsproblem etwas zu verdeutlichen, habe ich ein Video auf Youtube hochgeladen. Vielleicht habt ihr ja einen kleinen Tip für mich. Ich danke euch schon einmal im Voraus für die Hilfe. Gruß Rolf Edited June 1, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
TK. Posted June 1, 2013 Report Share Posted June 1, 2013 Ich lasse mich bei diesen Geschichten immer von Matlab inspirieren. Laut diesem Tutorial: http://www.mathworks.de/de/help/dsp/examples/envelope-detection.htmlist es ausreichend, die Waveform zu quadrieren, und dann durch einen FIR Filter zu schicken: Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 1, 2013 Author Report Share Posted June 1, 2013 Hallo Thorsten Danke für die Hilfe. Klingt wieder nach viel Mathematik. Leider nicht mein Lieblingsfach und für meinen kleinen 8Bitter vielleicht ein zu großes Hinderniss. Aber mal schaun ob ich es richtig verstehe.. Meine Wellenform besteht aus 151 8Bit Samples, die im Ram des Xmegas warten und auf den LCD-Screen wollen. Meine Rechnung wäre jetzt diese.. // Eingangssignal quadrieren sample1 * sample1 = q_sample1 und jetzt filter.. aber wie Quote Link to comment Share on other sites More sharing options...
TK. Posted June 1, 2013 Report Share Posted June 1, 2013 Tja, spaetestens jetzt wirst Du Dich darueber aergern, dass Du Dich mit einem 8-bitter herumschlagen musst. Ich habe auch lange gebraucht (> 2 Jahrzehnte), bis ich es leid war, die Limitations per Assembler zu umgehen (wenn das ueberhaupt noch moeglich war)... irgendwann ist man es leid, und wohin das fuehrt, sieht man in MIOS32. Wie dem auch sei: ein FIR Filter ist relativ einfach zu implementieren. Man muss ja nur addieren und multiplizieren. Der Knackpunkt sind die Koeffizienten, die jeweils passenden findet man per try&error... siehe auch: http://shulgadim.blogspot.de/2012/01/fir-filter-implementation.html Erfahrungsgemaess findet man sie sehr schnell, wenn man den Algorithmus auf einem PC emuliert, bevor man ihn auf dem Mikrocontroller ablaufen laesst. Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 3, 2013 Author Report Share Posted June 3, 2013 (edited) mmm.. Fließkommaberechungen. Das werde ich meinem Xmega nicht antun. Vielleicht werde ich das zu einem späteren Zeitpunkt mal anteste. Im Vordergrund steht ja die Entwicklung eines Synthesizers und kein eigenständiges AVR-Oszilloskop.Vielleicht kann man später daraus ein separates Projekt entwickeln. Ich habe noch etwas an der Scope-Funktion gearbeitet. Jetzt gibt es zusätzlich eine automatische Trigger-Funktion und ein Single sweep für einmalige Vorgänge (siehe Video). Gruß Rolf Edited June 3, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 9, 2013 Author Report Share Posted June 9, 2013 (edited) Hallo Hier das ganze LFO-Programm vom AVR-Synthi. Ich gebe zu, die Töne bzw Klänge sind nicht unbedingt jedermanns Geschmack Aber im Video sieht man hoffentlich die ganzen Modulationsmöglichkeiten. Es fehlt natürlich noch eine gute Modulationsmatrix, in der man die Modulationsquellen und deren Ziele flexibel verknüpfen kann. Das wird aber kommen.. Die Modulationsmatrix ersetzt quasi die typischen Patch-Kabel von einem Analogen Modul-Synthesizer. Im Moment sind die drei LFO's fest mit mit DCO, VCF und VCA verknüpft. So.. jetzt aber viel Spaß beim anhören.. PS: In der 2.Hälfte wird's richtig interessant :smile: Gruß Rolf Edited June 9, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 13, 2013 Author Report Share Posted June 13, 2013 Hallo ihr da.. Hab mal wieder etwas an meinem Synth gebastelt bzw programmiert und herausgekommen ist eine neue Menü-Seite für die Modulation-Matrix (Bild 1). Links kann man eine Modulations-Quelle zB LFO1 auswählen und Rechts sieht man dann die Modulations Ziele für LFO1 mit den eingestellten Depth-Werten. Da es sich beim "WAVE 1" um einen "Echten" Stereo Synthesizer handelt, gibt es für den linken und rechten Kanal getrennte Modulations-Ziele zB VCF1 und VCF2. Einige Modulations-Ziele wzB PAN, FM and Noisgenerator fehlen allerdings noch. Bild 1: Modulations-Matrix im AVR-Synthesizer Gruß Rolf Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 15, 2013 Author Report Share Posted June 15, 2013 (edited) Hallöchen.. Ich bin jetzt beim Thema "Digitale Signalverarbeitung" angelangt. In der Modulation Matrix werden die digitalen Signale von den LFO's und Enveloop Generatoren mit den Steuersignalen für VCF, VCA und dem Ausgangssignal der beiden DAC's verknüpft und berechnet. Bei einem 8Bitter , wzB dem Xmega128A1 in meinem Synthesizer, darf und kann man in Bezug auf die Digitale Signalverabeitung nichts großes erwarten. Die Berechnungen würden zu viel Prozessorresourcen in Anspruch nehmen und für die eigentliche Aufgaben würde keine Leistung mehr übrig sein. Fließkommaberechnungen oder Fast -Fourier-Analysen, wie sie in der Digitalen Signalverarbeitung oft vorkommen, sind nur mit leistungsstarken Prozessoren wzB Digitalen-Signal-Prozessoren (DSP) in Echzeit realisierbar. Ein XMega hat dafür andere Vorzüge wzB eine Vielzahl von Peripherie-Bausteinen: 12Bit AD/DA-Wandler, Timer und eine Menge IO-Ports. Aber zum Thema "Digitale Signalverarbeitung". Im AVR-Synth werden weder Fließkommaberechnungen noch Filterberechnungen durchgeführt. In den Meisten Fällen reichen einfache 8Bit und 16Bit Multiplikationen, Divisionen oder Additionen aus, um eine Signalberechnung durchzuführen. Ein kleines Beispiel in C um die Lautstärke (Volume) eines digitalen Audiosignals (Input) von 0-100 zu ändern: Output = Input * Volume / 100 Das gleiche Beispiel in Assembler nur mit einer Änderung für eine schnellere Binär-Rechnung. Die Lautstärke hat einen Wert von 0-127 anstatt 0-100. Das Beispiel stammt aus meinem AVR-Synth. Die Einstellung erfolgt mit einem Drehgeber (Encoder) von 0-127. // Register Definition Volume = 18 ; R20 Volume Input = 19 ; R19 Input Output0 = 20 ; R20 Output Low-Byte Output1 = 21 ; R21 Output High-Byte // Berechnung MUL Input, Volume ; Input * Volume MOVW Output0, R0 ; Multiplikationsergebnis nach Output0+1 LSR Output1 ; div 127 ROR Output0 LSR Output1 ROR Output0 LSR Output1 ROR Output0 LSR Output1 ROR Output0 LSR Output1 ROR Output0 LSR Output1 ROR Output0 LSR Output1 ROR Output0 ; Ergebnis in Output0 Die Division durch 127 könnte man noch beschleunigen wie im folgenden Beispiel Für eine Panorama-Funktion im AVR-Synth habe ich das folgende Programm entwickelt. Dabei wird ein geregelter Anteil (PanMix) von KanalA zu KanalB gemischt und umgekehrt. Hörbarer Effekt ist eine sich verkleinernde Stereo-Breite bis hin zu einem monophonem Klangbild (siehe Demosound). //----------------------------------------------------------------------- // PanMix ChanalB temp0_chanalB = 21 ; temp-register for ChanalB temp1_chanalB = 22 MOV temp0_chanalB, chanalB_0 ; save ChanalB in temp-register MOV temp1_chanalB, chanalB_1 ; // Mul: chanalA * pan_mix LDS R18, pan_mix MOV R19, chanalA_0 MUL R18, R19 MOVW R18, R0 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // ChanalB + ChanalA ADD chanalB_0, R18 ADC chanalB_1, chanalA_1 //----------------------------------------------------------------------- // PanMix ChanalA // Mul: chanalB * pan_mix LDS R18, pan_mix MOV R19, temp0_chanalB MUL R18, R19 MOVW R18, R0 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // ChanalA + ChanalB ADD chanalA_0, R18 ADC chanalA_1, temp1_chanalB //----------------------------------------------------------------------- // Chanal Output // convert ChanalA to 12Bit LSL chanalA_0 ROL chanalA_1 LSL chanalA_0 ROL chanalA_1 LSL chanalA_0 ROL chanalA_1 // convert ChanalB to 12Bit LSL chanalB_0 ROL chanalB_1 LSL chanalB_0 ROL chanalB_1 LSL chanalB_0 ROL chanalB_1 // send chanalA value to DACA STS 0x0338, chanalA_0 ; 2 L-Byte to DAC-Register DACAL STS 0x0339, chanalA_1 ; 2 H-Byte to DAC Register DACAH // send chanalB value to DACB STS 0x0318, chanalB_0 ; 2 L-Byte to DAC-Register DACBL STS 0x0319, chanalB_1 ; 2 H-Byte to DAC Register DACBH PanMix Demosoud http://soundcloud.com/rolfdegen/avr-synth-panmix Hier noch ein anderer Demosound in dem der PanMix noch etwas deutlicher zu hören ist. http://soundcloud.com/rolfdegen/panmix-02 Gruß Rolf Edited June 15, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 23, 2013 Author Report Share Posted June 23, 2013 (edited) Hallo Hab ein wenig mit Cubase LE6 und den Einstellungen an meinem AVR-Synthesizer rumgespielt. Die Sequenz stammt ursprünglich von Wolfgang. Durch Zufall und wie das eigentlich immer so ist, sind die Noten etwas verrutscht und es ist etwas neues daraus entstanden. Hier das Original von Wolfgang und seinem Shruthi-Synthesizer. Zusätlich ist noch ein Effektgerät nachgeschaltet. http://www.wiesolator.de/data/topics/Musik/Musik-Equipment/_downloads/Shruti-Box.mp3 Und hier meine Version mit dem AVR-Synth ohne Effektgerät. Der Stereosound kommt direkt aus dem Synthesizer.http://soundcloud.com/rolfdegen/avr-synthesizer-melody-1 http://soundcloud.com/rolfdegen/avr-synthesizer-demosounds Viel Spass beim anhören Gruß Rolf Edited June 24, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 24, 2013 Author Report Share Posted June 24, 2013 (edited) Hier noch eine kleine Kostprobe :no: http://soundcloud.com/rolfdegen/avr-synthesizer-demosounds Edited June 24, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted June 28, 2013 Author Report Share Posted June 28, 2013 Hallo Im CC2-Forum wird gerade über das Thema "Modulation" in meinem AVR-Synthesizer diskutiert. Wenn Interesse besteht hier der Link: http://www.cczwei-forum.de/cc2/thread.php?postid=82444#post82444 Gruß Rolf Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 15, 2013 Author Report Share Posted July 15, 2013 Einen wunderschönen, sonnigen und guten Montag Morgen wünsch ich Euch allen Hier ein paar Bildchen von meinem Synth-Gehäuse. Bin gerade dabei das Frontpanel für die Frontplatte zu löten. Aber sieht schon nicht schlecht aus find ich.. AVR-Synthesizer Gehäuse Gruß Rolf Quote Link to comment Share on other sites More sharing options...
Nasrudin Posted July 16, 2013 Report Share Posted July 16, 2013 Wo gibts denn dieses schicke Gehäuse zu kaufen? Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 17, 2013 Author Report Share Posted July 17, 2013 (edited) Hallo Nasrudin Das Gehäuse ist von der Firma Bobla und kostet bei Reichelt ca. 36,- € (Größe: 181x68x200). Das gibts es auch in anderen Größen. Mal schaun wer mir jetzt den speziellen Gehäusedeckel fräsen kann. Da das GLCD-Displays mit LED-Hintergrundbeleuchtung (EA DOGXL160-7) eine Gesammthöhe von nur 6.4mm hat und die anderen Bauteile noch kleiner sind, kann die Platine später einfach unter den Gehäusedeckel geschraubt werden (siehe Zeichnung). Link Gehäuse: http://www.reichelt.de/Bopla-Ecoline-Alubos-Topline-Gehaeuse/ATPH-1865-200/3/index.html?;ACTION=3;LA=446;ARTICLE=126237;GROUPID=5194;artnr=ATPH+1865-200 Link Pultgehäuse: http://www.tme.eu/de/katalog/pultgehause_100626/ Gruß Rolf Edited July 17, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
Nasrudin Posted July 18, 2013 Report Share Posted July 18, 2013 (edited) Danke für die Infos! Wenns etwas kosten darf: Schaeffer (www.schaeffer-ag.de) fertigt dir als Endkunde auch Einzelstücke. Den Preis kannst du dem hauseigenen Programm entnehmen, sobald du deine Zeichnung übertragen hast. Ist nicht unbedingt ein Schnäppchen, das Ergebnis ist seinen Preis meiner Meinung aber wert. EDIT: Habe eben erst enddeckt, dass die Frontplatte und Profile aus einem Stück sind - Wirklich unpraktisch. Die Firma Lochmeyer (http://www.lochmeyer.de) nimmt auch Material zur Bearbeitung entgegen. Direkt als Endkunde kannst du dort aber nicht bestellen, das müsste du über eine Firma "geschickt einrichten". Alternativ könntest du die Frontplatte / Rückenblende bis auf einen Rand oben und unten (den mittleren Teil mit einer Tischkreissäge herausschneiden) zur Verschraubung aushöhlen . In die vorgesehene Vertiefung für Folientastaturen könntest du dann deine individuelle Frontplatte (1,5 mm Dicke für einen sauberen Übergang) einlegen und mit den belassenen Rändern verschrauben. Letzterer Ansatz wäre mit wenig zusätzlichem Aufwand zu bewerkstelligen und würde dennoch zu einem professionell wirkendem Ergebnis führen. Beigefügtes Beispiel würde ca 50 Euro kosten, Ohne Farbauslegung der Gravuren wirds günstiger. Gruß Nasrudin Edited July 18, 2013 by Nasrudin Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 19, 2013 Author Report Share Posted July 19, 2013 (edited) Hallo Nasrudin Danke für deine guten Tips. Ich denke das dein Vorschlag mit einer 2.Frontplatte der beste und kostengünstigste Weg ist, zumal das Ganze auch noch beschriftet werden soll. Die Befestigung des Bedienpanels unter der Frontplatte muß ich dann aber ändern. Sonst ist der Abstand von Display zur Frontplatte zu groß und die Encoder-Knöpfe haben keinen Abstand mehr zur Frontplatte (sie Zeichnung). Näher betrachtet sieht das Ganze dann so aus: (vielen Dank an Wolfgang für die Zeichnung) Gruß Rolf Edited July 19, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 23, 2013 Author Report Share Posted July 23, 2013 (edited) Hallöchen.. In Bezug auf eine Anfrage bei der Firma Schaefer AG, ob es möglich sei, meine Frontplatte von dem BOPLA Gehäuse zu fräsen, teilte mir die Firma mit, das sie schon öfters solche Gehäuse bearbeitet hat. Aktuelles Frontplatten Designe vom Synthesizer Gruß Rolf Edited July 23, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 24, 2013 Author Report Share Posted July 24, 2013 (edited) Hallo again.. ich schon wieder Damit man einen kleinen Eindruck gewinnt, wie der Synthesizer später einmal aussehen wird, hab ich mal eine Fotomontage gemacht. Ist mir nicht so gut gelungen, bin aber auch kein "gut bezahlter" Grafiker Bild: Synthesizer "WAVE 1" Anmerkung: Auf dem Display ist das Wort "Oktave" noch in Deutsch geschrieben. Ist in der neuen Software Version aber schon berichtigt. Dat is aber och ne Problem mit dem Denglisch in unserer Sprache Das LED-Backlight fürs DOG-Display gibts auch in anderen Farben zB. grün-gelb, amber, weiß (verwende ich) oder RGB. Gruß Rolf Edited July 24, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted July 29, 2013 Author Report Share Posted July 29, 2013 (edited) Hallo Für den Xmega-Prozessor in meinem Synthesizer plane ich noch eine Speichererweiterung von 512KByte SRAM. Das SRAM gibt es als Breakout Board auf eBay schon ab 7,99 US $. Dann hätte ich die Möglichkeit, beim Systemstart die Soundparameter und großen Wellenform Dateien von der SDCard in das SRAM zu laden. Angebunden wird das SRAM an den EBI-Bus (Port H-K) des Xmegas. Dadurch kann ich wesentlich schneller auf Wellenform Daten und Soundparameter zugreifen als über die SDCard. Die SDCARD dient dann lediglich als externer Datenspeicher. Bild 1: IS62WV51216BLL SRAM Board Ich habe gerade festgestellt, das auf dem bestellten SRAM-Board ein 16Bit SRAM sitzt und nicht wie gedacht ein 8Bit Typ. Das freut mich doch sehr, da es insgesamt 1MByte Speicherplatz sind. Wow.. Die Adressierung mit dem Xmega ist allerdings etwas tricki. Um das SRAM zu adressieren sind zwei Stück 8-BIT D-LATCH Typ 74HC573 für die Bereitstellung der höheren Adressleitungen von A8-A18 notwendig. Zusätzlich ist für die vollen 16Bit Nutzung des SRAMs eine freie Adressleitungen (zB A19) notwendig, die auf den "LB" Anschluss (LowerByte) und über einen Inverter an "UB" Anschluss SRAM zu legen ist. Bild 2: SRAM IS62WV51216BLL-55TLI Bild 3: Xmega EBI-Interface Freu mich schon aufs Ram. Wird wohl etwas dauern.. weil kommt aus China. Mit dem großen SRAM kann ich endlich alle Wafe-Dateien laden und durch den Synth jagen Gruß Rolf Edited July 29, 2013 by rolfdegen Quote Link to comment Share on other sites More sharing options...
rolfdegen Posted August 8, 2013 Author Report Share Posted August 8, 2013 (edited) Hallöchen.. Höre gerade chillige Musik und hab gute Laune. Falls es jemanden interessiert "1.FM Chillout Lounge Radio" und "Antenne Bayer Chillout" sind so meine Favoriten Ich höre die Sender gern beim programmieren. Dann bekommt man noch mehr Ansporn und Lust wenn man geile Synth-Klänge hört. In Win8 gibts dafür ne tolle App namens "Audials Radio". Auf Youtube habe ich noch ein hoch interessantes Video über den "ROCKET" Synthesizer von der Firma Waldorf gefunden. Dort diskutieren Musiker und Techniker über den kleinen ROCKET. Man erfährt so einiges über den kleinen Winzling zB was an Technik in ihm steckt und was er so alles kann. Bild: Der kleine "ROCKET" Um die Wartezeit auf das SRAM aus China zu überbrücken, programmiere ich momentan die VCA-Page in meinem AVR-Synthesizer. Oszillator1+2 und der Noise-Generator bekommen endlich Lautstärke- und Panorama-Funktionen. Ein Teil dieser Funktionen ist in C geschrieben und ein anderer in Assembler. Ist leider noch nicht ganz fertig, aber ich mach gleich mal ein Foto um zu zeigen, wies hinterher auf dem Display aussehen wird. Die VCA-Page in meinem Synth ist jetzt fertig (siehe Bilder). Mit der Taste "Function" kann man auf der VCA-Page zwischen den Einstellungen für die Lautstärke und Balance umschalten. Die rechteckigen Symbole für Osc und Noise werden entsprechend der Balance-Einstellung wie bei einem analogen Fader nach oben oder unten verschoben. VCA Page mit Osc- und Noise-Volume VCA Page mit Osc- und Noise-Balance Softwaretechnisch ware es nicht ganz leicht (zumindes für mich ) die Volume- und Balance-Funktionen für Oszillator und Rauschgenerator umzusetzen. Ein Teil der Funktionen (Berechnung Lautstärkeverhältnis Linker und Rechter Audiokanal) wurde in der Menüsteuerung, die komplett in C geschrieben ist, umgesetzt (siehe C-Code). Ein anderer Teil dieser Funktion wurde in die Assembler Routinen für die Soundausgabe integriert (siehe unten). Abfrage der Encoder für Volume and Balance in der Menüsteuerung // osc1 level if (enc2_status == 1) // 1= encoder value change / 0= not change { int8_t balance_temp; balance_temp = osc1_balance *2; osc1_value = enc2_value; lcd_moveto_xy(23,12);print_8bit_numbers2(osc1_value,0); // print osc1 level if (balance_temp == 0) { osc1_value1 = osc1_value; osc1_value2 = osc1_value1; } if (balance_temp > 0) { osc1_value2 = 127*osc1_value/127; osc1_value1 = ((127 - balance_temp) *osc1_value/127); } if (balance_temp < 0) { uint8_t temp_balance1; temp_balance1 = balance_temp* -1; // make unsigned osc1_value2 = ((127 - temp_balance1 + 1) *osc1_value/127); osc1_value1 = 127*osc1_value/127; } } // change osc1 balance if (enc2_status == 1) // 1= encoder value change / 0= not change { if (enc2_value >= 64) { osc1_balance = enc2_value -64; } else { osc1_balance = 64- enc2_value; osc1_balance = osc1_balance* -1; } int8_t balance_temp; balance_temp = osc1_balance * 2; uint8_t sym_pos; if (balance_temp == 0) { osc1_value1 = osc1_value; osc1_value2 = osc1_value; } if (balance_temp > 0) { osc1_value2 = (127*(osc1_value)/127); osc1_value1 = ((127 - balance_temp) *(osc1_value)/127); } if (balance_temp < 0) { uint8_t temp_balance1; temp_balance1 = balance_temp* -1; osc1_value2 = ((127 - temp_balance1 + 1) *(osc1_value)/127); osc1_value1 = (127*(osc1_value)/127); } } Assembler-Routine für Volume und Balance //----------------------------------------------------------------------- // save osc1+2 values // osc1_temp = 20 osc2_temp = 21 mov osc1_temp, chanalA_0 mov osc2_temp, chanalB_0 //----------------------------------------------------------------------- // osc1 level // LDS R18, osc1_value1 MUL R18, osc1_temp ; mul R18*temp_osc1 result in R0+R1 MOVW R18, R0 ; result in r0/r1 mov to r18/r19 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // set osc1 value to chanal_A mov chanalA_0,R18 mov chanalA_1,R19 //----------------------------------------------------------------------- // osc1 balance // LDS R18, osc1_value2 MUL R18, osc1_temp MOVW R18, R0 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // set osc1 balance value to chanal_B mov chanalB_0,R18 mov chanalB_1,R19 //----------------------------------------------------------------------- // osc2 level // LDS R18, osc2_value1 MUL R18, osc2_temp ; mul R18+R19 result in R0+R1 MOVW R18, R0 ; move result to r18+r19 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // set osc2 value to chanal_A ADD chanalA_0,R18 ADC chanalA_1,R19 //----------------------------------------------------------------------- // osc2 balance // LDS R18, osc2_value2 MUL R18, osc2_temp MOVW R18, R0 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // set oc2 balance to chanal_B ADD chanalB_0,R18 ADC chanalB_1,R19 //=============================================================== // noise generator //=============================================================== noise_gen: LDS PhaseA0, noise+0 ; load noise register LDS PhaseA1, noise+1 ; LDS PhaseA2, noise+2 ; BST PhaseA0, 4 ; Bit 4 (0:4) laden BLD R30, 0 ; BST PhaseA2, 7 ; Bit 23 (2:7) laden BLD R31, 0 ; EOR R30, R31 ; XOR der beiden Bits ROR R30 ; in Carry shiften ROL PhaseA0 ; Buffer links schieben mit Carry ROL PhaseA1 ; ROL PhaseA2 ; STS noise+0, PhaseA0 ; save noise register STS noise+1, PhaseA1 ; STS noise+2, PhaseA2 ; // set noise level left and balance temp_noise = 20 ; temp-register R20 MOV temp_noise, PhaseA1 ; save noise to R20 LDS R18, noise_value1 MUL R18, temp_noise ; mul R18+R19 result in R0+R1 MOVW R18, R0 ; move result to r18+r19 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // add noise chanal_A ADD chanalA_0,R18 ADC chanalA_1,R19 // set noise lefel right and balance LDS R18, noise_value2 MOV R19, temp_noise ; load noise MUL R18, R19 MOVW R18, R0 // div 127 ANDI R18, 0xF0 ; clr Low-Nibble from R18 SWAP R18 ; SWAP High-Nibble to Low-Nibble LSR R18 ; 3x shift right LSR R18 LSR R18 LSL R19 ; R19 1x shift left ADD R18, R19 ; ADD R18+R19 // add noise chanal_B ADD chanalB_0,R18 ADC chanalB_1,R19 //----------------------------------------------------------------------- // Chanal Output chan_out: // convert Chanal_A to 12Bit LSL chanalA_0 ROL chanalA_1 LSL chanalA_0 ROL chanalA_1 LSL chanalA_0 ROL chanalA_1 // convert Chanal_B to 12Bit LSL chanalB_0 ROL chanalB_1 LSL chanalB_0 ROL chanalB_1 LSL chanalB_0 ROL chanalB_1 // send chanal_A value to DACA STS 0x0318, chanalA_0 ; 2 L-Byte to DAC-Register DACAL STS 0x0319, chanalA_1 ; 2 H-Byte to DAC Register DACAH // send chanal_B value to DACB STS 0x0338, chanalB_0 ; 2 L-Byte to DAC-Register DACBL STS 0x0339, chanalB_1 ; 2 H-Byte to DAC Register DAcBH Für Verbesserungsvorschläge bin ich sehr empfänglich Besonders in der Assembler-Routine. Vielleicht kann man die in Bezug auf Geschwindigkeit noch etwas optimieren. Lieben Gruß Rolf Hallo zusammen.. Ich habe gerade festgestellt, das einer meiner beiden Filter IC's SS2044 in meinem Synthesizer nicht richtig funktioniert. Am Filter-Ausgang ist ein kleiner Gleichspannungsoffset vorhanden. Dieser ändert sich mit der Höhe der Cutoff-Steuerspannung am CV-Eingang (Pin 13) des Filter-IC's (siehe Bild1+2). Ein Entkopplungskondensator am Audioeingang und Audioausgang des Filters (Pin 1+3) hat nicht geholfen. Auch der Offsetabgleich mit einem Trimmer (P2) am Filter IC Pin 15 hatte keinen Erfolg. Da der nachgeschaltete VCA das Filtersignal zusätzlich verstärkt, treten bei der Ansteuertung des Filters über den Filter-Enveloop hörbare Plop-Geräusche auf. Das macht sich besonders bei schnellen Enveloop-Kurven bemerkbar. Der zweite Filter-Kanal ist identisch aufgebaut und hat keinen Gleichspannungsoffset am Ausgang. Vermutlich ist das erste Filter-IC defekt, da ich alle Bauteile und die Verdrahtung am Filter-IC mehrfach überprüft habe und keinen Fehler feststellen konnte. Bild 1: Filter-Kanal A mit Gleichspannungsoffset am Ausgang (Pin 3) Bild 2: Filter-Kanal B ohne Gleichspannungsoffset Bild 3: Schaltung eines Filter-Kanals im AVR-Synthesizer Der verwendete Filterbaustein SSM2044 wird leider nicht mehr hergestellt und ist nur noch über ebay ab einen Preis von 12 Euro zu bekommen . Aus diesem Grund überlege ich, ob es für die Zukunft und für einen Nachbau nicht besser wäre, die Filterschaltung, bestehend aus zwei Kanälen, mit anderen Bauteilen komplett neu zu gestalte. Ein sehr interessantes Filter-Konzept zum Nachbau hat die deutsche Firma tubeohm.com auf ihrer Website vorgestellt. Der sogenannte "Ladder Filter" ist zwar für den Shruthi- und Ambika-Synthesizer von Mutable Instrument entwickelt worden, aber vielleicht mit ein paar Änderungen in der Schaltung auch für meinen Synthesizer nutzbar. Auf der Website von Mutable Instruments gibt es auch noch andere Filter-Schaltungen die nicht weniger interessant sind. Dort findet man auch Klangbeispiele von den verschiedenen Filterschaltungen. Youtube: "Ladder Filter" Im Moment weis ich noch nicht so recht was ich machen soll. Aber fürs Erste werde ich den bequemen Weg gehen und mir einen neuen SSM2044 über ebay kaufen Edited August 8, 2013 by rolfdegen 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.