Schritt 2: Tasten!
Wenn Sie mit Schaltern Probleme, die lesen Sie dies:
http://www.LadyAda.NET/Learn/Arduino/lesson5.HTML
Hier ist der Code aus dem RCarduino Blog:
Auduino, die Lo-Fi körnige Synthesizer
//
von Peter Ritter, Tinker.it http://tinker.it
//
Hilfe: http://code.google.com/p/tinkerit/wiki/Auduino
Weitere Informationen: http://groups.google.com/group/auduino
//
Analog in 0: 1 Stellplatz Korn
Analog in 1: Korn 2 Zerfall
Analog in 2: 1 Zerfall Korn
Analog in 3: Korn 2 Pitch
Analog in 4: Korn-Folgefrequenz
//
Digitale 3: Audio out (digitale 11 auf ATmega8)
//
Changelog:
19. November 2008: zusätzliche Unterstützung für ATmega8-Boards
21. März 2009: zusätzliche Unterstützung für ATmega328 Boards
7. April 2009: feste Interrupt-Vektor für ATmega328 Boards
8. April 2009: zusätzliche Unterstützung für ATmega1280-Boards (Arduino Mega)
#include
#include
uint16_t SyncPhaseAcc;
volatile uint16_t SyncPhaseInc;
uint16_t GrainPhaseAcc;
volatile uint16_t GrainPhaseInc;
uint16_t GrainAmp;
volatile uint8_t GrainDecay;
uint16_t grain2PhaseAcc;
volatile uint16_t grain2PhaseInc;
uint16_t grain2Amp;
volatile uint8_t grain2Decay;
Map-analoge Kanäle
#define SYNC_CONTROL (4)
#define GRAIN_FREQ_CONTROL (0)
#define GRAIN_DECAY_CONTROL (2)
#define GRAIN2_FREQ_CONTROL (3)
#define GRAIN2_DECAY_CONTROL (1)
DB
#define SMOOTH_PIN 8
Diese Änderung wird auch erfordert umschreiben audioOn()
#if defined(__AVR_ATmega8__)
//
Auf alten ATmega8 Brettern.
Ausgabe ist auf Pin 11
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_PIN 11
#define PWM_VALUE OCR2
#define PWM_INTERRUPT TIMER2_OVF_vect
#elif defined(__AVR_ATmega1280__)
//
Auf dem Arduino Mega
Ausgabe ist auf Pin 3
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 7
#define PWM_PIN 3
#define PWM_VALUE OCR3C
#define PWM_INTERRUPT TIMER3_OVF_vect
#else
//
Für moderne ATmega168 und ATmega328 boards
Ausgabe ist auf Pin 3
//
#define PWM_PIN 3
#define PWM_VALUE OCR2B
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_INTERRUPT TIMER2_OVF_vect
#endif
Duane B
rcarduino.blogspot.com
15.11.2012
Sehr einfache Anrufverzögerung Puffer
Wir erfassen die Ausgabe in diesem array
und mischen Sie es wieder mit der Ausgabe, da der Puffer umfließt
ein- und Ausschalten per Knopfdruck auf DELAY_BUTTON umschaltbar
#define MAX_DELAY 1024
unsigned Char sDelayBuffer [MAX_DELAY];
unsigned Int nDelayCounter = 0;
unsigned Char bDelay;
#define DELAY_BUTTON 4
Glatte logarithmischen Zuordnung
//
uint16_t AntilogTable [] = {}
64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109,
54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341,
45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968,
38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768
};
uint16_t MapPhaseInc (uint16_t Eingang) {}
zurück (AntilogTable [Eingang & 0x3f]) >> (Eingang >> 6);
}
Farbliche Zuordnung trat
//
uint16_t MidiTable [] = {}
17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,
77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231,
244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691,
732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742,
1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143,
4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854,
10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879,
22121,23436,24830,26306
};
uint16_t MapMidi (uint16_t Eingang) {}
zurück (midiTable[(1023-input) >> 3]);
}
Abgestufte pentatonischen Zuordnung
//
uint16_t PentatonicTable [54] = {}
0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346,
411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288,
3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306
};
uint16_t MapPentatonic (uint16_t Eingang) {}
uint8_t Wert = (1023-Input) / (1024/53);
Rückkehr (pentatonicTable[value]);
}
void audioOn() {}
#if defined(__AVR_ATmega8__)
ATmega8 hat verschiedene Register
TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
TIMSK = _BV(TOIE2);
#elif defined(__AVR_ATmega1280__)
TCCR3A = _BV(COM3C1) | _BV(WGM30);
TCCR3B = _BV(CS30);
TIMSK3 = _BV(TOIE3);
#else
PWM soll 31,25 kHz, Phase genau
TCCR2A = _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
TIMSK2 = _BV(TOIE2);
#endif
}
void setup() {}
pinMode(PWM_PIN,OUTPUT);
audioOn();
pinMode(LED_PIN,OUTPUT);
pinMode(DELAY_BUTTON,INPUT);
Pin-Modus eingestellt und ziehen sich schalten, damit das Standard-Modus
ist PENTATONIK, ziehen Sie den Stift niedrig, um glatt zu wechseln
pinMode(SMOOTH_PIN,INPUT);
digitalWrite(SMOOTH_PIN,HIGH);
}
void loop() {}
Die Schleife ist ziemlich einfach - es wird nur die Parameter für die Oszillatoren.
//
Verwenden Sie keine Funktionen, die umfangreiche Verwendung von Interrupts zu machen, oder deaktivieren Sie Interrupts.
Sie werden dazu führen, dass Klicks und kackt in der Audio.
der Standardwert ist pentatonisch abgestuften Tönen, Pull Pin niedrig für glatte Frequenz ohne verschiedene Töne
SyncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
SyncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));
aktualisierte 29.01.2013
ziehen Sie den DELAY_BUTTON Stift für Verzögerung, für keine Verzögerung niedrig hoch
Verwendung entweder ein Pull Up/Pull-down-Widerstand
oder ein Pull-up Widerstand mit einem Kippschalter zwischen Pin und Masse
bDelay = digitalRead(DELAY_BUTTON);
Trat, Zuordnung zu MIDI-Noten: Db, D, Eb, C, E, F...
SyncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
Pentatonik Zuordnung trat: D, E, G, A, B
GrainPhaseInc = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
GrainDecay = analogRead(GRAIN_DECAY_CONTROL) / 8;
grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
grain2Decay = analogRead(GRAIN2_DECAY_CONTROL) / 4;
}
SIGNAL(PWM_INTERRUPT)
{
uint8_t Wert;
uint16_t Ausgang;
SyncPhaseAcc += SyncPhaseInc;
Wenn (SyncPhaseAcc < SyncPhaseInc) {}
Zeit, um den nächsten Strich beginnen
GrainPhaseAcc = 0;
GrainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^ = 1 << LED_BIT; Schneller als mit DigitalWrite
}
Erhöhen Sie die Phase der Korn-Oszillatoren
GrainPhaseAcc += GrainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;
Phase in einem Dreieck Welle umwandeln
Wert = (GrainPhaseAcc >> 7) & 0xff;
Wenn (GrainPhaseAcc & 0 x 8000) Wert = ~ Wert;
Multiplizieren Sie mit aktuellen Korn Amplitude zu Probe zu erhalten
Ausgang = Wert * (GrainAmp >> 8);
Wiederholen Sie für zweite Korn
Wert = (grain2PhaseAcc >> 7) & 0xff;
Wenn (grain2PhaseAcc & 0 x 8000) Wert = ~ Wert;
Ausgabe += Wert * (grain2Amp >> 8);
Machen das Korn Amplituden Verfall um den Faktor jedes Sample (exponentielle Zerfall)
GrainAmp = (GrainAmp >> 8) * GrainDecay;
grain2Amp = (grain2Amp >> 8) * grain2Decay;
Skala, die Ausgabe auf die Reichweite, Zuschneiden, ggf.
Ausgang >> = 9;
Wenn Ausgang (Ausgang > 255) = 255;
Duane B
rcarduino.blogspot.com
15.11.2012
Fügen Sie eine Schaltfläche legen Sie bDelay True oder False, wenn Verzögerung aktivieren bzw. deaktivieren
If(bDelay)
{
Ausgabe auf PWM (Dies ist schneller als die Verwendung von AnalogWrite)
Hier wir der Ausgabewert der Verzögerung Puffer hinzu, so entsteht
eine subtile Echo-Effekt ist der Verzögerung Puffer wiedergeben von Sound aus effectivley
1/8 Sekunde vor.
LED_PORT | = 1 << LED_BIT; Schneller als mit DigitalWrite
PWM_VALUE = (Ausgang + (sDelayBuffer[nDelayCounter])) >> 1;
Fügen Sie die neue Ausgabe in den Puffer hinzu, damit wir es nutzen können, wenn der Puffer als nächstes umfließt
sDelayBuffer [nDelayCounter] = PWM_VALUE;
nDelayCounter ++;
If(nDelayCounter == MAX_DELAY)
{
nDelayCounter = 0;
}
}
anderes
{
LED_PORT & = ~ (1 << LED_BIT); Schneller als mit DigitalWrite
PWM_VALUE = Ausgang;
}
}