Degenerator DIY Sampler/Synthesizer (Tubeohm)

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:
20180325_015715.jpg

https://lh3.googleusercontent.com/-837IB...0325_015715.jpg

20180325_014416.jpg

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


Grüße aus Wuppertal. Rolf
 
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!

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


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


DMA_02.gif



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
holy-willi.gif
 
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
Panel17.JPG

Link: https://plus.google.com/photos/phot...44281824883952002?authkey=CJrejtTh8MOPVQhl=de


Andre der "Fleißige"
wink.gif
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
FV-1.JPG

Link: https://plus.google.com/photos/phot...44288989412012114?authkey=CLues-Sc19jXRAhl=de

Gruß aus Wuppertal. Rolf
 
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 ...

Ja hier: http://cczwei-forum.de/cc2/thread.php?postid=92936#post92936 oder per mail. Gruß Rolf
 
Hallöchen..

Was Dave Smith da mit dem Sequential X Synthesizer baut ist schon genial und vorbildlich. Eine ähnliche Idee hab ich mit zwei Oszillatoren im DE-GENERATOR umgesetzt. Beide Oscillatoren besitzen eine Synth- und Sample-Engine. Es können User-Wellenformen und Samples über SD-Karte im WAV-Format geladen werden. Ferner können beide Oszillatoren auf 18 verschiedene Synthesealgorithmen zugreifen wzB Vowel-Sound, ZSaw,LPZ,PKZ u.v.a.

Synthengine im DE-GENERATOR
20180428_012605.jpg
20180428_012900.jpg

Link: https://plus.google.com/photos/1144...275309945320594?authkey=CN_jsejj3J_BtwE&hl=de
Link: https://plus.google.com/photos/1144...275309400259506?authkey=CN_jsejj3J_BtwE&hl=de
20180428_013900.jpg

Link: https://plus.google.com/photos/phot...549277187583757026?authkey=CKPl3-SQ25xd&hl=de


Ein Beispiel: Wärend Osc1 eine User-Wellenform oder einen Synthesealgorithmus wiedergibt, kann Osc2 einen Sample abspielen. Ferner können Osc1 und Osc2 zeitgleich auf den gleichen Sample oder zwei unterschiedliche Samples zugreifen. Ein kleiner Sample-Editor mit Cut-, Reverb- und Loop-Funktion ist ebenfalls vorhanden.

PS: Was ihr da seht, ist schon das neue Panelboard (Finale-Version) für den DE-GENERATOR und bestückt mit dem neuen TFT-Display. Bin das gerade am teste. So wie's aussieht hat Andre gute Arbeit gemacht. Es funktioniert :)

Gruß Rolf
 
Zuletzt bearbeitet:
Das fertige FV-1 Fx-Board von Andre. Klingt wirklich gut :)

Wir überlegen noch, ob wir in einer späteren 16Bit Version des DE-GENERATOR's den PT2399 gegen den FV-1 ersetzen, weil dieser einfach besser klingt und mehr Möglichkeiten bietet.

VF-1_01.JPG


Gruß Rolf
 
Sauber, Gratulation!

Wo kann man denn die PCBs / das DIY-Kit dann ordern, hast Du da schon Pläne?
 
Das sieht doch gut aus, wann kommt der denn in den Laden oder so in die Hände von Leuten? Oder ist es eher ein Work in Progress System? Das ist durchaus attraktiv wie es dargestellt wird.
 
Hallo zusammen..

So langsam bekomme ich etwas "Muffensausen". Die erste Serie von 25 DE-GENERATOREN ist jetzt
in Vorbereitung. Die speziellen TFT Displays sind bereits aus China eingetroffen und von uns auf
Funktion getetstet. Das Panelboard wird jetzt mit speziellen Encoder von Burns bestückt, die ein
höheres Rotational Life von min 100.000 Zyklen besitzen.

TFT Display
P1060614.JPG



Das Manual ist fast fertig. Andre schreibt parallel noch an einer DIY Anleitung fürs Bestücken der
Platinen. Das Ganze sieht dann im Endeffekt so aus..

Beispiel Bestückungsplan
Unbenannt.JPG


In der Firmware hab ich noch ein paar Bugs gefunden und beseitigt.

Bugs.JPG


Gruß Rolf
 
Hallöchen..

Ich war mal wieder etwas shoppen und hab mein Urlaubsgeld in ein Yamaha PSR-S670 Keyboard investiert.

Yamaha brachte 2015 mit dem PSR-S670 ein neues Entertainer Keyboard auf den Markt. Mit zwei
großen Lautsprechern 2x15 Watt und Bassreflex-Öffnungen an den Seiten macht der Synthi einen
guten Klang.

Ein großes blaues LC-Display mit 320×240 Pixel informiert über Klangeinstellungen und Styles.
Das PSR-S670 verfügt über 400 interne Presets und 34 Drum Sets. Eine Besonderheit am Yamaha
PSR-S670 sind die zwei Live Control-Drehregler. Damit können unterschiedliche Parameter in Echt-
zeit modulieren werden. Das Gerät besitzt zwei USB-Schnittstellen. Eine für Midi und die Andere für
das Abspielen von Audio-Aufnahmen.

Amazona Testbericht: https://www.amazona.de/test-yamaha-psr-s670/

20180714_095434.jpg

Bild Link: https://plus.google.com/photos/photo/114...XE44DHkwE&hl=de

Gruß Rolf
 
Zuletzt bearbeitet:
Hi,Rolf.
Ich habe vorhin ein wenig bei TubeOhm nach dem Shruthi XT geschnüffelt und bin dort über die Ankündigung für den De-Generator gestolpert. Nachdem ich mir jetzt so einige Videos angeschaut habe, bin ich einfach nur begeistert. Ich wünsche viel Erfolg bei der Markteinführung. Da werde ich wohl auch noch schwach werden ;-)

Gruß, Günni
 


Zurück
Oben