xxxxxxxxxx
301
finger_pattern = {
1 : "C3",
2 : "D3",
4 : "E3",
8 : "F3",
64 : "G3",
128 : "A3",
256 : "B3",
512 : "C4",
3 : "C3maj",
6 : "D3maj",
12 : "E3maj",
72 : "F3maj",
192 : "G3maj",
384 : "A3maj",
768 : "B3maj",
513 : "C4maj",
5 : "C3min",
10 : "D3min",
68 : "E3min",
136 : "F3min",
320 : "G3min",
640 : "A3min",
257 : "B3min",
514 : "C4min",
7 : "C3pow",
14 : "D3pow",
76 : "E3pow",
200 : "F3pow",
448 : "G3pow",
896 : "A3pow",
769 : "B3pow",
515 : "C4pow",
11 : "C3aug",
70 : "D3aug",
140 : "E3aug",
328 : "F3aug",
704 : "G3aug",
385 : "A3aug",
770 : "B3aug",
517 : "C4aug",
15 : "C37th",
78 : "D37th",
204 : "E37th",
456 : "F37th",
960 : "G37th",
897 : "A37th",
771 : "B37th",
519 : "C47th"
}
var keydisp = [];
var strumming = 0;
var hist = {
0 :0,
1 :0,
2 :0,
3 :0,
4 :0,
5 :0,
6 :0,
7 :0
}
var key2id = {
"A" : 0,
"S" : 1,
"D" : 2,
"F" : 3,
"V" : 4,
"N" : 5,
"J" : 6,
"K" : 7,
"L" : 8,
"º" : 9,
" " : 10
};
dict_notes = {
"C":0,
"D":1,
"E":2,
"F":3,
"G":4,
"A":5,
"B":6,
};
note_symb = {
0: "C",
1: "C#",
2: "D",
3: "D#",
4: "E",
5: "F",
6: "F#",
7: "G",
8: "G#",
9: "A",
10: "A#",
11: "B"
}
chords = {
"" : [0],
"maj" : [0, 4, 7],
"min" : [0, 3, 7],
"7th" : [0, 4, 8],
"aug" : [0, 4, 7, 10],
"pow" : [0, 7, 12]
}
dict_octave = {
0 : -12,
1 : 0,
2 : +12
}
var basenote;
var scale_switch = 0;
var id2key = {
0 : 65,
1 : 83,
2 : 68,
3 : 70,
4 : 86,
5 : 78,
6 : 74,
7 : 75,
8 : 76,
9 : 186,
10 : 32
}
var osc = [];
var env = [];
var bufid = 0;
var scales;
var scale_len = 0;
function preload() {
scales = {
0 : {
0: "major" ,
1: [0, 2, 4, 5, 7, 9, 11, 12]
},
1 : {
0: "natural minor" ,
1: [0, 2, 3, 5, 7, 8, 10, 12]
},
2 : {
0: "harmonic minor" ,
1: [0, 2, 3, 5, 7, 8, 11, 12]
},
3 : {
0: "blue scale shoes",
1: [0, 3, 5, 6, 7, 10, 12, 24]
},
4 : {
0: "lacadaemonian",
1: [0,3,4,5,9,10,11,12]
},
5 : {
0: "kubb",
1: [5,5,5,5,5,5,5,5]
},
6 : {
0: "bbuk",
1: [12,11,9,7,5,4,2,0]
},
7 : {
0: "blue scale shoes",
1: [0, 3, 5, 6, 7, 10, 12, 24]
},
8 : {
0: "blue scale shoes",
1: [0, 3, 5, 6, 7, 10, 12, 24]
}
}
}
function setup() {
console.log("setting up");
for (var s in scales) {
scale_len++;
}
basenote = 36;
createCanvas(400,150);
for (var i = 0; i < 10; i++) {
osc.push(new p5.TriOsc());
osc[i].start();
osc[i].amp(0);
env.push(new p5.Env());
env[i].setADSR(0.005, 0.5, 0.1, 0.5);
env[i].setRange(0.5, 0);
}
for (i = 0; i < 50; i++){
keydisp[i] = 1;
}
}
// A function to play a note
function playNote(id) {
osc[bufid].freq(midiToFreq(id));
// Fade it in
env[bufid].play(osc[bufid],0,0.1);
bufid = (bufid+1) % osc.length;
}
function draw() {
background(255);
// min id is 0, max is 40ish?
stroke(0);
for (var i = 0; i<50 ; i++){
fill(keydisp[i]*255);
keydisp[i] = constrain(keydisp[i]+0.05,0,1);
rect(i*width/50,0,width/50-1,39);
}
var comb = 0;
if (!strumming){
var oct_sw = 1;
for (i = 0; i < 10; i++){
if (keyIsDown(id2key[10])){
if (i>5 || i<4){
if (keyIsDown(id2key[i])){
comb += pow(2,i);
}
} else {
if (keyIsDown(id2key[i])){
oct_sw = (i==4) ? 0 : 2;
}
}
}
}
var chord = finger_pattern[comb];
if (comb>0){
console.log(comb);
}
if (chord){
console.log(chord);
var base = dict_notes[chord.slice(0,1)];
base = scales[scale_switch][1][base];
base += dict_octave[oct_sw];
if (chord.slice(1,2)==="4"){
base += 12;
}
base += basenote;
var toplay = [];
for (var notes_of_chord in chords[chord.slice(2,5)]){
toplay.push(base + chords[chord.slice(2,5)][notes_of_chord]);
}
for (var id in toplay) {
playNote(toplay[id]+24);
keydisp[toplay[id]-basenote+12] = 0;
}
}
strumming = 1;
}
if(!keyIsDown(id2key[10])){
strumming = 0;
}
noStroke();
fill(0);
var basenote_symb = note_symb[(basenote%12)] + " " + (round(floor(basenote/12))).toString();
text(basenote_symb,10,height-60);
text(scales[scale_switch][0],10,height-45);
}
function getBase(name){
return dict_notes[name]
}
function getMaj(idx){
return [idx, idx+4, idx+7]
}
function getMin(idx){
return [idx, idx+3, idx+7]
}
function getAug(idx){
return [idx, idx+4, idx+8]
}
function get7th(idx){
return [idx, idx+4, idx+7, idx+10]
}
function keyPressed() {
if (keyCode === UP_ARROW){
basenote += 1;
} else if (keyCode === DOWN_ARROW) {
basenote -= 1;
} else if (keyCode === LEFT_ARROW) {
scale_switch = ((scale_switch - 1 + scale_len)%scale_len);
} else if (keyCode === RIGHT_ARROW) {
scale_switch = ((scale_switch + 1 + scale_len)%scale_len); // not necessary but more readable
}
}