|
 |
 |
 |
 | AVR Synthesizer-Projekt |
|
perlian
Mitglied

Dabei seit: 04.05.2010
Beiträge: 875
Wohnort: Osnabrück
 |
|
Zitat: |
Original von Bender
Krasse Sache!
|
Ja dem kann ich mich nur Anschliessen.
Fetter Sound !!
Reicht zur Ansteuerung ein normales Midi Keyboard ?
Ich hab eins allerdings mit USB Anschluss
Ist das mit dem de-generator kompatibel ?
Und habt ihr schon einen ungefähren VK Preis im Auge ?
|
|
15.10.2017 17:30 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rolfdegen
Mitglied

Dabei seit: 11.07.2008
Beiträge: 1.788
Wohnort: Wuppertal
Themenstarter 
 |
|
Ach.. hätt ich doch mehr Geld. Dann würde ich mir diesen Synthesizer kaufen.
Modal Electronics 001

Der Modal 001 ist ein 2 stimmiger, bi-timbraler Synthesizer mit analoger / digitaler “Hybrid” Klang-Architektur. Pro Stimme gibt es 2 Oszillatoren und 2 Sub-Oszillatoren, mischbar im Mixer mit (Over)Drive Funktion. Wie im DE-GENERATOR sind die Oszillatoren NCOs (Numerically Controlled Oscillators) mit hoher Auflösung und hoher Stabilität. Der zur Auswahl stehende Wellenform-Satz pro Oszillator umfasst 56 Wellenformen ( im DE-GENERATOR sind es 128 + 20 Shapes ), die natürlich per Steuerspannung zu durchlaufen sind. Das VCF ist ein 24dB/Okt 4-Pol Transistor Filter mit Morphing-Möglichkeit (“Slope Control”) hin zur BandPass- und 1dB/Okt Filter Charakteristik. Zwei LFOs, mit MIDI-Sync-Möglichkeit. Zwei ADSR Hüllkurven für VCF und VCA. Eine Modulations-Matrix mit 6 simultane Modulationsquellen und 8 bzw. 9 Modulationsziele. Step-Sequenzer: 32 Steps mit 12 Spuren bzw. Paramater-Modulationen gleichzeitig. MIDI-Synchronisation sowie Live-Transponierung über das Keyboard möglich. Programmspeicher mit Platz für 100 x 100 Sounds. 3-Oktaven FATAR Tastatur mit Velocity und Aftertouch. Ein farbiges 4,3-Zoll TFT Display für die Programmierung. 4 CV Inputs und 4 CV Outputs und zwei Audio-Eingänge u.v.m. Preis um die 1850,- €. Wow..
Link: http://www.modalelectronics.com/modal-001/
Modal Electronics Waveforms

Klangbeispiele: https://www.youtube.com/watch?v=EQjL8VeugA0
Gruß Rolf
|
|
03.12.2017 10:41 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
amsel77
Mitglied
Dabei seit: 10.10.2007
Beiträge: 9
 |
|
Zitat: |
PS: Wenn ich mir das überlege, dann ist es schon eine Wunder, was die ATMEL MCU mit ihren 32MHz im DEGENERATOR alles leistet
|
Halbwegs ordentlich programmiert sind die bewährten 8Bitter halt nach wie vor für sehr vieles sehr viel überschaubarer als 32er Boliden einsetzbar. Danke für dieses komplexe Vorzeigeprojekt, welches dies auf beeindruckende Art und Weise beweist!
|
|
01.01.2018 23:30 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
MDS-78
Mitglied
Dabei seit: 24.03.2016
Beiträge: 39
Wohnort: STYRIA / AUSTRIA
 |
|
Echt Hut ab vor deinem Projekt, meine ARDUINO Projekte sind eher klein. Bin mehr der Hardware Mann als Software.
|
|
05.03.2018 19:00 |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rolfdegen
Mitglied

Dabei seit: 11.07.2008
Beiträge: 1.788
Wohnort: Wuppertal
Themenstarter 
 |
|
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:

https://lh3.googleusercontent.com/-837IB...0325_015715.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ß
Grüße aus Wuppertal. Rolf
|
|
25.03.2018 03:23 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rolfdegen
Mitglied

Dabei seit: 11.07.2008
Beiträge: 1.788
Wohnort: Wuppertal
Themenstarter 
 |
|
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
|
|
25.03.2018 03:28 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rolfdegen
Mitglied

Dabei seit: 11.07.2008
Beiträge: 1.788
Wohnort: Wuppertal
Themenstarter 
 |
|
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..
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


Initialisierung des DMA-Kontrollers im DEGENERATOR
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
|
//*************************************************************************
// 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
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
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 Ostergrüße aus Wuppertal
Dieser Beitrag wurde 11 mal editiert, zum letzten Mal von rolfdegen: 02.04.2018 15:48.
|
|
02.04.2018 15:21 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
Impressum - Datenschutzerklärung
|
|  |