Auduino (Lo-fi Synth para arduino) (4 / 5 paso)

Paso 4: El código

Puede descargar el bosquejo aquí o usted puede simplemente pegar el siguiente código en su programa de arduino y empezar a subir.

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 < avr/io.h >
#include < avr/interrupt.h >

syncPhaseAcc de uint16_t;
syncPhaseInc de uint16_t;
uint16_t grainPhaseAcc;
uint16_t grainPhaseInc;
uint16_t grainAmp;
uint8_t grainDecay;
grain2PhaseAcc de uint16_t;
grain2PhaseInc de uint16_t;
grain2Amp de uint16_t;
grain2Decay de uint8_t;

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)

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

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);
}

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.

Asignación de frecuencia uniforme
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;

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
syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));

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;

Salida de PWM (esto es más rápido que usando analogWrite)
PWM_VALUE = salida;
}

Artículos Relacionados

Sintetizador digital VRA8-P para Arduino Uno

Sintetizador digital VRA8-P para Arduino Uno

Hecho por ISGK instrumentoshttps://github.com/risgk/digital-Synth-vra8-pConcepto3 voz sintetizador polifónico de Pseudo para Arduino UnoCaracterísticasVoz 3 Pseudo Polyphonic Synthesizer (sintetizador de Paraphonic), módulo de sonido MIDISerial MIDI
Sintetizador digital VRA8-X para Arduino Uno

Sintetizador digital VRA8-X para Arduino Uno

Hecho por ISGK instrumentoshttps://github.com/risgk/digital-Synth-vra8-xConceptoExperimental sintetizador para Arduino UnoCaracterísticasMonophonic sintetizador (o módulo de sonido MIDI)Serial MIDI en (38400 bps), tasa de salida (Pin 6), de Audio PWM
Sintetizador digital VRA8-M para Arduino Uno

Sintetizador digital VRA8-M para Arduino Uno

Hecho por ISGK instrumentoshttps://github.com/risgk/digital-Synth-vra8-mConceptoSintetizador monofónico (módulo de sonido MIDI) para Arduino UnoCaracterísticasSerial MIDI en (38400 bps), tasa de salida (Pin 6), de Audio PWM PWM: 62500 hertziosTarifa
CupBots - 3D plataforma robótica impresa para Arduino y frambuesa Pi

CupBots - 3D plataforma robótica impresa para Arduino y frambuesa Pi

Aquí es un proyecto de robótica de gran fin de semana para emprender con amigos o gente en su espacio local del fabricante. Usted necesitará una impresora 3D práctico 3D impresión los archivos STL adjuntan como parte de los pasos a continuación y una
ArduDroid: Un Simple 2-Way Bluetooth controlador basado en Android para Arduino

ArduDroid: Un Simple 2-Way Bluetooth controlador basado en Android para Arduino

ACTUALIZACIONES:19 de noviembre. 2031: opinión: la increíble sinergia entre Arduino y Android.30 de octubre de 2013: Andruino está ahora oficialmente ARDUDROID y pronto estará disponible en Google Play. Este cambio de nombre para evitar conflicto con
Caja para Arduino con corte láser - Uno, Mega, Leonardo, Yun

Caja para Arduino con corte láser - Uno, Mega, Leonardo, Yun

Una caja para nuestras tarjetas Arduino, es un gran aliado para protegerlas y manipularlas de forma más sencilla. ¿Y qué mejor forma para conseguir una caja para tu Arduino fabricarla tú mismo?En este Instructable encontrarás los archivos para fabric
SensoDuino: Convertir su teléfono Android en un concentrador de sensores inalámbricos para Arduino

SensoDuino: Convertir su teléfono Android en un concentrador de sensores inalámbricos para Arduino

Actualizaciones23 de noviembre de 2013: SensoDuino 0.160 obtiene una cara izquierda.19 de noviembre. 2031: opinión: la increíble sinergia entre Arduino y Android.19 de noviembre de 2013: SensoDuino 0.159 está hacia fuera. Fecha teléfono Android (y, m
Batería recargable para Arduino

Batería recargable para Arduino

Hola, todos!Han trabajado mucho en un nuevo prototipo con Arduino y finalmente después terminé desea mostrar a sus amigos la idea fantástica y revolucionaria (o no) del producto que ha creado!¿Fuente de energía y portabilidad?¿El lugar que vas tiene
Touche para Arduino: avanzado sensor de tacto.

Touche para Arduino: avanzado sensor de tacto.

Actualización: nueva interfaz - mira el último paso.Créditos: Arduino detección realizada por DZL, procesamiento de bosquejo y Instructable realizado por Hobye Mads.Laboratorio de investigación de Disney diseñó una manera novedosa de detección táctil
Timbre para Arduino 'Interface'

Timbre para Arduino 'Interface'

Hola todo el mundoEn mi primer Instructable quiero mostrarle cómo construir un timbre fácil y barato para Arduino 'Interfaz' por lo que puede hacer que tu Arduinoproject Haz dispara a través de él o simplemente utilizar tu Arduino como una campana.Po
Adaptador de batería de 9 voltios para Arduino

Adaptador de batería de 9 voltios para Arduino

esto es super sencillo pero muy útil si usted tiene prisa o como hacer las cosas a ti mismo y en la posibilidad de que no sabía, esto es acerca de la manera más fácil de agregar energía móvil a tu Arduino.Después de mirar un número de soluciones de e
Multi-función automática mueve inteligente del coche para Arduino

Multi-función automática mueve inteligente del coche para Arduino

ICStation equipo compartir esta fuente abierta de hacer automático de múltiples funciones mover coche elegante con todos los aficionados bricolaje electrónicos. Es el tercer coche que presentamos a usted y usted puede hacer una comparación con los do
Conexión ESP8266-01 para Arduino UNO / MEGA y BLYNK

Conexión ESP8266-01 para Arduino UNO / MEGA y BLYNK

Este es un tutorial para mostrar cómo flash firmware a ESP8266-01 y conectarse a Blynk con un ESP8266 - 01 como un Arduino wifi shield.Hardware necesario:* Arduino Uno/Mega* Jumper cables* USB al cable del USB B* ESP8266-01Software necesario:Para fac
Salida de escudo Simple DIY LED para Arduino UNO R3

Salida de escudo Simple DIY LED para Arduino UNO R3

Arduino uno no utiliza sin escudo externo. En este tutorial podemos chared cómo hacer Sheid para arduino usando 4 unidades LED.Paso 1: Salida esquema de pantalla de LED para arduino Este esquema explica cómo se conectod al pin digital a arduino uno R