Stap 3: Meer knoppen!
De pauze functie die ik toegevoegd heeft ook wat achtergrond lawaai dat ik denk dat is vanwege de vertraging-functie. Kon niet ontdoen van het, maar in korte persen die niet opvalt, is het alleen als je druk op de pauzeknop voor meer dan een moment, en treedt alleen op wanneer de potentiometers in extreme standpunten zijn.
Ik gebruikte deze knoppen:
http://www.adafruit.com/products/1010
Ze zijn kleurrijk, groot en leuk te drukken. Ze soldeer in de PCB vrij aardig.
Op dit punt ik ook gesoldeerd op het hele project aan een proto-shield om er meer stevig en compact.
Hier is de code van de Peter Knight uit RCArduino de blog met de pauzeknop en de "dim" knop, dat ik heb toegevoegd dat soort verstoren-y verlaagt het volume wanneer gedrukt. Het maakt een koele percussieve element bij sommige frequenties. De pauzeknop is echt leuk om mee te spelen, ook.
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 10
na voorbeeld fo vertraging effect, niet-ondertekende variabele introducting en defingint hij pinout voor het puase-effect
unsigned char bSync;
unsigned char bPause;
#define PAUSE_BUTTON 12
#define SYNC_BUTTON 11
4,5,10
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);
mijn knoppen instellen als input, volgende voorbeeld van het effect van de vertraging
pinMode (SYNC_BUTTON, INPUT);
pinMode (PAUSE_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);
bSync = digitalRead(SYNC_BUTTON);
bPause = digitalRead(PAUSE_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;
}
Kyle
in het voorbeeld van hierboven nemen en proberen een percussieve pauze en dim functie toevoegen aan knop 11 en 12
het werkt en maar is moeilijk te krijgen van de vertraging en de pauze werken samen, soms als deze is onderbroken, er nu achtergrondgeluiden
Als (bSync)
{
door dit leeg laat, is het effect van de vertraging toegestaan om te werken, in plaats van worden overschreven door wat ik had hier
}
anders
{
++ maakt een dimmen effect
LED_PORT | = 1 << LED_BIT; Sneller dan met behulp van digitalWrite
PWM_VALUE = (uitgang ++) >> 1;
}
een ander effect die licht het geluid dimt toegevoegd
Als (bPause)
{
}
anders
{
verschuiving van de bits uit de schaal om een "pauze" knop werkte goed!
LED_PORT | = 1 << LED_BIT; Sneller dan met behulp van digitalWrite
PWM_VALUE = (uitgang << 50) >> 1;
}
}