Projektdokumentation Kai Aras Ss08
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