Stap 2: knoppen!
Als u problemen met schakelaars ondervindt, lees dit:
http://www.ladyada.net/Learn/Arduino/lesson5.html
Hier is de code van de RCarduino blog:
Auduino, de Lo-Fi granular synthesizer
//
door Peter Knight, Tinker.it http://tinker.it
//
Help: http://code.google.com/p/tinkerit/wiki/Auduino
Meer informatie: http://groups.google.com/group/auduino
//
Analoge in 0: 1 worp van graan
Analoge in 1: graan 2 verval
Analoge in 2: 1 verval van graan
Analoog in 3: graan 2 toonhoogte
Analoge in 4: graan herhaling frequentie
//
Digitale 3: Audio-uitgang (digitale 11 op ATmega8)
//
Changelog:
19 Nov 2008: Added support voor ATmega8 boards
21 Mar 2009: Added support voor ATmega328 boards
7 Apr 2009: vaste interruptvector voor ATmega328 boards
8 Apr 2009: toegevoegde ondersteuning voor ATmega1280 boards (Arduino Mega)
#include
#include
uint16_t syncPhaseAcc;
vluchtige uint16_t syncPhaseInc;
uint16_t grainPhaseAcc;
vluchtige uint16_t grainPhaseInc;
uint16_t grainAmp;
vluchtige uint8_t grainDecay;
uint16_t grain2PhaseAcc;
vluchtige uint16_t grain2PhaseInc;
uint16_t grain2Amp;
vluchtige uint8_t grain2Decay;
Kaart analoge kanalen
#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
Wijzigt deze zal ook, moet herschrijven van audioOn()
#if defined(__AVR_ATmega8__)
//
Op oude ATmega8 boards.
Uitvoer is op 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__)
//
Op de Arduino Mega
Uitvoer is op 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
//
Voor moderne ATmega168 en ATmega328 boards
Uitvoer is op 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
Zeer eenvoudige ring buffer vertraging
Wij registreren de uitvoer in deze array
en meng het vervolgens terug met de output als de buffer terugloopt
in- en uitschakelen kunnen worden ontstoken door een knop op de DELAY_BUTTON
#define MAX_DELAY 1024
unsigned char sDelayBuffer [MAX_DELAY];
unsigned int nDelayCounter = 0;
unsigned char bDelay;
#define DELAY_BUTTON 4
Soepele logaritmische toewijzing
//
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 (ingang uint16_t) {}
retourneren (antilogTable [input & 0x3f]) >> (ingang >> 6);
}
Stapte chromatische toewijzing
//
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 (ingang uint16_t) {}
retourneren (midiTable[(1023-input) >> 3]);
}
Stapte pentatonische toewijzing
//
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 (ingang uint16_t) {}
uint8_t waarde = (1023-input) / (1024/53);
terugkeer (pentatonicTable[value]);
}
ongeldig audioOn() {}
#if defined(__AVR_ATmega8__)
ATmega8 heeft verschillende registers
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 instellen voor 31,25 kHz, fase nauwkeurig
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 instellen en inschakelen van pull up, zodat die standaard modus
is PENTATONIC, trek de pin laag om over te schakelen om te glad
pinMode(SMOOTH_PIN,INPUT);
digitalWrite(SMOOTH_PIN,HIGH);
}
void loop {}
De lus is vrij eenvoudig - het werkt alleen de parameters voor de oscillatoren.
//
Vermijd het gebruik van alle functies die uitgebreid gebruik van interrupts maken of interrupts uitschakelen.
Zij zal leiden tot klikken en poept in de audio.
de standaardinstelling is pentatonische getrapt tonen, pull pin laag voor soepele frequentie zonder afzonderlijke tonen
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));
bijgewerkt 29/01/2013
Trek de DELAY_BUTTON pin hoog voor vertraging, laag voor geen vertraging
Gebruik ofwel een pull up/pull-down weerstand
- of een pull up weerstand met een schakelaar tussen de pin en grond
bDelay = digitalRead(DELAY_BUTTON);
Stapte toewijzen aan MIDI notities: C met Db, D, Eb, E, F...
syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
Stapte pentatonische toewijzing: 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 waarde;
uint16_t output;
syncPhaseAcc += syncPhaseInc;
Als (syncPhaseAcc < syncPhaseInc) {}
Tijd om te beginnen de volgende korrel
grainPhaseAcc = 0;
grainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^ = 1 << LED_BIT; Sneller dan met behulp van digitalWrite
}
_ / / Verhogen de fase van de korrel oscillatoren
grainPhaseAcc += grainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;
Fase omzetten in een driehoek golf
waarde = (grainPhaseAcc >> 7) & 0xff;
Als (grainPhaseAcc & 0x8000) waarde = ~ waarde;
Vermenigvuldig met huidige graan amplitude om monster
uitvoer = value * (grainAmp >> 8);
Herhaal voor tweede graan
waarde = (grain2PhaseAcc >> 7) & 0xff;
Als (grain2PhaseAcc & 0x8000) waarde = ~ waarde;
uitgang += waarde * (grain2Amp >> 8);
Maken van de korrel amplitudes verval met een factor van elke steekproef (exponentiële afname)
grainAmp-= (grainAmp >> 8) * grainDecay;
grain2Amp-= (grain2Amp >> 8) * grain2Decay;
Schaal output naar het beschikbare bereik, knippen indien nodig
uitvoer >> = 9;
als output (uitgang > 255) = 255;
Duane B
rcarduino.blogspot.com
15/11/2012
toevoegen van een knop om te stellen bDelay true of false om de vertraging inschakelen en uitschakelen
if(bDelay)
{
Uitvoer naar PWM (dit is sneller dan het gebruik van analogWrite)
Hier voegen we de buffer vertraging aan de output waarde, dit levert
een subtiele echo-effect, de buffer vertraging is bemanning herhalen van het geluid van
1/8ste van een seconde geleden.
LED_PORT | = 1 << LED_BIT; Sneller dan met behulp van digitalWrite
PWM_VALUE = (output + (sDelayBuffer[nDelayCounter])) >> 1;
de nieuwe uitvoer toevoegen aan de buffer, zodat we het gebruiken kunnen wanneer de buffer volgende wraps rond
sDelayBuffer [nDelayCounter] = PWM_VALUE;
nDelayCounter ++;
if(nDelayCounter == MAX_DELAY)
{
nDelayCounter = 0;
}
}
anders
{
LED_PORT & = ~ (1 << LED_BIT); Sneller dan met behulp van digitalWrite
PWM_VALUE = output;
}
}