After explaining the project in posts 1 and 2, now let's code into the Arduino Due.
Please refer to the main post : http://groovuino.blogspot.fr/2013/03/the-goal-is-to-build-groovebox-using.html
You can use the USB cable with Programming Port. For now, no need to external power supply. all components used have very low power needs. When we'll add LCD, it will be necessary.
First of all, download the groovuino library on guithub :
https://github.com/Gaetino/Groovuino
Then copy the folder into the library of your arduino folder.
If you haven't got yet, download the latest arduino environment here :
http://arduino.cc/en/Main/Software
Be careful to take the one working with Arduino Due.
Now, we'll code a synth which is working with the groovuino hardware.
Now we instantiate the voices and their volume envelopes, and the filter. For the moment, there will be just 1 voice, we'll make a mono synth.
We need some status :
We have to include the analogread.h function AFTER having instantiated envelopes, oscillators and filter, because it's using these objects.
Initialization (setup function)
The loop function will be only used to read sensor and potentiometers data.
Finally, the 44 kHz loop, where we have to read oscillators values
To be continued...
Please refer to the main post : http://groovuino.blogspot.fr/2013/03/the-goal-is-to-build-groovebox-using.html
You can use the USB cable with Programming Port. For now, no need to external power supply. all components used have very low power needs. When we'll add LCD, it will be necessary.
First of all, download the groovuino library on guithub :
https://github.com/Gaetino/Groovuino
Then copy the folder into the library of your arduino folder.
If you haven't got yet, download the latest arduino environment here :
http://arduino.cc/en/Main/Software
Be careful to take the one working with Arduino Due.
Now, we'll code a synth which is working with the groovuino hardware.
Libraries
First, before making any code, import all the libraries you need :
#include <arduino.h>
#include <osc.h>
#include <env.h>
#include <filter.h>
#include <sequencer.h>
#define POLIPHONY 1
int notes[POLIPHONY];
#include <interface.h>
#include <arp.h>
#include <timer.h>
#include <osc.h>
#include <env.h>
#include <filter.h>
#include <sequencer.h>
#define POLIPHONY 1
int notes[POLIPHONY];
#include <interface.h>
#include <arp.h>
#include <timer.h>
Now we instantiate the voices and their volume envelopes, and the filter. For the moment, there will be just 1 voice, we'll make a mono synth.
Osc oscA[POLIPHONY];
Env env1[POLIPHONY];
LowPassFilter LP;
Env env1[POLIPHONY];
LowPassFilter LP;
We need some status :
boolean play = false;
boolean mono = true;
boolean mono = true;
We have to include the analogread.h function AFTER having instantiated envelopes, oscillators and filter, because it's using these objects.
#include <analogread.h>
Initialization (setup function)
void setup()
{
// Defining pots and sensors
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(A6, INPUT);
// Loading osc tables
createSineTable();
createSawTable();
createSqTable();
// Start the audio engine
startTimer(TC1, 1, TC4_IRQn, 44100);
analogWrite(DAC1,0);
// Set filter default values
LP.setCutoffFreq(255);
LP.setResonance(1);
for(int i=0; i<POLIPHONY; i++)
{
oscA[i].init();
env1[i].init();
notes[i]=0;
}
play=false;
analogcontroller_init();
// Set the glide time at 2 ms
oscA[0].setGlideTime(2);
init_interface();
}
{
// Defining pots and sensors
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(A6, INPUT);
// Loading osc tables
createSineTable();
createSawTable();
createSqTable();
// Start the audio engine
startTimer(TC1, 1, TC4_IRQn, 44100);
analogWrite(DAC1,0);
// Set filter default values
LP.setCutoffFreq(255);
LP.setResonance(1);
for(int i=0; i<POLIPHONY; i++)
{
oscA[i].init();
env1[i].init();
notes[i]=0;
}
play=false;
analogcontroller_init();
// Set the glide time at 2 ms
oscA[0].setGlideTime(2);
init_interface();
}
The loop function will be only used to read sensor and potentiometers data.
void loop()
{
read_input();
analogcontroller_read();
}
{
read_input();
analogcontroller_read();
}
Finally, the 44 kHz loop, where we have to read oscillators values
void TC4_Handler()
{
TC_GetStatus(TC1, 1);
int32_t ulOutput=2048;
// load oscillator value
oscA[0].next();
ulOutput += oscA[0].output();
// apply filter effect
if(ulOutput>10) ulOutput = LP.next(ulOutput);
// apply envelope
ulOutput = (ulOutput * env1[0].amount())>>19;
// apply global volume
ulOutput = (ulOutput*volsynth)>>7;
if(ulOutput>4095) ulOutput=4095;
dacc_write_conversion_data(DACC_INTERFACE, ulOutput);
}
{
TC_GetStatus(TC1, 1);
int32_t ulOutput=2048;
// load oscillator value
oscA[0].next();
ulOutput += oscA[0].output();
// apply filter effect
if(ulOutput>10) ulOutput = LP.next(ulOutput);
// apply envelope
ulOutput = (ulOutput * env1[0].amount())>>19;
// apply global volume
ulOutput = (ulOutput*volsynth)>>7;
if(ulOutput>4095) ulOutput=4095;
dacc_write_conversion_data(DACC_INTERFACE, ulOutput);
}
To be continued...
No comments:
Post a Comment