From 6efd54202750093db4303424e59b29e737a6ebde Mon Sep 17 00:00:00 2001 From: Mike Lynch Date: Sun, 21 Jan 2024 16:37:01 +1100 Subject: [PATCH] Two more experiments --- BeepBox/BeepBox.ino | 116 ++++++++++++++++++++++++++++++++++++ Noisemakers/Noisemakers.ino | 81 +++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 BeepBox/BeepBox.ino create mode 100644 Noisemakers/Noisemakers.ino diff --git a/BeepBox/BeepBox.ino b/BeepBox/BeepBox.ino new file mode 100644 index 0000000..159357a --- /dev/null +++ b/BeepBox/BeepBox.ino @@ -0,0 +1,116 @@ +//waveform generator + +// hacked from https://www.instructables.com/Arduino-Waveform-Generator-1/ + +#include +#include + +Adafruit_MCP4728 mcp; + +#define nsamp 32 +#define dacmax 256 + +const byte nclk = 200; // a guess +long int freq; //frequency in Hz +long unsigned int phase; +long unsigned int phase_inc; + +int note = 0; +int gate; +int decay = 2; + +float pattern[4]; + +long unsigned int pattern_inc[4]; + +void setup() { + TIMSK0 &= ~_BV(TOIE0); // disable timer0 overflow interrupt + + cli(); + +//set timer1 interrupt at 1Hz + TCCR1A = 0;// set entire TCCR1A register to 0 + TCCR1B = 0;// same for TCCR1B + TCNT1 = 0;//initialize counter value to 0 + // set compare match register for 1hz increments + OCR1A = 3905;// = (16*10^6) / (1*1024) - 1 (must be <65536) + // turn on CTC mode + TCCR1B |= (1 << WGM12); + // Set CS10 and CS12 bits for 1024 prescaler + TCCR1B |= (1 << CS12) | (1 << CS10); + // enable timer compare interrupt + TIMSK1 |= (1 << OCIE1A); + + sei(); + + + Serial.begin(115200); + + if (!mcp.begin(0x64)) { + while (1) { + delay(100); + } + } + +// mcp.setSpeed(400000L); +// mcp.setSpeed(800000L); + mcp.setSpeed(800000L); + + freq=440; + phase=0; + pattern[0] = 110.0; + pattern[1] = 82.40688922821751; + pattern[2] = 97.99885899543737; + pattern[3] = 82.40688922821751; + + for( int i = 0; i < 4; i++ ) { + pattern_inc[i] = pattern[i] * 975592.231884058; + } + + setwave(); +} + +const float pi=3.14159265; +byte waveform[nsamp]; +byte phaseb = 0; +void setwave(){ + for (int isamp=0; isamp 3 ) { + note = 0; + } + phase_inc = pattern_inc[note]; + gate = 4095; +} + + + +void loop() { + phase += phase_inc; + int redphase = phase >> 27; + mcp.fastWrite(waveform[redphase] << 4, gate, 0, 0); + if( gate > 0 ) { + gate -= decay; + } +} + diff --git a/Noisemakers/Noisemakers.ino b/Noisemakers/Noisemakers.ino new file mode 100644 index 0000000..df3a85c --- /dev/null +++ b/Noisemakers/Noisemakers.ino @@ -0,0 +1,81 @@ +// Very basic Karplus-Strong + +// based on this explanation http://sites.music.columbia.edu/cmc/MusicAndComputers/chapter4/04_09.php + + +#include +#include + +Adafruit_MCP4728 mcp; + +#define nsamp 128 +#define dacmax 256 + +unsigned int phase; +unsigned int repeats; + + +void setup() { + + + cli(); + +//set timer1 interrupt at 1Hz + TCCR1A = 0;// set entire TCCR1A register to 0 + TCCR1B = 0;// same for TCCR1B + TCNT1 = 0;//initialize counter value to 0 + // set compare match register for 1hz increments + //OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536) + //OCR1A = 7812;// = (16*10^6) / (1*1024) - 1 (must be <65536) + OCR1A = 1952; + // turn on CTC mode + TCCR1B |= (1 << WGM12); + // Set CS10 and CS12 bits for 1024 prescaler + TCCR1B |= (1 << CS12) | (1 << CS10); + // enable timer compare interrupt + TIMSK1 |= (1 << OCIE1A); + + sei(); + + + Serial.begin(115200); + + if (!mcp.begin(0x64)) { + while (1) { + delay(100); + } + } + +// mcp.setSpeed(400000L); +// mcp.setSpeed(800000L); + mcp.setSpeed(800000L); + + randomSeed(analogRead(A0)); + + phase=0; +} + +byte waveform[nsamp]; +void pluck(){ + for (int i=0; i nsamp ) { + phase = 0; + } + s2 = waveform[phase]; + waveform[p0] = ( s1 & s2 ) + ((s1 ^ s2) >> 1); + mcp.fastWrite(s1 << 4, 0, 0, 0); +} + +ISR(TIMER1_COMPA_vect){//timer1 interrupt 1Hz + pluck(); +} +