Compare commits
	
		
			2 Commits
		
	
	
		
			8c983f187b
			...
			9542bbee1a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9542bbee1a | ||
| 
						 | 
					aa11f1cc25 | 
							
								
								
									
										65
									
								
								08Clouds/08Clouds.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								08Clouds/08Clouds.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
			
		||||
// Basic demo for configuring the MCP4728 4-Channel 12-bit I2C DAC
 | 
			
		||||
#include <Adafruit_MCP4728.h>
 | 
			
		||||
#include <Wire.h>
 | 
			
		||||
 | 
			
		||||
Adafruit_MCP4728 mcp;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// idea behind this - sequence a cloud of gate events
 | 
			
		||||
 | 
			
		||||
// 1 3 5 7 hexany log2
 | 
			
		||||
int bpm = 135;
 | 
			
		||||
float beat_s = 60.0 / (float)bpm;
 | 
			
		||||
int beat_m = round(1000.0 * beat_s); 
 | 
			
		||||
float mod_b = 3.141592653589793 / 4.0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gate = 0;
 | 
			
		||||
int gatel = 1000;
 | 
			
		||||
int tick = 16;
 | 
			
		||||
long init_t;
 | 
			
		||||
float p_gate = 0.0;
 | 
			
		||||
 | 
			
		||||
void setup(void) {
 | 
			
		||||
  Serial.begin(115200);
 | 
			
		||||
  while (!Serial)
 | 
			
		||||
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
 | 
			
		||||
 | 
			
		||||
  if (!mcp.begin(0x64)) {
 | 
			
		||||
    Serial.println("Failed to find MCP4728 chip");
 | 
			
		||||
    while (1) {
 | 
			
		||||
      delay(10);
 | 
			
		||||
    }
 | 
			
		||||
    Serial.println("MCP4728 initialised");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  init_t = millis();
 | 
			
		||||
 | 
			
		||||
  mcp.setChannelValue(MCP4728_CHANNEL_B, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
  if( gate > 0 ) {
 | 
			
		||||
    gate--;
 | 
			
		||||
    if( gate == 0 ) {
 | 
			
		||||
      mcp.setChannelValue(MCP4728_CHANNEL_B, 0);
 | 
			
		||||
    } 
 | 
			
		||||
  } else {
 | 
			
		||||
    long now = millis();
 | 
			
		||||
    long mod_t = now - init_t;
 | 
			
		||||
    tick--;
 | 
			
		||||
    if( tick == 0 ) {
 | 
			
		||||
      tick = 16;
 | 
			
		||||
      p_gate = sin(mod_b * (float)mod_t / (float)beat_m);
 | 
			
		||||
    }
 | 
			
		||||
    if( (float)random(10000) / 100.0 < abs(p_gate)) {
 | 
			
		||||
      mcp.setChannelValue(MCP4728_CHANNEL_B, 4095);
 | 
			
		||||
      gate = gatel;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										104
									
								
								097TET/097TET.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								097TET/097TET.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
// Basic demo for configuring the MCP4728 4-Channel 12-bit I2C DAC
 | 
			
		||||
#include <Adafruit_MCP4728.h>
 | 
			
		||||
#include <Wire.h>
 | 
			
		||||
 | 
			
		||||
Adafruit_MCP4728 mcp;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// 1 3 5 7 hexany log2
 | 
			
		||||
float tuning[22];
 | 
			
		||||
// bassline
 | 
			
		||||
//int pitch[] = { 1,    2,     -1,    0, -1,    1,   -1, 0,    -1,     1,   -1 };
 | 
			
		||||
//float dur[] = { 0.25, 0.25, 0.5, 0.25, 0.5, 0.25, 0.5, 0.25, 0.5, 0.25, 0.5  };
 | 
			
		||||
// kick
 | 
			
		||||
//int pitch[] = { 1,    -1,    1, -1, 1,    -1,    1, -1, 1  };
 | 
			
		||||
//float dur[] = { 0.25, 0.75, 0.25, 0.75, 0.25, 0.75, 0.25, 0.75};
 | 
			
		||||
int pitch[] = { 9,    7,     5,    3, 8,    6,   5, 3 };
 | 
			
		||||
float dur[] = { 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float gate = 0.25;
 | 
			
		||||
int bpm = 140;
 | 
			
		||||
int phrase = 8;
 | 
			
		||||
float beat_s = 60.0 / (float)bpm;
 | 
			
		||||
int beat_m = round(1000.0 * beat_s); 
 | 
			
		||||
float voltrange = 4.85;  // measured this, probably not accurate
 | 
			
		||||
float octave = 4096.0 / voltrange; // number of DAC steps in an octave
 | 
			
		||||
float mod_b = 3.141592653589793 / 4.0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int s;
 | 
			
		||||
bool noteon = false;
 | 
			
		||||
long play_t;
 | 
			
		||||
long release_t;
 | 
			
		||||
long last_t;
 | 
			
		||||
long init_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void setup(void) {
 | 
			
		||||
  Serial.begin(115200);
 | 
			
		||||
  while (!Serial)
 | 
			
		||||
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
 | 
			
		||||
 | 
			
		||||
  if (!mcp.begin(0x64)) {
 | 
			
		||||
    Serial.println("Failed to find MCP4728 chip");
 | 
			
		||||
    while (1) {
 | 
			
		||||
      delay(10);
 | 
			
		||||
    }
 | 
			
		||||
    Serial.println("MCP4728 initialised");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  mcp.setChannelValue(MCP4728_CHANNEL_B, 0);
 | 
			
		||||
 | 
			
		||||
  float n0 = 0;
 | 
			
		||||
  for( int i = 0; i < 22; i++ ) {
 | 
			
		||||
    tuning[i] = round(n0 + octave * (float)i / 7.0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  s = 0;
 | 
			
		||||
  release_t = 0;
 | 
			
		||||
  play_t = 0;
 | 
			
		||||
  last_t = millis();
 | 
			
		||||
  init_t = last_t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
  long now = millis();
 | 
			
		||||
  if( noteon ) {
 | 
			
		||||
    if( now - last_t > release_t ) {
 | 
			
		||||
      noteOff();
 | 
			
		||||
      last_t = now;
 | 
			
		||||
      play_t = round(beat_m * dur[s] * (1.0 - gate));
 | 
			
		||||
      noteon = false;
 | 
			
		||||
      s += 1;
 | 
			
		||||
      if( s == phrase ) {
 | 
			
		||||
        s = 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if( now - last_t > play_t ) {
 | 
			
		||||
      noteOn(pitch[s]);
 | 
			
		||||
      last_t = now;
 | 
			
		||||
      release_t = round(beat_m * dur[s] * gate);
 | 
			
		||||
      noteon = true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // sychronise this better
 | 
			
		||||
  long mod_t = (now - init_t);
 | 
			
		||||
  float mod = 0.5 + 0.5 * sin(mod_b * (float)mod_t / (float)beat_m);
 | 
			
		||||
  mcp.setChannelValue(MCP4728_CHANNEL_C, round(4095.0 * mod));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void noteOn(int note) {
 | 
			
		||||
  if( note > -1 ) {
 | 
			
		||||
    mcp.setChannelValue(MCP4728_CHANNEL_A, tuning[note]);
 | 
			
		||||
    mcp.setChannelValue(MCP4728_CHANNEL_B, 4095);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void noteOff() {
 | 
			
		||||
    mcp.setChannelValue(MCP4728_CHANNEL_B, 0);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								10MultiMod/10MultiMod.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								10MultiMod/10MultiMod.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
// Basic demo for configuring the MCP4728 4-Channel 12-bit I2C DAC
 | 
			
		||||
#include <Adafruit_MCP4728.h>
 | 
			
		||||
#include <Wire.h>
 | 
			
		||||
 | 
			
		||||
Adafruit_MCP4728 mcp;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int bpm = 98;
 | 
			
		||||
float beat_s = 60.0 / (float)bpm;
 | 
			
		||||
int beat_m = round(1000.0 * beat_s); 
 | 
			
		||||
long init_t;
 | 
			
		||||
 | 
			
		||||
float pi = 3.141592653589793;
 | 
			
		||||
float mod_a = pi;
 | 
			
		||||
float mod_b = pi / 4.0;
 | 
			
		||||
float mod_c = pi / 3.0;
 | 
			
		||||
float mod_d = pi / 5.0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void setup(void) {
 | 
			
		||||
  Serial.begin(115200);
 | 
			
		||||
  while (!Serial)
 | 
			
		||||
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
 | 
			
		||||
 | 
			
		||||
  if (!mcp.begin(0x64)) {
 | 
			
		||||
    Serial.println("Failed to find MCP4728 chip");
 | 
			
		||||
    while (1) {
 | 
			
		||||
      delay(10);
 | 
			
		||||
    }
 | 
			
		||||
    Serial.println("MCP4728 initialised");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  init_t = millis();
 | 
			
		||||
  mcp.setChannelValue(MCP4728_CHANNEL_B, 0);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
  long now = millis();
 | 
			
		||||
  long mod_t = (now - init_t);
 | 
			
		||||
  float tf = (float)mod_t / (float)beat_m;
 | 
			
		||||
  uint16_t a = round(4095.0 * (0.5 + 0.5 * sin(mod_a * tf)));
 | 
			
		||||
  uint16_t b = round(4095.0 * (0.5 + 0.5 * sin(mod_b * tf)));
 | 
			
		||||
  uint16_t c = round(4095.0 * (0.5 + 0.5 * sin(mod_c * tf)));
 | 
			
		||||
  uint16_t d = round(4095.0 * (0.5 + 0.5 * sin(mod_d * tf)));
 | 
			
		||||
  mcp.fastWrite(a, b, c, d);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										93
									
								
								11KarplusStrongAgain/11KarplusStrongAgain.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								11KarplusStrongAgain/11KarplusStrongAgain.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,93 @@
 | 
			
		||||
// Very basic Karplus-Strong 
 | 
			
		||||
 | 
			
		||||
// based on this explanation http://sites.music.columbia.edu/cmc/MusicAndComputers/chapter4/04_09.php
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <Adafruit_MCP4728.h>
 | 
			
		||||
#include <Wire.h>
 | 
			
		||||
 | 
			
		||||
Adafruit_MCP4728 mcp;
 | 
			
		||||
 | 
			
		||||
#define nsamp 256
 | 
			
		||||
#define dacmax 256
 | 
			
		||||
 | 
			
		||||
unsigned int phase;
 | 
			
		||||
unsigned int length;
 | 
			
		||||
unsigned int repeats;
 | 
			
		||||
int note = 0;
 | 
			
		||||
int freqs[] = { 256, 112, 102, 96, 84, 76, 64, 56, 50, 48, 42, 38, 34, 32 };
 | 
			
		||||
int tune2[] = { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1   };
 | 
			
		||||
 | 
			
		||||
byte waveform[nsamp];
 | 
			
		||||
 | 
			
		||||
int pd = 30;
 | 
			
		||||
 | 
			
		||||
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 = 800;
 | 
			
		||||
  // turn on CTC mode
 | 
			
		||||
  TCCR1B |= (1 << WGM12);
 | 
			
		||||
  // Set CS10 and CS12 bits for 1024 escaler
 | 
			
		||||
  TCCR1B |= (1 << CS12) | (1 << CS10);  
 | 
			
		||||
  // enable timer compare interrupt
 | 
			
		||||
  TIMSK1 |= (1 << OCIE1A);
 | 
			
		||||
 | 
			
		||||
  sei();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if (!mcp.begin(0x64)) {
 | 
			
		||||
    while (1) {
 | 
			
		||||
      delay(100);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  randomSeed(analogRead(A0));
 | 
			
		||||
  mcp.setSpeed(800000L);
 | 
			
		||||
 | 
			
		||||
  phase=0;
 | 
			
		||||
  note=0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISR(TIMER1_COMPA_vect){//timer1
 | 
			
		||||
  if( tune2[note] > -1 ) {
 | 
			
		||||
    length=freqs[tune2[note]];
 | 
			
		||||
    for (int i=0; i<nsamp; ++i){  
 | 
			
		||||
      waveform[i]=random(256);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  note++;
 | 
			
		||||
  if( note > 15 ) {
 | 
			
		||||
    note = 0;
 | 
			
		||||
  }
 | 
			
		||||
  pd = analogRead(A0) >> 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
  byte s1, s2;
 | 
			
		||||
  int p0 = phase;
 | 
			
		||||
  int p1 = phase - pd;
 | 
			
		||||
  if( p1 < 0 ) {
 | 
			
		||||
    p1 += length;
 | 
			
		||||
  } 
 | 
			
		||||
  phase += 1;
 | 
			
		||||
  if( phase >= length ) {
 | 
			
		||||
    phase = 0;
 | 
			
		||||
  }
 | 
			
		||||
  s1 = waveform[p1];
 | 
			
		||||
  s2 = waveform[p0];
 | 
			
		||||
  waveform[p0] =   ( s1 & s2 ) + ((s1 ^ s2) >> 1);
 | 
			
		||||
  mcp.fastWrite(s1 << 4, 0, 0, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								TODO.md
									
									
									
									
									
								
							@ -2,10 +2,10 @@
 | 
			
		||||
 | 
			
		||||
Sunday 6 October
 | 
			
		||||
 | 
			
		||||
6 - Wavetable updates
 | 
			
		||||
7 - Change a sequence while it's playing
 | 
			
		||||
8 - Sound clouds
 | 
			
		||||
9 - 7TET groove
 | 
			
		||||
10 - Drum pattern
 | 
			
		||||
11 - FM
 | 
			
		||||
12 - Karplus-Strong
 | 
			
		||||
s 6 - Wavetable updates
 | 
			
		||||
m 7 - Change a sequence while it's playing
 | 
			
		||||
t 8 - Sound clouds
 | 
			
		||||
w 9 - 7TET groove
 | 
			
		||||
t 10 - Drum pattern
 | 
			
		||||
f 11 - FM
 | 
			
		||||
s 12 - Karplus-Strong
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user