Jump to content

AVR-Synthesizer "WAVE 1"


rolfdegen

Recommended Posts

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 smile.gif

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)

Filter_011.jpg

 

Bild 2: Filter-Hüllkurve gezoomt

Filter_012.jpg

 

Bild 3-5: Filter-Einstellungen

Filter_013.jpg

Filter_014.jpg

Filter_015.jpg

 

Gruß Rolf

Link to comment
Share on other sites

Hallo und guten Abend zusammen...

Je später der Abend um so interessanter die Beiträge, hoffe ich zumindest smile.gif 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 by rolfdegen
Link to comment
Share on other sites

  • 3 weeks later...

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 by rolfdegen
Link to comment
Share on other sites

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 by rolfdegen
Link to comment
Share on other sites

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 by rolfdegen
Link to comment
Share on other sites

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 by rolfdegen
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by rolfdegen
Link to comment
Share on other sites

Hallo

Hier das ganze LFO-Programm vom AVR-Synthi. Ich gebe zu, die Töne bzw Klänge sind nicht unbedingt jedermanns Geschmack wink.gif 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 by rolfdegen
Link to comment
Share on other sites

Hallo ihr da.. smile.gif 

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

Mod_Matrix_01.jpg

 

Gruß Rolf

Link to comment
Share on other sites

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 smile.gif

 

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 by rolfdegen
Link to comment
Share on other sites

  • 2 weeks later...

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 bueb.gif 

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

  • 3 weeks later...

Einen wunderschönen, sonnigen und guten Montag Morgen wünsch ich Euch allen bueb.gif 

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.. smile.gif 

AVR-Synthesizer Gehäuse

Synth_Case_01.jpg

 

Synth_Case_02.jpg

 

Gruß Rolf

Link to comment
Share on other sites

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).

 

 Gehaeuse_01.jpg

 

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 by rolfdegen
Link to comment
Share on other sites

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.
3413-wafe1.png

 

Gruß Nasrudin

Edited by Nasrudin
Link to comment
Share on other sites

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).

 

Geh%C3%A4use_02.jpg?psid=1

Näher betrachtet sieht das Ganze dann so aus:

 

Vorschlag_Gehaeuse2.png

 

(vielen Dank an Wolfgang für die Zeichnung)

 

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

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
Frontplatte_02.png
 
 
Gruß Rolf
Edited by rolfdegen
Link to comment
Share on other sites

Hallo again.. ich schon wieder smile.gif 

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 smile.gif 

Bild: Synthesizer "WAVE 1"

Case_03a.jpg

 

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 wink.gif 
Das LED-Backlight fürs DOG-Display gibts auch in anderen Farben zB. grün-gelb, amber, weiß (verwende ich) oder RGB.

 

01f5da8fcf13aec1604de82b276c55.jpg


Gruß Rolf 

Edited by rolfdegen
Link to comment
Share on other sites

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

SRAM_Board.jpg

 

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.. smile.gif 

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

SRAM%201MByte.jpg

 

 

Bild 3: Xmega EBI-Interface

EBI_SRAM_02.jpg

 

 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 smile.gif

 

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

  • 2 weeks later...

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 smile.gif 
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"

rocket_topview-intro.jpg

 

 

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_Vol_01.jpg

 

 

VCA Page mit Osc- und Noise-Balance

VCA_Bal_01.jpg

 

Softwaretechnisch ware es nicht ganz leicht (zumindes für mich wink.gif ) 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 smile.gif 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)

 

 

DC_Offset_01.jpg

 

Bild 2: Filter-Kanal B ohne Gleichspannungsoffset

DC_Offset_02.jpg

 

Bild 3: Schaltung eines Filter-Kanals im AVR-Synthesizer

VCA_02.jpg

 

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 smile.gif

Edited by rolfdegen
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...