Projektdokumentation Kai Aras Ss08

of 21 /21
Kai Aras - Matrikel Nr. 18464 – Medieninformatik – SS08 Projektdokumentatio n AlgoRythm - Mikrocontroller basierter Audio Synthesizer Betreuender Professor: Prof. Walter Kriha

Embed Size (px)

Transcript of Projektdokumentation Kai Aras Ss08

Projektdokumentation

Kai Aras - Matrikel Nr. 18464 Medieninformatik SS08

Projektdokumentation

AlgoRythm - Mikrocontroller basierter Audio Synthesizer

Inhaltsverzeichnis

31.Projektbeschreibung

42.Motivation / Ziele

53.Konzept

53.1.Synthesizer

53.2.Klangerzeuger (DDS)

73.3.Sequenzer

84.Hardware

84.1.Digitaler Schaltungsteil

84.1.1.Verwendete Hardware

94.1.2.Blockdiagramm

104.2.Analoger Schaltungsteil

105.Software

105.1.Klangerzeugung

105.1.1.Abstrakt

105.1.2.Direkt Digitale Synthese

105.1.3.Definitionen

115.1.4.Globale Variablen

125.1.5.Interrupt Service Routine (ISR)

135.1.6.Blockdiagramm

145.2.Sequenzer

145.2.1.Abstrakt

145.2.2.Definitionen

155.2.3.Globale Variablen

165.2.4.Intterupt Service Routine

175.2.5.Blockdiagramm

186.Probleme

187.Fazit

198.Quellen

199.Anhnge

1. ProjektbeschreibungEs soll ein hybrider Audio Synthesizer auf Basis eines einfachen "low-cost" Mikrocontrollers gebaut werden.

Zur Klangerzeugung soll das Verfahren der "Direkt digitalen Synthese" verwendet werden.

Als Hardware- Platform dienen zwei 8Bit- Atmel AVR Mikrocontroller, die mittels freiem C-Compiler "avr-gcc" komplett in "C" programmiert werden kann.

Das vom AVR digital erzeugte Signal soll anschlieend durch ein analoges "multimode" Filter geformt werden knnen.

Als kleines Highlight sollen verschiedene algorithmische kompositions hilfen implementiert werden, die es dem Benutzer ermglichen sollen auf "andere" art und Weise Musik zu kreieren als gewohnt.

Das Gert soll vom funktionalen Umfang her mit kleineren kommerziellen Synthesizern mithalten knnen, allerdings soll vor allem auf die Grundstze "low-cost" und "low-parts" groen wert gelegt werden. Unter anderem sollte das Instrument folgendes bieten:

zwei digitale Oszillatoren mit versch. Wellenformen ( Sinus, Square, Sawtooth + Userdefined ) ein analoges multimode Filter ein kleiner interner Sequencer einfache midi Implementierung verschiedene algorithmische Kompositionshilfen evtl. verschiedene digitale Effekte

Whrend der Entwicklung bekam ich jedoch schnell Lust auf mehr, so beschloss ich den analogen Schaltungsteil um einen spannungsgesteuerten Verstrker, sowie zwei 4- stufige Hllkurven zu erweitern. Der Digitalteil wurde um einen Niederfrequenzoszillator (LFO) erweitert, und das Sequenzermodul bekam eine 8x8 LED-Matrix zur Bedienung verpasst.Alles in allem bietet das Gert jetzt folgendes: zwei digitale Oszillatoren mit versch. Wellenformen ( Sinus, Square, Sawtooth + Noise )

ein digitaler LFO mit versch. Wellenformen ( Sinus, Square, Sawtooth + Noise )

ein analoges multimode Filter

ein analoger spannungsgesteuerter Verstrker (VCA)

zwei analoge 4-stufige Hllkurven (ADSR)

8x8 LED-Matrix-Sequenzer mit diversen algorithmischen Kompositionshilfen und modi2. Motivation / ZieleMotiviert einen Synthesizer zu bauen haben mich verschiedene Dinge, zum einen bin ich selbst begeisterter elektronischer Musiker, zum anderen liebe ich aber auch die Softwareentwicklung. Da dies ganz gut Hand- in Hand mit einander geht war schnell klar, dass ein Audioprojekt her muss. Zunchst wollte ich dies komplett in Software realisieren bis ich zufllig ber einen Podcast auf das Thema Mikrocontroller gestoen bin, was mich wiederum dazu bewegt hat mich intensiver mit dieser Materie auseinander zu setzen.Obwohl ich zu diesem Punkt kaum Verstndnis fr Elektrontechnik mitbrachte, fand ich schnell Spa am lten, basteln und experimentieren. Natrlich wollte ich auch hier meine Begeisterung fr Audiotechnik einbringen und so versuchte ich auf unterschiedlichen Wegen Klnge mit Hilfe eines Mikrocontrollers zu erzeugen. berraschender weise lieen erste Ergebnisse nicht lange auf sich warten und die Idee vom billig- selbstbau- Synthi war geboren.Damals motivierte mich vor allem die Herausforderung ein Instrument vom ersten IC bis hin zur Frontplattengestaltung selbst nach eigenen Vorstellen zu Entwickeln, bzw. die Kunst zu erlernen die einen erst befhigt dies zu tun.

Auf den Punkt gebracht waren meine Ziele also:

Verstehen und Realisieren der Direkt digitalen Synthese Wissen rund um Elektronik erweitern

Wissen im Bereich hardwarenahe Softwareentwicklung sammeln

Eigene Ideen umsetzen, bzw. Erfahrung sammeln um dies tun zu knnen

Erschaffen eines ernsthaften Instruments3. Konzept

3.1. SynthesizerFolgende Grafik soll den Aufbau des Synthesizers und das Zusammenspiel von Digital- und Analogtechnik verdeutlichen.

Wie man der oben Grafik entnehmen kann, besteht der digitale Teil des Gesammtsystems aus:

1. Der Klangerzeugung, realisiert in Form von 3 Oszillatoren die unabhngig von einander Sinus, Rechteck, Sgezahn und Rauschen erzeugen knnen.2. Dem Sequenzer, der Komposition von Sequenzen erlaubt, und ber eine 8x8 LED-Matrix bedien bar ist.Der analoge Teil des Systems leistet folgendes zur Formung des Signals:1. Ein aktives analoges multimode Filter

2. Ein analoger Verstrker, um Lautstrkeverlufe oder Tastenanschlge zu simulieren3. Zwei Hllkurven Generatoren, welche Steuerspannungen erzeugen, die wiederum Filter und VCA beeinflussen, bzw. steuern knnen

3.2. Klangerzeuger (DDS)Zur Klangerzeugung wurde hier das Verfahren der Direkt Digitalen Synthese implementiert. Im Folgenden mchte ich dieses Verfahren kurz erlutern.Ein Direkt Digitaler Synthesizer besteht mindestens aus den folgenden Bausteinen:

Einem festen Systemtakt, der Abtastfrequenz oder eng. Samplerate

Einer Tabelle welche eine Periode der zu erzeugenden Wellenform(en) enthlt, einem so genannten Look up Table (LuT) Einem Phasenakkumulator zur Adressierung des LuT Einem Digital-Analogwandler oder eng. DAC Einem Tiefpassfilter zur Glttung des Ausgangssignals Siehe nachfolgende Grafik.

1. TuningwordDas Tuningword ist ein Binrwort, welches dem Phasenakkumulator zugefhrt wird um ein Ausganssignal in einer bestimmten Frequenz zu erzeugen.

2. PhasenakkumulatorHier wird bei jedem Systemtakt der neue Phasenwert des zu erzeugenden Abtastwertes bestimmt. Wird der Phasenakkumulator getaktet luft die Funktion:

ab. 3. Phase TruncationDas Ergebnis des Phasenakkumulators, die neue Phase reprsentiert die Adresse des neuen Abtastwertes innerhalb des Look up Tables. Da der Phasenakkumulator in der Regel breiter ist als der Adressbereich des Look up Tables, ( hier z.b. 24bit, whrend der LuT nur einen Adressbereich von 8bit bietet) wird in der Phase Truncation die Bitbreite aus dem Phasenakkumulator auf den vom LuT gegebenen Adressraum angepasst. Man tut dies, indem man die niederwertigen Bit (LSB) abschneidet und nur die hherwertigen Bit (MSB) zur Adressierung verwendet.4. Look up Tableim LuT liegt jeweils eine Periode der zu erzeugenden Wellenformen vor.

5. Digital-Analogwandler (DAC)im DAC wird der momentane Amplitudenwert des aktuellen Abtastwerts erzeugt.

6. Tiefpassfilterdas Tiefpassfilter befreit das erzeugte Analogsignal von unerwnschten Frequenzkomponenten, erst er stellt die gewnschte Wellenform wieder her. Hier gilt das Theorem von Nyquist, was im Wesentlichen besagt, dass die Grenzfrequenz des Filters kleiner oder gleich der halben Taktfrequenz des Systems gewhlt werden sollte. 3.3. SequenzerDer hier verwendete Sequenzer zeichnet sich vor allem durch seine ungewhnliche Bedienung aus. Whrend herkmmliche Sequenzer meist verlangen jede zu spielende Note und deren Tonhhe einzeln zu bestimmen (siehe nachfolgender Grafik), stellt mein Matrix- Sequenzer bereits einen Pool von miteinander harmonierenden Notenwerten zur Verfgung, der die Grundlage einer jeden Sequenz darstellt, und so eine vollkommen andere Art des Komponierens ermglicht.Dieser Pool besteht in den meisten Fllen aus den Notenwerten einer bestimmten Skala, wie z.B. der wohl bekannten A-Moll Skala, es kann hier neben den Dur- und Mollskalen aus jeder beliebigen Kirchentonart beginnend mit jedem beliebigen Grundton gewhlt werden.Zustzlich stehen in Abhngigkeit der jeweiligen Tonart eine Vielzahl von Akkorden und Kadenzen zur Verfgung, um die der Notenpool erweitertet oder dezimiert werden kann.Die Komposition von Sequenzen erfolgt durch das Setzen sogenannter Events, die entweder einen Tastenaschlag auslsen, oder einen Wechsel der Tonart, des Grundtons oder des Akkords bewirken knnen. Man tut dies, indem man durch bettigen der Taster fr die jeweilige Zeile und Reihe, das einzelne Element der Matrix auswhlt, von dem ein Event ausgelst werden soll. Visualisiert wird ein aktiver Event durch das einschalten des LEDs, welches das jeweilige Element reprsentiert.

Der Notenpool und aktive Events stehen, anders als beim herkmmlichen Sequenzer, in keinem fest definierten Verhltnis zueinander, sondern knnen sich wie folgt verhalten:

Der Pool kann auf unterschiedliche Weise mit den Zeilen und Spalten der Matrix verknpft werden.

Die Matrix kann auf unterschiedliche Weise durchlaufen werden.

Events knnen von diversen Algorithmen automatisch generiert oder alteriert werden.

Nachfolgende Grafik soll den Unterschied zwischen diesen Beiden Modellen deutlich machen.

4. Hardware

4.1. Digitaler Schaltungsteil4.1.1. Verwendete Hardware

Als Hardwareplatform zur Realisierung des Projekts, wurden zwei 8Bit Mikrocontroller der Firma Atmel verwendet:

1. AVR#1 - Atmel AVR 8Bit RISC Atmega 8

8kb Flashspeicher

1kb SRAM 16Mhz

3x Timer

3x PWM

6x ADCDient als Klangerzeuger und implementiert die Direkt digitale Synthese

2. AVR#2 - Atmel AVR 8Bit RISC Atmega 32

32kb Flashspeicher

2kb SRAM 16Mhz

3x Timer

4x PWM

8x ADC

Dient als Sequenzer und steuert den Klangerzeuger

ISP: Als Programmieradapter kam eine einfache Selbstbaulsung zum Zug, (Link siehe Quellenverzeichnis) welche es durch lediglich 4 Widerstnden erlaubt smtliche 8Bit AVRs ber den LPT Port zu programmieren.

IDE: Als Programmierumgebung wurde das von Atmel stammende AVR-Studio zusammen mit dem freien C-Compiler avr-gcc verwendet.

4.1.2. Blockdiagramm

4.2. Analoger Schaltungsteil

Auf die theoretische Funktionsweise der analogen Schaltungsteile: Filter, Verstrker und Hllkurven wird hier nicht weiter eingegangen, da dies den Rahmen dieser Arbeit sprengen wrde. Alle analogen Schaltungen die hier verwendet wurden stammen aus selbstbau- Modularsystemen und wurden lediglich nachgebaut. Quellen hierfr sind im Anhang verlinkt.Trotzdem mir keine Zeit blieb mich ausgiebig mit dieser Thematik zu befassen, war es mir doch sehr wichtig zumindest mal so etwas gebaut zu haben, wodurch ich letztendlich auch unglaublich viel ber analoge Schaltungstechnik und Elektronik allgemein gelernt habe.

5. Software

5.1. Klangerzeugung

5.1.1. Abstrakt

Der Softwareteil der Klangerzeugung besteht im Wesentlichen aus 3 Teilen:

1. Programm- und I/O Initialisierungen

2. Endlosschleife innerhalb der Main Methodea. Benutzer- I/O berprfen, und aktualisieren

3. Interrupt Service Routine (ISR)

a. Tonhhe vom ADC lesen und aktualisieren

b. DDS ausfhren

c. Neuen Abtastwert auf DAC schreiben5.1.2. Direkt Digitale SyntheseDie DDS ist wie folgt implementiert:

Abtastrate = Interruptperiode generiert durch Timer0 Overflow Interrupt

Phasenakkumulator = 24bit Integer Variable OSCx_PhaseAccu Phase Truncation = 16bit rechts shift des Phasenakkumulators

Look Up Table = 8bit integer Array, abgelegt im Programmspeicher

DAC = Pulsweitenmodulation durch Timer1 / Timer2

Tuningword = 32bit integer Array mit Tuningwords fr den Gesamten Notenumfang (C0-C9)5.1.3. Definitionen

#define F_CPU 16000000UL

Definiert den Prozessortakt mit 16Mhz

#define PINOUT_OSC2 PB1

Ausgabepin des zweiten Oszillators

#define PINOUT_OSC1 PB2

Ausgabepin des ersten Oszillators

#define PINOUT_LFO PB3

Ausgabepin des Niederfrequenzoszillators

#define OSC1_WAVELED_DATA PD5

Datenpin des Schieberegisters zur Visualisierung der ausgewhlten Wellenform am Bedienfeld des ersten Oszillators#define OSC2_WAVELED_DATA PB4

Datenpin des Schieberegisters zur Visualisierung der ausgewhlten Wellenform am Bedienfeld des zweiten Oszillators

#define LFO_WAVELED_DATA PD6

Datenpin des Schieberegisters zur Visualisierung der ausgewhlten Wellenform am Bedienfeld des Niederfrequenzoszillators

#define ALL_WAVELED_MR PB0

Master-Resetpin des Schieberegisters zur Visualisierung der ausgewhlten Wellenform an allen Bedienfeldern

#define ALL_WAVELED_CLK PD7

Clockpin des Schieberegisters zur Visualisierung der ausgewhlten Wellenform an allen Bedienfeldern#define OSC1_WAVE_SELECT_BTN PD1

Eingabepin des Tasters zur Auswahl der Wellenform des ersten Oszillators

#define OSC1_OCTAVE_SELECT_BTN

Eingabepin des Tasters zur Auswahl der Oktave des ersten Oszillators

#define OSC2_WAVE_SELECT_BTN PD2

Eingabepin des Tasters zur Auswahl der Wellenform des zweiten Oszillators

#define OSC2_OCTAVE_SELECT_BTN PD3

Eingabepin des Tasters zur Auswahl der Oktave des zweiten Oszillators

#define LFO_WAVE_SELECT_BTN PD4

Eingabepin des Tasters zur Auswahl der Wellenform des Niederfrequenzoszillators

#define LFO_FREQ_POT PC5

Analogeingang Frequenz- Potentiometer des Niederfrequenzoszillators#define OSC1_DETUNE_POT PC4

Analogeingang Detune- Potentiometer des ersten Oszillators

#define OSC2_DETUNE_POT PC3

Analogeingang Detune- Potentiometer des zweiten Oszillators

#define CV_PITCH_IN PC2

Analogeingang Tonhhe des ersten Oszillators

#define CV_PITCH_IN2 PC1

Analogeingang Tonhhe des zweiten Oszillators5.1.4. Globale Variablen

volatile uint16_t isr_counter=0;

Countervariable, wird mit jeder Interruptperiode imkrementiert

volatile uint16_t ms_counter=0;

Countervariable, wird jede Millisekunde inkermentiert

volatile uint8_t OSC_gate =0;

Statusvariable,

volatile uint8_t OSC1_currentNote=0;

Aktueller Notenwert des ersten Oszillators

volatile uint8_t OSC2_currentNote=0;

Aktueller Notenwert des ersten Oszillators

volatile uint16_t LFO_currentFreq=0;

Aktuelle Ausgabefrequenz des Niederfrequenzoszillators

volatile uint8_t OSC1_octave=0;

Statusvariable, dient als index von OCTAVE_SELECT[]volatile uint8_t OSC2_octave=0;

Statusvariable, dient als index von OCTAVE_SELECT[]

volatile uint16_t OSC1_detune=0;

Aktueller Verstimmungswert des ersten Oszillators

volatile uint16_t OSC2_detune=0;

Aktueller Verstimmungswert des zweiten Oszillators

volatile uint8_t OSC1_Wave=0;

Statusvariable, dient als index von WAVEFORMS[]

volatile uint8_t OSC2_Wave=0;

Statusvariable, dient als index von WAVEFORMS[]

volatile uint8_t LFO_Wave=0;

Statusvariable, dient als index von WAVEFORMS[]

uint32_t OSC_calibration_offset=0;

Offset zur Korrektur der Ausgangsfrequenz

const uint8_t WAVE_SELECT[4] = {1,2,4,8 };

Array mit Konstanten fr die Wellenformauswahlconst uint8_t OCTAVE_SELECT[3] = { 64, 32, 16 };

Array mit Konstanten fr Oktaven- Umschaltung

const uint8_t *WAVEFORMS[4] = {sinewave,sawtoothwave,squarewave, userwave};

Array mit Zeigern auf die hinterlegten Look Up Tables

5.1.5. Interrupt Service Routine (ISR)Die Interruptperiode der ISR stellt die Abtastrate des Systems dar. Diese wurde hier auf 32khz festgelegt, was nach Nyquist erlaubt ein Signal mit bis zu 16khz erzeugen zu knnen.Ausgelst wird die ISR durch einen Overflow Interrupt in Timer0. Timer0 ist ein 8Bit Counter und wird alle 8- Systemtakte inkrementiert, erreicht der Counter einen bestimmten Compare-Match Wert (hier 192) , wird er zurckgesetzt und ein Overflow Interrupt ausgelst.Zur Berechnung der Timereinstellungen ist im Anhang ein Excel Sheet verlinkt.5.1.6. Blockdiagramm

.

5.2. Sequenzer

5.2.1. Abstrakt

Der Softwareteil des Sequenzers besteht im Wesentlichen aus folgenden Bestandteilen:

1. Programm und I/O Initialisierungen2. Endlosschleife innerhalb der Main() Funktion

a. Durchlaufen der Matrixb. Analoge Hllkurven triggern falls aktuelles Element aktiv ist

c. Taster zur Matrixsteuerung berprfen und nderungen Ausfhren

3. ISR 1 (Timer0 Overflow Interrupt)

a. Steuerspannung fr Synthmodul erzeugen

4. ISR 2 (Timer2 Overflow Interrupt)

a. Timing ableiten

b. Taster berprfen und nderungen ausfhren

c. LED-Matrix anzeigen5.2.2. Definitionen

#define LED_MATRIX_DATA1 PD2Datenleitung des ersten Schieberegisters zur Steuerung der LED Matrix

#define LED_MATRIX_DATA2 PD3

Datenleitung des zweiten Schieberegisters zur Steuerung der LED Matrix

#define LED_MATRIX_MR PD7Master- Resetpin der Schieberegister

#define LED_MATRIX_CLK PD6

Clockleitung der Schieberegister#define BUTTON_ROW PA0Analogeingang 8 Taster zur Reihenwahl der Matrix

#define BUTTON_COL PA1

Analogeingang 8 Taster zu Zeilenwahl der Matrix#define CV_PITCH_OUT1 PD4PWM Ausgang #1

#define CV_PITCH_OUT2 PD5PWM Ausgang #2

#define CV_GATE_OUT1 PC0Gate Ausgang zum triggern der analogen Hllkurven

#define CV_GATE_OUT2 PC1

Gate Ausgang zum triggern der analogen Hllkurven

#define LED_COL1_DATA PC6

Datenleitung Schieberegister #3

#define LED_COL2_DATA PC7

Datenleitung Schieberegister #4#define BUTTON_LEFT0 PB4Eingang Taster #1

#define BUTTON_RIGHT0 PD0

Eingang Taster #2

#define BUTTON_RIGHT1 PB3Eingang Taster #3

#define BUTTON_RIGHT2 PD1

Eingang Taster #45.2.3. Globale Variablenuint8_t const MOD_REF_MATRIX[8] = Referenzwerte fr Sequenzmodulation

uint16_t const RES_REF[8] =

Referenzwerte fr Modulation der Sequenzauflsungvolatile uint8_t LED_MatrixA[8][8] = {};

8x8 Array reprsentiert die 8x8 LED Matrix

volatile uint8_t LED_MatrixB[8][8] = {};

8x8 Array Puffer

volatile uint8_t LED_runMatrix[8][8] = { };uint8_t LED_ROW_left =0;

Anzeigewert LED Reihe auf Benutzeroberflcheuint8_t LED_ROW_right1 =0;

Anzeigewert LED Reihe auf Benutzeroberflcheuint8_t LED_ROW_right2 =0;

Anzeigewert LED Reihe auf Benutzeroberflche

volatile uint16_t ms_counter=0;

Zhlervariable, von ihr wird das globale Timing abgeleitet

volatile uint16_t step_counter=0;

Zhlervariable der Steps

volatile uint16_t bar_counter=0;

Zhlervariable der Takte

uint8_t mod_counter=16;

Zhlervariable gibt an wann moduliert warden soll

uint8_t seq_direction=0;

Laufrichtung des Sequenzers, vertical/horizontal

volatile uint8_t CV1_currentPitch=0;

Tonhhe des ersten Oszillators

volatile uint8_t CV2_currentPitch=0;

Tonhhe des zweiten Oszillators

volatile uint8_t currentNote=0;

Tonhhe des Sequenzers

volatile uint8_t currentScale[28]={0,0,0,0,0,0,0,0};

Hlt die aktive Skala

volatile uint8_t currentChord[3]= {0,2,4};

Hlt den aktiven Akkord

volatile uint8_t currentChordBaseNote=0;

Hlt den aktiven Grundton

volatile uint8_t currentMode=0;

Hlt den aktiven Sequenzermodus

uint8_t RES_counter=125;

Aktuelle Auflsung des Sequenzers

volatile uint8_t currentPitchSrc=0;

Aktive Quelle fr Tonhheninformation

volatile uint8_t *currentLEDMatrix= &LED_MatrixA[0][0];

Zeiger auf aktive Matrixvolatile uint8_t currentCadence[4] = { 0, 3,4,7 };

Hlt die aktive Kadenzvolatile uint8_t majorScale[28] =

Hlt die C-Dur Skala als Grundlage fr die Generierung weitererervolatile uint8_t currentSequence[64 = ]

Hlt die aktuelle Sequenz

5.2.4. Intterupt Service RoutineDer Sequenzer arbeitet mit zwei Interrupt Service Routinen:

1. ISR1 Timer0 Overflow Interruptdieser Interrupt taktet, genau wie beim Synthesizer- Modul den DAC, der in diesem Fall jedoch kein Audio-, sondern ein Steuerspannungssignal (CV) erzeugt.Dieses Signal enthlt die Tonhheninformationen des Sequenzers und wird dem Synthesizer zugefhrt, der es wiederum digitalisiert und die entsprechende Tonhhe ausliest.

2. ISR 2 Timer2 Overflow Interruptdie Interruptperiode von Timer2 betrgt 1ms, von ihr wird das Timing des Sequenzers abgeleitet.5.2.5. Blockdiagramm

6. Probleme

Im allgemeinen gab es glcklicherweise kaum bzw. keine greren Probleme, der Softwareteil des Projekts verlief grtenteils reibungslos und auch sonst konnte ich fast alle meine Ziele verwirklichen, einzig allein die Implementierung digitaler Effekte musste ich streichen, da die Hardwareressourcen der verwendeten Mikrocontroller, insbesondere deren RAM dafr nicht ausreichend dimensioniert waren.

7. Fazit Fr mich war dieses Projekt ein voller Erfolg, der Lerneffekt war riesig, noch viel grer als ich gedacht htte. Zu Beginn des Projekts konnte noch kaum Widerstand und Kondensator unterscheiden, geschweige denn Schaltplne lesen oder gar zeichnen, heute kenne ich Pinbelegungen auswendig und spreche fast flieend binr ( Das Entwickeln von Software auf unterstem Level und die damit verbundenen Mglichkeiten haben mich sehr begeistertet und auch bis jetzt nicht losgelassen. Auch wenn dieses Projekt offiziell hiermit abgeschlossen ist, bleibt noch einiges zu tun, und ich freue mich jetzt schon daran weiterzuarbeiten und vor allem damit zu spielen.

Alles in allem hat dieses Projekt unglaublich viel zu meinem Gesammtverstndnis fr Hardwarevorgnge, sowie digitale Audiotechnik, aber auch Elektronik beigetragen und ich kann nur froh sein meine Zeit in dieses Projekt investiert zu haben.

8. Quellen1. Infos rund um AVR und Mikrocontroller

a. http://www.mikrocontroller.netb. http://www.scienceprog.com 2. Datenbltter und Applicationotes zu den verwendeten Mikrocontrollern

a. www.atmel.com3. Direkt Digitale Synthese

a. http://en.wikipedia.org/wiki/Direct_digital_synthesisb. http://www.scienceprog.com/category/avr-controlled-signal-generator/c. http://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator4. AVR Programmieradapter (ISP)

a. http://mikrocontroller.com/de/isp.php5. AVR Programmierumgebung (IDE)

a. http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=27256. AVR C-Compiler (avr-gcc)

a. http://winavr.sourceforge.net/7. DIY Modular Synth (Analogtechnik)a. Ren Schmitz

http://www.uni-bonn.de/~uzs159/

b. Yves Usson

http://yusynth.net/Modular/index.htmlc. Forum

http://www.sequencer.de/synthesizer/8. Schaltplne (analoger Schaltungsteil)

a. Filter (VCF)

http://yusynth.net/archives/ElectronicDesign/N-Steiner-VCF-1974.pdfb. Verstrker (VCA)http://yusynth.net/Modular/index.htmlc. Hllkurven (ADSR) http://www.uni-bonn.de/~uzs159/9. Anhnge1. Quellcode inkl. Avr-Studio Projekt des Synthesizer Moduls

2. Quellcode inkl. Avr-Studio Projekt des Sequencer Moduls

3. Excel Sheet fr smtliche Berechnungen (Tuningwords, Timer, R/C Filter)

4. Power Point Prsentation vom Prsentationstag

Hllkurven Generator

HllkurvenGenerator

Sequenzer

Analog

Digital

AtMega8

AtMega32

DDS

ADC

DAC

LuT

SinusRechteck

UI

DAC

UI

LuT

Sequenzer

CV to Pitch conversion

Taster

LED-Matrix

Taster

LEDs

Analoger- Schaltungsteil

Tiefpass-Filter

Abtastfrequenz

Tuningword

AnalogesAusgangsignal

Digitale Phasenwerte

Abtastwerte aus LuT

Quantisiertes Signal

Digital erzeugte Wellenform

Herkmmlicher Sequenzer

Matrix Sequenzer

Legende

Poti

LED

Taster

Tonhhe

(AN), wenn Note gesetzt

Note setzen

1 2 3 4 5 6 7 8

8 x Einzelnoten = 1 Takt

LED

Taster

Legende

Takte oder Einzelnoten

Note setzen

(AN), wenn Note gesetzt

Takte oder Einzelnoten

Klangerzeuger

Tonhhe der einzelnen Noten liegen im Pool bereit und werden auf die Matrix abgebildet.

Sequenzer

Includes

Defines

Globale Variablen

Init()

While(1) {

}

init() {

}

Programminitialisierung

int main (void) {

ISR(TIMER0_OVF_vect) {

}

Increment isr_counter

Synchronize ms_counter

Read Pitch from ADC

run the DDS and output new value to DAC

Initialize I/O Ports

Initialize Timer0 (samplefreq.)

Initialize Timer1 (DAC 1+2)

Initialize Timer2 (DAC 3)

Enable global Interrupts

Check Input pins

Switch Modes

checkButtons() {

}

checkButtons()

setLEDS()

Read ADCs and updateglobal variables

checkPots() {

}

Write display-values to shiftregisters

setLEDS() {

}

checkPots()

doSeqMode()

Check if current step is set

If it is, trigger Envelope to generate a NoteOn

checkStep() {

}

Switch to current mode

Do the actual sequencing

doSeqMode() {

}

checkStep()

checkButtonMatrix()

Read ADCs to find out which Buttons have been pressed

Update current Matrix

checkButtonMatrix() {

}

Initialize I/O Ports

Initialize Timer0 (samplefreq.)

Initialize Timer1 (DAC 1+2)

Initialize Timer2 (Mux freq.)

Enable global Interrupts

Clk DAC and output new CV value

ISR(TIMER0_OVF_vect) {}

init() {

}

While(1) {

}

Init()

Globale Variablen

Defines

Includes

int main (void) {

Programminitialisierung

ISR(TIMER2_OVF_vect) {

}

Ms_counter++

Sychronize to 100ms

displayLedMatrix()

checkButtons()

Calculate control words for shiftregisters

Transfer data in serial

displayLedMatrix() {

}

Check for User input

Update states

checkButtons() {

}

Betreuender Professor: Prof. Walter Kriha

Seite | 19