AVR Synthesizer "WAVE 1" / De-Generator

Dieses Thema im Forum "Lötkunst" wurde erstellt von rolfdegen, 10. Januar 2014.

  1. rolfdegen

    rolfdegen ...

    Keine Sorge. Ist alles noch erhältlich. Wir haben auch ein modulares Konzept entwickelt, das uns erlaubt, bestimmte Baugruppen wzB Filterboard, CPU-Board oder Panelboard auszustauschen. Für später ist zB ein neues CPU-Board mit ARM-Prozessor geplant um 4 stimmig und in 16Bit zu spielen (obwohl die 8Bit Auflösung im DEGENERATOR schon einen gewissen Reiz hat).

    Gruß Rolf

    DEGENERATOR Firmware/Buglist

    Build 3.63f 03.03.2018
    - Modulationsmatrix: geänderte Amount für Osc Pitch - 16 / + 16 Semitones
    - Modulationsmatrix: geänderte Amount für Osc fine - 2 / + 2 Semitones
    - Modulationsmatrix: Modwheel Amount Wert vergrößert (von 127 auf 255)
    - Osc-Page: Osc-Sync für alles Wellenformen außer Samples

    Build 3.63g 11.03.2018
    - Init Sound: Osc1:SAW / Mod. ENV1~Cutoff +33 / Mod. ENV2~VCA +63 / Mod. PitchBend~Osc1+2 Pitch +8 / Mod. MWheel = LFO1~Osc1+2 fine +32
    - Polling time für Midi buffer auf 250us verringert.
    - Midi overflow symbol [!] in der Überschriftleiste integriert

    Build 3.64 11.03.2018
    - Modmatrix: Mit der Taste "MOD-MAT" kann jetzt von Slot 1-6 auf Slot 7-12 gewechselt werden
    - Wird die Taste "CANCEL" länger als 3sec gedrückt, werden im DEGENERATOR alle Noten ausgeschaltet (Panic-Funktion)

    Build 3.64a 22.03.2018
    - Draw sample curve on osc-page if new sample recording
    - Sample Editor: MUTE/CUT/LOOP/REV/SEC/SECL funktioniert jetzt
     
  2. rolfdegen

    rolfdegen ...

    Es wurde Zeit für etwas Neues..

    Ich meine natürlich nicht meinen DEGENERATOR, sondern ein neues und gemütliches Arbeitszimmer
    (siehe Bilder). Zuerst sollte es nur ein neuer Büroschrank werden um den ganzen Elektronik-Müll, der
    sich seit Jahren angesammelt hat, zu verstauen. Als ich dann aber durch die Schwedischen Einkaufs-
    hallen in Wuppertal wanderte und die "Ungeahnten Möglichkeiten" sah, dann überkam mich die Lust
    auf mehr.

    So wurde es dann doch noch ein großer Eckschreibtisch mit Rollcontainer samt Bürostuhl und kleiner
    Komode. Als ich dann endlich gehen wollte, viel mir noch ein gemütlicher Ohrensessel auf, der für
    Gäste oder für Entspannung dienen soll. Mein Budget für das Arbeitszimmer war zwar erschöpft,
    aber ein kleiner Notbookständer für meine zwei Synthesizer habe ich dann auch noch bestellt.

    Das alte Arbeitszimmer, bestehend aus einem Wohnzimmertisch, einem Küchentisch als Lötecke, zwei
    Regalen, einem Sideboard und einem Sofa, habe ich mit Hilfe meines netten Nachbarn auf den Sperr-
    müll gestellt. So war denn ausreichend Platz für den großen Eckschreibtisch mit Lötecke und Büro-
    schrank mit zwei Regalen.

    Bilder:
    [​IMG]
    https://lh3.googleusercontent.com/-837IB...0325_015715.jpg

    [​IMG]
    https://lh3.googleusercontent.com/-ZAYuX...0325_014416.jpg

    Ach was soll ich sagen.. Jetzt ist es richtig schön gemütlich und das arbeiten macht doppelt Spaß [​IMG]

    Grüße aus Wuppertal. Rolf
     
  3. lilak

    lilak ||

    hallo rolf ... der elch hat dein arbeitszimmer sehr gemütlich eingerichtet. erst mal herzkliche glückwünsche aus berlin!

    DEGENERATOR sieht wirklich interessant aus. ich arbeite auch schon eine weile an einem wavetable synth auf basis der 12 bit samples aus dem prophet vs. und nach dem prinzip des harmonic aliasing. das ist alles hier genauer erklärt, das ist aber nicht mehr ganz up to date:

    https://www.sequencer.de/synthesize...diy-wavesequencer-synth-abteilung-r-d.128854/

    inzwischen existiert da ein ausgefeilter prototyp in pure data den ich als nächstes in hardware umsetzen will. das hauptproblem dabei ist dass ich DACs mit variable sample rate brauche weil sonst das harmonic aliasing nur bedingt funktioniert. evtl. hast du da mit deinen erfahrungen eine schlaue idee wie das grundsätzlich zu machen ist?

    beim degenerator fällt mir vor allem auf dass ich die 8 bit unschön finde, das ist auch für mich das problem beim shruti. ich finde 12 bit ziemlich ideal, das hat noch genug noise aber auch genug top end. ansonsten finde ich klingt der degen deutlich besser als der shruti!

    .
     
  4. rolfdegen

    rolfdegen ...

    12Bit sind leider nicht machbar, da der Prozessor (ATXMEGA128A1U) im DEGENERATOR schon an seiner Leistungsgrenze arbeitet. Wir haben später mit einem 32Bit ARM-Prozessor ganz andere Möglichleiten. Da sind 4 Stimmen und 16Bit möglich.
    Die Umsetzung bzw Entwicklung wird dann aber keine 4 Jahren dauern. Hoffe ich.. :gaehn:

    Gruß Rolf
     
  5. lilak

    lilak ||

    ja klar atxmega hat natürlich wenig oktan. ich hab die bela plattform im auge, das ist ein kompletter linux rechner dahinter, beaglebone black und praktisch NULL latenz ... oder sogar fpga aber das ist teuer und aufwändig zu programmieren.

    https://bela.io/

    ist irgendwo beschrieben wie du die hardware für den filter gelöst hast? das ist bei mir noch ein schwarzes loch ...
     
    Zuletzt bearbeitet: 27. März 2018
  6. humax5600

    humax5600 ...

  7. rolfdegen

    rolfdegen ...

    Es gibt ein neues Firmware Update für den DEGENERATOR

    Build 3.64b 01.04.2018
    - DMA Transfer mit Double-Buffer Funktion für Audio-Daten implementiert. Spart Prozessor Ressourcen
    - Fast 16Bit Noisegenerator implementiert. Spart Prozessor-Ressourcen

    Ich habe mich am Osterwochenende endlich mal hingesetzt und mich mit der DMA-Funktion im ATXmega128 beschäftigt. Die DMA-Funktion hatte ich immer vernachlässigt, da ich dachte, das sie mir nicht viel an Prozessor-Ressourcen einsparen würde. Aber wer's nicht wagt, der wird's nicht erfahren oder so.. [​IMG]

    Gesagt getan. Jetzt war nur zu überlegen, wie der DMA am effektivsten eingesetzt werden kann. Im DEGENERATOR existieren u.a. zwei Double-Buffer für die Audio-Ausgabe. Ich habe mir überlegt, dass die DMA-Funktion hier die größte Einsparung und Entlastung für den Prozessor einbringen könnte. Ferner bringt der ATXmega128 insgesamt 4 DMA Kanäle mit Double-Buffer Funktion mit. Wobei allerdings zwei DMA-Kanäle für eine Double-Buffer zusammengeschaltet werden müssen. Dies kann man dann idealer Weise für die beide Audio-Kanäle verwenden.

    DMA-Controller
    Der DMA-Controller (Direct Memory Access) ermöglicht das Übertragen von Daten zwischen Speicher und Peripheriegeräten ohne große Prozessorauslastung. Während der DMA-Controller Daten von einem Speicherbereich zu einem anderen Bereich kopiert, kann die CPU andere Aufgaben wzB. Tastenabfrage oder Textausgabe auf einem LC-Display ausführen.

    Link: DMA Funktion im Xmega


    Bild: Datenübertragung mit CPU
    [​IMG]

    [​IMG]


    Initialisierung des DMA-Kontrollers im DEGENERATOR
    Code:
    //*************************************************************************
    // DMA init
    //*************************************************************************
    void dma_init(void){
        DMA.CTRL = DMA_CH_ENABLE_bm | DMA_DBUFMODE_CH01CH23_gc; // set Double Buffer and enabled
        
        // DMA Channel 0 (Audio-Buffer A)   
        DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc
        | DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc;
        DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_DACB_CH0_gc; // DACB CH0 is trigger Quelle
        DMA.CH0.DESTADDR0 = (((uint32_t)(&DACB.CH0DATAH))>>0*8) & 0xFF;
        DMA.CH0.DESTADDR1 = (((uint32_t)(&DACB.CH0DATAH))>>1*8) & 0xFF;
        DMA.CH0.DESTADDR2 = (((uint32_t)(&DACB.CH0DATAH))>>2*8) & 0xFF;
        DMA.CH0.TRFCNT = 128;
        DMA.CH0.SRCADDR0 = (((uint32_t)(&Voice.Buffer_A))>>0*8) & 0xFF;
        DMA.CH0.SRCADDR1 = (((uint32_t)(&Voice.Buffer_A))>>1*8) & 0xFF;
        DMA.CH0.SRCADDR2 = (((uint32_t)(&Voice.Buffer_A))>>2*8) & 0xFF;
        DMA.CH0.CTRLA = 0xA4;   // Aktivieren, Wiederholen, 1 Byte, Single
        
        // DMA Channel 1 (Audio-Buffer B)
        DMA.CH1.ADDRCTRL = DMA_CH_SRCRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc
        | DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc;
        DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_DACB_CH0_gc; // DACB CH0 is trigger Quelle
        DMA.CH1.DESTADDR0 = (((uint32_t)(&DACB.CH0DATAH))>>0*8) & 0xFF;
        DMA.CH1.DESTADDR1 = (((uint32_t)(&DACB.CH0DATAH))>>1*8) & 0xFF;
        DMA.CH1.DESTADDR2 = (((uint32_t)(&DACB.CH0DATAH))>>2*8) & 0xFF;
        DMA.CH1.TRFCNT = 128;
        DMA.CH1.SRCADDR0 = (((uint32_t)(&Voice.Buffer_B))>>0*8) & 0xFF;
        DMA.CH1.SRCADDR1 = (((uint32_t)(&Voice.Buffer_B))>>1*8) & 0xFF;
        DMA.CH1.SRCADDR2 = (((uint32_t)(&Voice.Buffer_B))>>2*8) & 0xFF;
        DMA.CH1.CTRLA = 0xA4;   // Aktivieren, Wiederholen, 1 Byte, Single
        
        // DMA Channel 2 (Audio-Buffer C)
        DMA.CH2.ADDRCTRL = DMA_CH_SRCRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc
        | DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc;
        DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_DACA_CH0_gc; // DACA CH0 is trigger Quelle
        DMA.CH2.DESTADDR0 = (((uint32_t)(&DACA.CH0DATAH))>>0*8) & 0xFF;
        DMA.CH2.DESTADDR1 = (((uint32_t)(&DACA.CH0DATAH))>>1*8) & 0xFF;
        DMA.CH2.DESTADDR2 = (((uint32_t)(&DACA.CH0DATAH))>>2*8) & 0xFF;
        DMA.CH2.TRFCNT = 128;
        DMA.CH2.SRCADDR0 = (((uint32_t)(&Voice.Buffer_C))>>0*8) & 0xFF;
        DMA.CH2.SRCADDR1 = (((uint32_t)(&Voice.Buffer_C))>>1*8) & 0xFF;
        DMA.CH2.SRCADDR2 = (((uint32_t)(&Voice.Buffer_C))>>2*8) & 0xFF;
        DMA.CH2.CTRLA = 0xA4;   // Aktivieren, Wiederholen, 1 Byte, Single
        
        // DMA Channel 3 (Audio-Buffer D)
        DMA.CH3.ADDRCTRL = DMA_CH_SRCRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc
        | DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc;
        DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_DACA_CH0_gc; // DACA CH0 is trigger Quelle
        DMA.CH3.DESTADDR0 = (((uint32_t)(&DACA.CH0DATAH))>>0*8) & 0xFF;
        DMA.CH3.DESTADDR1 = (((uint32_t)(&DACA.CH0DATAH))>>1*8) & 0xFF;
        DMA.CH3.DESTADDR2 = (((uint32_t)(&DACA.CH0DATAH))>>2*8) & 0xFF;
        DMA.CH3.TRFCNT = 128;
        DMA.CH3.SRCADDR0 = (((uint32_t)(&Voice.Buffer_D))>>0*8) & 0xFF;
        DMA.CH3.SRCADDR1 = (((uint32_t)(&Voice.Buffer_D))>>1*8) & 0xFF;
        DMA.CH3.SRCADDR2 = (((uint32_t)(&Voice.Buffer_D))>>2*8) & 0xFF;
        DMA.CH3.CTRLA = 0xA4;   // Aktivieren, Wiederholen, 1 Byte, Single
    }
    
    
    //*************************************************************************
    // Timer0 Interrupt: DAC Task 40KHz/25usec
    //*************************************************************************
    ISR(TCC0_OVF_vect)
    {   
        // DMA Interrupt ------------------------------------------------------
        
        // if Channel Transaction Complete Interrupt Flag set
        if (DMA.INTFLAGS & DMA_CH0TRNIF_bm)
        {
            // set buffer_nr
            Voice.buffer_nr = 0;
            
            // set buffer_fill interrupt
            TCE1.INTCTRLA = 0b00000010;
            
            // clear DMA Interrupt (set one)
            DMA.INTFLAGS |= DMA_CH0TRNIF_bm;
        }
        else if (DMA.INTFLAGS & DMA_CH1TRNIF_bm)
        {
            // set buffer_nr
            Voice.buffer_nr = 1;
            
            // set buffer_fill interrupt
            TCE1.INTCTRLA = 0b00000010;
            
            // clear DMA Interrupt (set one)
            DMA.INTFLAGS |= DMA_CH1TRNIF_bm;
        }
    
    ....

    Ferner habe ich den 16Bit Noise-Generator überarbeitet. Dieser ist jetzt als Inline Assembler Code vorhanden und etwas kürzer im Code und in der Berechnungszeit. Er benötigt jetzt nur noch 512ns (16 Taktzyklen).
    Hierbei habe ich aus Zeitgründen auf die Übergabe der Ergebniswerte in der Funktion verzichtet und die Werte direkt in die Ausgabe-Variablen RNG_8 und RNG_16 geschrieben.

    Fast Noisegenerator
    Code:
    uint16_t RNG_16;
    uint8_t RNG_8;
    
    static inline Noise8(void) {
        asm volatile (
        "lds r30, RNG_16+0" "\n\t"
        "lds r31, RNG_16+1" "\n\t"
        "lsr r31" "\n\t"
        "ror r30" "\n\t"
        "brsh xxor" "\n\t"
        "ldi r17, 0xb4" "\n\t"
        "xxor: eor r31, r17" "\n\t"
        "sts RNG_8, r30" "\n\t"
        "sts RNG_16+0, r30" "\n\t"
        "sts RNG_16+1, r31" "\n\t"
        ::: "r17", "memory"
        );
    }
    Bis zum nächsten mal. Schöne Grüße aus Wuppertal [​IMG]
     
  8. rolfdegen

    rolfdegen ...

    So.. noch ein paar Bugfixes und dann ist der DE-GENERATOR fertig

    Build 3.64b 01.04.2018
    - DMA Transfer mit Double-Buffer Funktion für Audio-Daten implementiert. Spart Prozessor Ressourcen
    - Fast 16Bit Noisegenerator implementiert. Spart Prozessor-Ressourcen
    - Richtige Darstellung von Noise und Vowel Wellenform im Osc-Menü.
    - Falsche Berechnung von freien Speicherplatz für Samples. Freier Speicherplatz wird jetzt im Menü richtig angezeigt
    - Osc2: Flasche Berechnung der Loop-Punkte. Fehler beseitigt
    - Sample-Editor: Markierung der Loop-Punkte beim zoomen fehlerhaft. Fehler beseitigt.

    Andre hat das neue Panelboard aus China bekommen. Muss jetzt schnell die Bauteile bestellen und
    einlöten. Bin gespannt ob' funktioniert. Zur Info: Die neue Revision hat ein neues TFT Display erhalten
    und es sind ein paar Leuchtdioden mehr bestückt (Midi-In, Rec- und Seq-Taste).

    Facebook: https://www.facebook.com/tubeohm.tubeohminstruments

    DE-GENERATOR new Panelboard
    [​IMG]
    Link: https://plus.google.com/photos/phot...44281824883952002?authkey=CJrejtTh8MOPVQhl=de


    Andre der "Fleißige" [​IMG] hat ein kleines Platinchen rund um den FV-1 Chip von Semiconductor
    entwickelt. Der FV-1 ist eine einfach zu programmierender DSP, der speziell für Audio- und
    Effektgeräte-Anwendungen hergestellt wurde. Der FV-1 besitzt Stereo ADC und DACs.
    Insgesamt kann auf 16 Effekt-Programme zugegriffen werden. 8 Programme sind in das interne
    ROM integriert. In Verbindung mit ein serielles EEPROM können 8 zusätzlichen Programmen
    angesprochen werden. Mit 3 Potentiometereingängen können Echtzeit-Parameter gesetzt werden
    wie z. B. Reverb-Abklingzeit , Rate und Tiefe in einem Chorus oder einer Frequenz in einem Filter.
    Integrierte digitale LFOs und Rampengeneratoren ermöglichen die Programmierung
    Chorus, Flansch und Tonhöhenverschiebung.

    FV-1 Fx-Board
    [​IMG]
    Link: https://plus.google.com/photos/phot...44288989412012114?authkey=CLues-Sc19jXRAhl=de

    Gruß aus Wuppertal. Rolf
     
  9. rolfdegen

    rolfdegen ...

    Ja hier: http://cczwei-forum.de/cc2/thread.php?postid=92936#post92936 oder per mail. Gruß Rolf
     
  10. Hallo,
    gibt es die Platine des FV-1 zu kaufen?
    Gruß
     
  11. rolfdegen

    rolfdegen ...