Paso 2: botones!
Si tienes problemas con los interruptores, lee esto:
http://www.Ladyada.net/Learn/Arduino/lesson5.html
Aquí está el código del blog de RCarduino:
Auduino, Lo-Fi sintetizador granular
//
por Peter Knight, Tinker.it http://tinker.it
//
Ayuda: http://code.google.com/p/tinkerit/wiki/Auduino
Más ayuda: http://groups.google.com/group/auduino
//
Analógica de 0: 1 echada del grano
Analógica 1: decaimiento de grano 2
Analógica de 2: 1 deterioro del grano
Analógica 3: tono de grano 2
Analógica 4: frecuencia de repetición del grano
//
Digital 3: Audio (Digital 11 en ATmega8)
//
Changelog:
19 de noviembre de 2008: se agrega soporte para tableros de ATmega8
21 de marzo de 2009: añadido soporte para las placas ATmega328
07 de abril de 2009: vector de interrupción fija para los tableros del ATmega328
08 de abril de 2009: añadido soporte para tableros de ATmega1280 (Arduino Mega)
#include
#include
syncPhaseAcc de uint16_t;
syncPhaseInc de uint16_t volátil;
uint16_t grainPhaseAcc;
uint16_t volátiles grainPhaseInc;
uint16_t grainAmp;
volátiles uint8_t grainDecay;
grain2PhaseAcc de uint16_t;
grain2PhaseInc de uint16_t volátil;
grain2Amp de uint16_t;
grain2Decay de uint8_t volátiles;
Mapa de canales analógicos
#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
Cambio de estos se requiere también reescribir audioOn()
#if defined(__AVR_ATmega8__)
//
En antiguas placas de ATmega8.
Salida es el 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__)
//
En el Arduino Mega
Salida está en el 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
//
Para las modernas placas ATmega168 y ATmega328
Salida está en el 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
Retardo del buffer de anillo muy sencillo
se registra la salida en esta matriz
y luego hacia atrás con la salida como envuelve el buffer
puede encender y apagar mediante un botón en DELAY_BUTTON
#define MAX_DELAY 1024
unsigned char sDelayBuffer [MAX_DELAY];
unsigned int nDelayCounter = 0;
unsigned char bDelay;
#define DELAY_BUTTON 4
Lisa mapeo logarítmico
//
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 (entrada uint16_t) {}
volver (antilogTable [entrada & 0x3f]) >> (entrada >> 6);
}
Caminó mapeo cromático
//
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 (entrada uint16_t) {}
volver (midiTable[(1023-input) >> 3]);
}
Caminó asignación pentatónica
//
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 (entrada uint16_t) {}
valor de uint8_t = (1023-entrada) / (1024/53);
retorno (pentatonicTable[value]);
}
void audioOn() {}
#if defined(__AVR_ATmega8__)
ATmega8 tiene diferentes registros
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
Configurar el PWM a 31.25 kHz, fase precisa
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);
modo pin y activar tire hacia arriba para por defecto el modo
es PENTATÓNICO, hale el pasador de baja para cambiar para suavizar
pinMode(SMOOTH_PIN,INPUT);
digitalWrite(SMOOTH_PIN,HIGH);
}
void loop() {}
El circuito es bastante simple, simplemente actualiza los parámetros de los osciladores.
//
Evitar el uso de las funciones que hacen uso extensivo de las interrupciones, o desactivar interrupciones.
Causarán clics y poops en el audio.
por defecto es pentatónicas tonos escalonados, pasador de halar baja de frecuencia uniforme sin tonos distintos
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));
actualizada 29/01/2013
Hale el pasador de DELAY_BUTTON alto demora, baja sin retraso
uso sea un tirón up/pull-down resistor
o un tirón para arriba resistencia con un interruptor de palanca entre el perno y la tierra
bDelay = digitalRead(DELAY_BUTTON);
Caminó a notas MIDI: C, Db, D, Eb, E, f el....
syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
Caminó asignación pentatónica: 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)
{
valor de uint8_t;
uint16_t de salida;
syncPhaseAcc += syncPhaseInc;
Si (syncPhaseAcc < syncPhaseInc) {}
Momento de comenzar el siguiente grano
grainPhaseAcc = 0;
grainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^ = 1 << LED_BIT; Más rápido que usando digitalWrite
}
Incremento de la fase de los osciladores de grano
grainPhaseAcc += grainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;
Convertir la fase en una onda triangular
valor = (grainPhaseAcc >> 7) & 0xff;
Si (grainPhaseAcc & 0x8000) valor = ~ valor;
Multiplicar por la actual amplitud de grano para obtener muestra
salida = valor * (grainAmp >> 8);
Repita para el segundo grano
valor = (grain2PhaseAcc >> 7) & 0xff;
Si (grain2PhaseAcc & 0x8000) valor = ~ valor;
salida += valor * (grain2Amp >> 8);
Hacer el grano del decaen de las amplitudes por un factor de cada muestra (decaimiento exponencial)
grainAmp-= (grainAmp >> 8) * grainDecay;
grain2Amp-= (grain2Amp >> 8) * grain2Decay;
Escala de la salida a la gama disponible, recorte si es necesario
salida >> = 9;
Si la salida (salida > 255) = 255;
Duane B
rcarduino.blogspot.com
15/11/2012
Agregar un botón para configurar bDelay true o false para encender y apagar demora
if(bDelay)
{
Salida de PWM (esto es más rápido que usando analogWrite)
Aquí agregamos el buffer de retardo para el valor de salida, esto produce
un efecto de eco sutil, el búfer de retardo es buqe reproduciendo el sonido de
1/8 de segundo atrás.
LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida + (sDelayBuffer[nDelayCounter])) >> 1;
Añadir la nueva salida en el búfer para que podamos usar cuando el buffer se envuelve luego
sDelayBuffer [nDelayCounter] = PWM_VALUE;
nDelayCounter ++;
if(nDelayCounter == MAX_DELAY)
{
nDelayCounter = 0;
}
}
otra cosa
{
LED_PORT & = ~ (1 << LED_BIT); Más rápido que usando digitalWrite
PWM_VALUE = salida;
}
}