Paso 3: Más botones!
La función de pausa añadí también tiene cierto ruido de fondo que creo que es debido a la función de retardo. No podía deshacerse de él, pero en pulsaciones cortas que no se dan cuenta, es sólo si pulsa el botón de pausa para más luego un momento y sólo se produce cuando los potenciómetros están en posiciones extremas.
Utilicé estos botones:
http://www.Adafruit.com/products/1010
Son coloridos, grandes y diversión para presionar. De la soldadura en PCB muy bonita.
En este punto también soldar encima de todo el proyecto de un escudo de proto para que sea más robusto y compacto.
Aquí está el código de Peter Knight del blog de RCArduino con el botón de pausa y el botón "dim" que he añadido a ese tipo de distorsión y baja el volumen cuando presiona. Es un elemento de percusión fresco en algunas frecuencias. El botón de pausa es muy divertido para jugar, también.
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 10
siguiente ejemplo fo retraso efecto, presentación variable unsigned y defingint pinout para el efecto puase
unsigned char bSync;
unsigned char bPause;
#define PAUSE_BUTTON 12
#define SYNC_BUTTON 11
4,5,10
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);
ajuste mis botones como entradas, el siguiente ejemplo del efecto de retardo
pinMode (SYNC_BUTTON, entrada);
pinMode (PAUSE_BUTTON, entrada);
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);
bSync = digitalRead(SYNC_BUTTON);
bPause = digitalRead(PAUSE_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;
}
Kyle
tomando el ejemplo de arriba y tratando de agregar una pausa de percusión y función dim botón 11 y 12
funciona y es difícil que el retraso y la pausa para trabajar juntos, a veces cuando está en pausa, hay ruido de fondo ahora
Si (bSync)
{
por dejar este espacio en blanco, el efecto de retardo se permite trabajar, en lugar de ser sobrescritos por lo que había aquí
}
otra cosa
{
++ hace un efecto de atenuación
LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida ++) >> 1;
}
añadido otro efecto que incrementa ligeramente el sonido
Si (bPause)
{
}
otra cosa
{
cambiando los bits la escala para obtener un botón de "pausa" funcionó bien!
LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida << 50) >> 1;
}
}