Auduino (Lo-fi Synth voor arduino) (4 / 5 stap)

Stap 4: De code


Kunt u de sketch downloaden hier of u kunt gewoon plak de onderstaande code op uw programma van de arduino en beginnen met het uploaden.

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

uint16_t syncPhaseAcc;
uint16_t syncPhaseInc;
uint16_t grainPhaseAcc;
uint16_t grainPhaseInc;
uint16_t grainAmp;
uint8_t grainDecay;
uint16_t grain2PhaseAcc;
uint16_t grain2PhaseInc;
uint16_t grain2Amp;
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)

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

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

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.

Soepele frequentie toewijzing
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;

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

Uitvoer naar PWM (dit is sneller dan het gebruik van analogWrite)
PWM_VALUE = output;
}

Gerelateerde Artikelen

Digitale Synth VRA8-X voor Arduino Uno

Digitale Synth VRA8-X voor Arduino Uno

Gemaakt door ISGK instrumentenhttps://github.com/risgk/Digital-synth-vra8-xConceptExperimentele Synthesizer voor Arduino UnoFunctiesMonofoon Synthesizer (of MIDI Sound Module)Serial MIDI In (38400 bps), PWM Audio-uitgang (Pin 6), PWM tarief: 62500 Hz
CupBots - 3D afgedrukt Robotic platform voor Arduino en Raspberry Pi

CupBots - 3D afgedrukt Robotic platform voor Arduino en Raspberry Pi

Hier is een geweldig weekend robotica project uit te voeren met vrienden of mensen op uw lokale maker-ruimte. Je moet een 3D-printer handig om 3D print de STL-bestanden bijgevoegd als onderdeel van de volgende stappen en een beker, in mijn geval, ik
Het gebruik van Inkscape voor Arduino labels en projecten

Het gebruik van Inkscape voor Arduino labels en projecten

Een jaar geleden kwam ik een artikel in noten en volt Magazine over het maken van professioneel uitziende panelen voor projecten. Het artikel wordt op lijn en verklaart het veel beter dan ik kan, met veel meer detail. Ik verzoek u om de uitstekende t
Multi-functie automatisch verplaatsen Smart auto voor Arduino

Multi-functie automatisch verplaatsen Smart auto voor Arduino

ICStation team delen deze open source om de multi-functie automatisch verplaatsen slimme auto met alle elektronische DIY hobbyisten te maken. Het is de derde auto die we kennismaken met u en u kan een vergelijking met de twee vorige. De multi-functie
Oplossing: avrdude stk500_getsync(): niet in sync resp = 0x30 fout voor Arduino

Oplossing: avrdude stk500_getsync(): niet in sync resp = 0x30 fout voor Arduino

zodat de lezer weet: dit artikel beschrijft de belangrijkste oorzaken voor dit probleem, maar sommige van de andere Instructable gebruikers hebben gevonden wat "niche" oorzaken voor het probleem dat niet in dit artikel werden bedekt en worden be
Oplaadbare batterij Pack voor Arduino

Oplaadbare batterij Pack voor Arduino

Hallo, alle!!U hebt veel gewerkt aan een nieuw prototype met Arduino en eindelijk klaar na het u laten zien aan je vrienden het fantastische en revolutionaire idee wilt (of niet) van het product dat u hebt gemaakt!En over de krachtbron en draagbaarhe
DIY eenvoudige Shield Output geleid voor Arduino UNO R3

DIY eenvoudige Shield Output geleid voor Arduino UNO R3

Arduino uno niet gebruikt zonder externe Shield. We kunnen chared in deze tutorial hoe maak je uit Sheid voor arduino met behulp van de 4-delige LED.Stap 1: Schematische Shield LED output voor arduino Dit schema wordt uitgelegd hoe het conectod op pi
ECG shield voor Arduino

ECG shield voor Arduino

Onlangs maakte ik shield voor arduino die ECG, ademhaling, uiteindelijk na enkele veranderingen in PCB en code, EEG en EMG kan meten. Groot voordeel van deze shield is de mogelijkheid om het gemakkelijk thuis te maken. Het schild is uitgerust met dis
Het maken van een androïde toepassing voor Arduino (LED Turn on/off)

Het maken van een androïde toepassing voor Arduino (LED Turn on/off)

hier hebben we een androïde toepassing die gebruikmaakt van ecllipsedeze toepassing inschakelen leidde op arduino.deze toepassing werkt ook in je LAN.Hardware vereist:1: arduino uno2: arduino ethernet Shield3: RJ45-kabel4: LED5. android telefoonDe so
SensoDuino: Zet uw Androïde telefoon in een draadloze sensoren Hub voor Arduino

SensoDuino: Zet uw Androïde telefoon in een draadloze sensoren Hub voor Arduino

UPDATES23 november 2013: SensoDuino 0.160 krijgt een links.19 nov. 2031: advies: de fantastische synergie tussen Arduino & Android.19 november 2013: SensoDuino 0.159 is uit. Android telefoon datum (y, m, d) en tijd (h, m, s) worden ondersteund als se
Een beginnersgids voor Arduino

Een beginnersgids voor Arduino

Na enkele jaren van experimenteren met Arduino, besloten heb ik dat het tijd is om te delen van de kennis die ik heb verworven. Dus ik hier het gaat, een gids voor Arduino, met de blote basisprincipes voor beginners en sommige meer geavanceerde uitle
9 volt batterij adapter voor Arduino

9 volt batterij adapter voor Arduino

dit is super eenvoudig, maar zeer nuttig als u in een haast bent of graag dingen zelf te doen en op de weg kans dat u niet wist, dit over de gemakkelijkste manier is om mobiele macht toevoegen aan je Arduino.Na het kijken naar een aantal batterij Ver
Registreerapparaat voor Arduino Over seriële poort

Registreerapparaat voor Arduino Over seriële poort

Ik ben beetje moe van het gebruik van seriële als logger - voornamelijk om twee redenen: het sprintf syntaxis niet ondersteunt en tekenreeks worden vastgehouden in RAM. Om deze reden die ik heb uitgevoerd nieuwe bibliotheek: https://github.com/maciej
Touche voor Arduino: Advanced touch sensing.

Touche voor Arduino: Advanced touch sensing.

Update: nieuwe interface - blik op de laatste stap.Credits: Arduino sensing gedaan door DZL, verwerking van schets en Instructable gedaan door Mads Hobye.Disney Research lab ontworpen een nieuwe manier om te ontdekken van de Aanraking. U kunt een vid