Hur att lägga till knappen har Peter riddarens Auduino projektet (3 / 4 steg)
Steg 3: Fler knappar!
Paus inslag jag lagt har också vissa bakgrundsljud som jag tror är på grund av dröjsmål funktion. Kunde inte bli av med det, men i kort pressar du inte märker, är det bara om du tryck på pausknappen för mer sedan en stund och bara inträffar när potentiometrar är extrema ståndpunkter.
Jag använde dessa knappar:
http://www.adafruit.com/products/1010
De är färgglada, stora och roliga att trycka på. De löda in PCB ganska trevligt.
På denna punkt lödda jag också upp hela projektet till en proto sköld att göra det mer robust och kompakt.
Här är Peter Knight koden från Rcarduinos blogg med pausknappen och knappen "svagt" att jag lagt den sorteringen snedvrida-y sänker volymen när du trycker. Det gör en cool percussiva element vid vissa frekvenser. Pausknappen är riktigt roligt att spela med, också.
Auduino, Lo-Fi granulat synthesizer
//
av Peter Knight, Tinker.it http://tinker.it
//
Hjälp: http://code.google.com/p/tinkerit/wiki/Auduino
Mer hjälp: http://groups.google.com/group/auduino
//
Analog i 0: korn 1 pitch
Analog i 1: korn 2 förfall
Analog i 2: 1 förfalla av spannmål
Analog i 3: korn 2 pitch
Analog i 4: korn upprepning frekvens
//
Digital 3: Audio out (Digital 11 på ATmega8)
//
Ändringsloggen:
19 Nov 2008: lagt till stöd för ATmega8 styrelser
21 Mar 2009: lagt till stöd för ATmega328 styrelser
7 Apr 2009: fast avbrottsvektor för ATmega328 brädor
8 Apr 2009: lagt till stöd för ATmega1280 styrelser (Arduino Mega)
#include
#include
uint16_t syncPhaseAcc;
flyktiga uint16_t syncPhaseInc;
uint16_t grainPhaseAcc;
flyktiga uint16_t grainPhaseInc;
uint16_t grainAmp;
flyktiga uint8_t grainDecay;
uint16_t grain2PhaseAcc;
flyktiga uint16_t grain2PhaseInc;
uint16_t grain2Amp;
flyktiga uint8_t grain2Decay;
Karta analoga kanaler
#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
Ändra dessa kommer kräver också skriva om audioOn()
#if defined(__AVR_ATmega8__)
//
På gamla ATmega8 styrelser.
Produktionen är på stift 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__)
//
På Arduino Mega
Produktionen är på stift 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 moderna ATmega168 och ATmega328 styrelser
Produktionen är på stift 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
Mycket enkel ring buffert dröjsmål
vi spela in utdata i den här matrisen
och sedan blanda det igen med produktionen som bufferten sveper runt
kan slås på och av genom en knapp på DELAY_BUTTON
#define MAX_DELAY 1024
unsigned char sDelayBuffer [MAX_DELAY];
unsigned int nDelayCounter = 0;
unsigned char bDelay;
#define DELAY_BUTTON 10
följande exempel fo delay-effekt, introducting osignerade variabel och defingint han pinout för puase effekt
unsigned char bSync;
unsigned char bPause;
#define PAUSE_BUTTON 12
#define SYNC_BUTTON 11
4,5,10
Smidig logaritmisk kartläggning
//
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 ingång) {
Return (antilogTable [input & 0x3f]) >> (ingång >> 6);
}
Klev kromatisk kartläggning
//
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 ingång) {
Return (midiTable[(1023-input) >> 3]);
}
Klev pentatoniska kartläggning
//
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 ingång) {
uint8_t värde = (1023-ingång) / (1024/53);
avkastning (pentatonicTable[value]);
}
void audioOn() {
#if defined(__AVR_ATmega8__)
ATmega8 har olika 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
Ställ in PWM till 31.25 kHz, fasen exakt
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);
ställa in min knappar som insatsvaror, följande exempel på delay-effekt
pinMode (SYNC_BUTTON, indata);
pinMode (PAUSE_BUTTON, indata);
Ange pin-läge och aktivera dra så som standardläge
är PENTATONIC, dra stiftet låg växla för att jämna
pinMode(SMOOTH_PIN,INPUT);
digitalWrite(SMOOTH_PIN,HIGH);
}
void loop() {
Slingan är ganska enkel - det uppdaterar bara parametrarna för oscillatorerna.
//
Undvik att använda alla funktioner som gör omfattande användning av avbrott eller inaktivera avbrott.
De kommer att orsaka klick och bajsar i ljudet.
pentatoniska klev toner, pull pin låg för smidig frekvens utan distinkta toner som standard
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));
uppdaterad 29/01/2013
dra DELAY_BUTTON stiftet hög för försening, låg för någon försening
Använd antingen en pull up/dra ner motstånd
eller en dra upp motstånd med en vippströmbrytare mellan stift och marken
bDelay = digitalRead(DELAY_BUTTON);
bSync = digitalRead(SYNC_BUTTON);
bPause = digitalRead(PAUSE_BUTTON);
Klev mappning till MIDI-noter: C, Db, D, Eb, E, F...
syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
Klev pentatoniska mappning: 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 värde;
uint16_t utgång;
syncPhaseAcc += syncPhaseInc;
om (syncPhaseAcc < syncPhaseInc) {
Dags att börja nästa säden
grainPhaseAcc = 0;
grainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^ = 1 << LED_BIT; Snabbare än med digitalWrite
}
Öka fasen av korn oscillatorer
grainPhaseAcc += grainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;
Konvertera fas i en triangel våg
värde = (grainPhaseAcc >> 7) & 0xff;
om (grainPhaseAcc & 0x8000) värde = ~ värde;
Multiplicera med nuvarande korn amplitud att få prov
output = värde * (grainAmp >> 8);
Upprepa på andra spannmål
värde = (grain2PhaseAcc >> 7) & 0xff;
om (grain2PhaseAcc & 0x8000) värde = ~ värde;
utgång += värde * (grain2Amp >> 8);
Gör säden amplituder klinga med en faktor av varje prov (exponentiell decay)
grainAmp-= (grainAmp >> 8) * grainDecay;
grain2Amp-= (grain2Amp >> 8) * grain2Decay;
Skala till det tillgängliga utbudet, klippning vid behov
utgång >> = 9;
om (output > 255) output = 255;
Duane B
rcarduino.blogspot.com
15/11/2012
lägga till en knapp för att ställa in bDelay sant eller falskt att sätta försening på och stänga
IF(bDelay)
{
Utgång till PWM (detta är snabbare än att använda analogWrite)
Vi lägger här dröjsmål bufferten till produktionsvärde, detta ger
en subtil ekoeffekt, dröjsmål bufferten är effektivt spela upp ljudet från
1/8th av en sekund sedan.
LED_PORT | = 1 << LED_BIT; Snabbare än med digitalWrite
PWM_VALUE = (utgång + (sDelayBuffer[nDelayCounter])) >> 1.
lägga till ny utdata till bufferten så vi kan använda det när bufferten nästa sveper runt
sDelayBuffer [nDelayCounter] = PWM_VALUE;
nDelayCounter ++;
IF(nDelayCounter == MAX_DELAY)
{
nDelayCounter = 0;
}
}
annat
{
LED_PORT & = ~ (1 << LED_BIT); Snabbare än med digitalWrite
PWM_VALUE = produktion;
}
Kyle
ta exemplet från ovan och försöker lägga till en dunkande paus och dim funktion till knappen 11 och 12
det fungerar och men är svårt att få förseningen och paus att arbeta tillsammans, ibland när det är paus, det finns bakgrundsljud nu
om (bSync)
{
genom att lämna det tomt, är delay-effekt tillåtet att arbeta, i stället för att skrivas över av vad jag hade här
}
annat
{
++ gör en ljusreglering effekt
LED_PORT | = 1 << LED_BIT; Snabbare än med digitalWrite
PWM_VALUE = (output ++) >> 1;
}
lagt till en annan effekt som något dämpas ljudet
om (bPause)
{
}
annat
{
flytta bitarna på skalan att få en "paus"-knappen fungerade bra!
LED_PORT | = 1 << LED_BIT; Snabbare än med digitalWrite
PWM_VALUE = (output << 50) >> 1;
}
}