Skip to content
Snippets Groups Projects
Commit 7559cd14 authored by Arthur Saunier's avatar Arthur Saunier
Browse files

add soft for RP2040

parent 21ec9704
No related branches found
No related tags found
No related merge requests found
#include <hardware/pwm.h>
float osc_progress[6];//0~4=chord osc , 5=bass osc , 6=arpeggio osc
int osc_inverse[4];
float osc_scale_rate[5];//0~3=chord osc , 6=arpeggio osc
int slice_num = 0;
float osc_freq = 0;
int wavetable[256];//1024 resolution , 256 rate
float calb = 1.11;//calibration for reduce resistance error
int adc, freq_pot;
int waveform = 0;
int f0 = 35;//base osc frequency
int j=0;
int select_mode=0;//0=chord without root , 1=chord with root,2=arpeggio
int inversion=0;//0-7
int old_invAD=0;//countermeasure of input ADC noise
int new_invAD=0;//countermeasure of input ADC noise
bool push_sw, old_push_sw;//push sw
int qnt[32];
int thr=0;//threshold number
const static int majqnt[32]={// major scale quantize value
0, 34, 68, 85, 119, 153, 205, 239, 273, 290, 324, 358, 409, 443, 477, 494, 529, 563, 614, 648, 682, 699, 733, 767, 818, 853, 887, 904, 938, 972, 1023
};
const static int majthr[32]={// major scale quantize threshold
0, 17, 51, 85, 102, 136, 171, 222, 256, 290, 307, 341, 375, 426, 460, 494, 512, 546, 580, 631, 665, 699, 716, 750, 784, 835, 870, 904, 921, 955, 989,1024
};
const static int minqnt[32]={// minor scale quantize value
0, 34, 51, 85, 119, 136, 205, 239, 256, 290, 324, 341, 409, 443, 460, 494, 529, 546, 614, 648, 665, 699, 733, 750, 818, 853, 870, 904, 938, 955, 1023
};
const static int minthr[32]={// minor scale quantize threshold
17, 43, 68, 102, 128, 171, 222, 248, 273, 307, 333, 375, 426, 452, 477, 512, 538, 580, 631, 657, 682, 716, 742, 784, 836, 862, 887, 921, 947, 989, 1024
};
//------------chord------------
float freq_rate[61]={
1, 1.059, 1.122, 1.189, 1.26, 1.335, 1.414, 1.498, 1.587, 1.682, 1.782, 1.888, 2, 2.059, 2.122, 2.189, 2.26, 2.335, 2.414, 2.498, 2.587, 2.682, 2.782, 2.888, 3, 3.059, 3.122, 3.189, 3.26, 3.335, 3.414, 3.498, 3.587, 3.682, 3.782, 3.888, 4, 4.059, 4.122, 4.189, 4.26, 4.335, 4.414, 4.498, 4.587, 4.682, 4.782, 4.888, 5, 5.059, 5.122, 5.189, 5.26, 5.335, 5.414, 5.498, 5.587, 5.682, 5.782, 5.888, 6
};
int chord_mode=2;//0=maj 3chord,1=min 3chord,2=tension maj 4chord,3=maj 4chord,4=min 4chord,5=tension min 4chord
int chord_3[3][3]={
{0,4,7},//maj
{0,3,7},//min
{0,3,6}//dim
};
int chord_4[6][4]={
{0,4,7,11},//maj+M7
{0,2,4,7},//maj+add9
{0,4,7,10},//maj+7
{0,3,7,10},//min+7
{0,4,7,9},//maj+6
{0,3,6,10}//dim+7
};
int select_chord3[3][6]={//6 is mode kinds
{0,1,1,0,0,0},//maj -> I,IIm,IIIm,IV,V,VIm
{0,1,1,0,0,1},//maj -> I,IIm,IIIm,IV,V,VI
{1,2,0,1,1,0}//min -> Im,IIdim,III,IVm,Vm,VI
};
int select_chord4[3][6]={//6 is mode kinds
{1,3,3,0,4,1},//maj -> Iadd9,IIm7,IIIm7,IVM7,V6,VIadd9
{0,3,3,0,2,3},//maj -> IM7,IIm7,IIIm7,IVM7,V7,VIm7
{3,5,0,3,3,0}//min -> Im7,IIdim7,IIIM7,IVm7,Vm7,VIM7
};
int select_table=0;
//-----------V/oct-----------
const static float voctpow[1230] = {//Covers 6(=1230) octaves. If it is 1230 or more, the operation becomes unstable.
0, 0.004882, 0.009765, 0.014648, 0.019531, 0.024414, 0.029296, 0.034179, 0.039062, 0.043945, 0.048828, 0.05371, 0.058593, 0.063476, 0.068359, 0.073242, 0.078125, 0.083007, 0.08789, 0.092773, 0.097656, 0.102539, 0.107421, 0.112304, 0.117187, 0.12207, 0.126953, 0.131835, 0.136718, 0.141601, 0.146484, 0.151367, 0.15625, 0.161132, 0.166015, 0.170898, 0.175781, 0.180664, 0.185546, 0.190429, 0.195312, 0.200195, 0.205078, 0.20996, 0.214843, 0.219726, 0.224609, 0.229492, 0.234375, 0.239257, 0.24414, 0.249023, 0.253906, 0.258789, 0.263671, 0.268554, 0.273437, 0.27832, 0.283203, 0.288085, 0.292968, 0.297851, 0.302734, 0.307617, 0.3125, 0.317382, 0.322265, 0.327148, 0.332031, 0.336914, 0.341796, 0.346679, 0.351562, 0.356445, 0.361328, 0.36621, 0.371093, 0.375976, 0.380859, 0.385742, 0.390625, 0.395507, 0.40039, 0.405273, 0.410156, 0.415039, 0.419921, 0.424804, 0.429687, 0.43457, 0.439453, 0.444335, 0.449218, 0.454101, 0.458984, 0.463867, 0.46875, 0.473632, 0.478515, 0.483398, 0.488281, 0.493164, 0.498046, 0.502929, 0.507812, 0.512695, 0.517578, 0.52246, 0.527343, 0.532226, 0.537109, 0.541992, 0.546875, 0.551757, 0.55664, 0.561523, 0.566406, 0.571289, 0.576171, 0.581054, 0.585937, 0.59082, 0.595703, 0.600585, 0.605468, 0.610351, 0.615234, 0.620117, 0.625, 0.629882, 0.634765, 0.639648, 0.644531, 0.649414, 0.654296, 0.659179, 0.664062, 0.668945, 0.673828, 0.67871, 0.683593, 0.688476, 0.693359, 0.698242, 0.703125, 0.708007, 0.71289, 0.717773, 0.722656, 0.727539, 0.732421, 0.737304, 0.742187, 0.74707, 0.751953, 0.756835, 0.761718, 0.766601, 0.771484, 0.776367, 0.78125, 0.786132, 0.791015, 0.795898, 0.800781, 0.805664, 0.810546, 0.815429, 0.820312, 0.825195, 0.830078, 0.83496, 0.839843, 0.844726, 0.849609, 0.854492, 0.859375, 0.864257, 0.86914, 0.874023, 0.878906, 0.883789, 0.888671, 0.893554, 0.898437, 0.90332, 0.908203, 0.913085, 0.917968, 0.922851, 0.927734, 0.932617, 0.9375, 0.942382, 0.947265, 0.952148, 0.957031, 0.961914, 0.966796, 0.971679, 0.976562, 0.981445, 0.986328, 0.99121, 0.996093, 1.000976, 1.005859, 1.010742, 1.015625, 1.020507, 1.02539, 1.030273, 1.035156, 1.040039, 1.044921, 1.049804, 1.054687, 1.05957, 1.064453, 1.069335, 1.074218, 1.079101, 1.083984, 1.088867, 1.09375, 1.098632, 1.103515, 1.108398, 1.113281, 1.118164, 1.123046, 1.127929, 1.132812, 1.137695, 1.142578, 1.14746, 1.152343, 1.157226, 1.162109, 1.166992, 1.171875, 1.176757, 1.18164, 1.186523, 1.191406, 1.196289, 1.201171, 1.206054, 1.210937, 1.21582, 1.220703, 1.225585, 1.230468, 1.235351, 1.240234, 1.245117, 1.25, 1.254882, 1.259765, 1.264648, 1.269531, 1.274414, 1.279296, 1.284179, 1.289062, 1.293945, 1.298828, 1.30371, 1.308593, 1.313476, 1.318359, 1.323242, 1.328125, 1.333007, 1.33789, 1.342773, 1.347656, 1.352539, 1.357421, 1.362304, 1.367187, 1.37207, 1.376953, 1.381835, 1.386718, 1.391601, 1.396484, 1.401367, 1.40625, 1.411132, 1.416015, 1.420898, 1.425781, 1.430664, 1.435546, 1.440429, 1.445312, 1.450195, 1.455078, 1.45996, 1.464843, 1.469726, 1.474609, 1.479492, 1.484375, 1.489257, 1.49414, 1.499023, 1.503906, 1.508789, 1.513671, 1.518554, 1.523437, 1.52832, 1.533203, 1.538085, 1.542968, 1.547851, 1.552734, 1.557617, 1.5625, 1.567382, 1.572265, 1.577148, 1.582031, 1.586914, 1.591796, 1.596679, 1.601562, 1.606445, 1.611328, 1.61621, 1.621093, 1.625976, 1.630859, 1.635742, 1.640625, 1.645507, 1.65039, 1.655273, 1.660156, 1.665039, 1.669921, 1.674804, 1.679687, 1.68457, 1.689453, 1.694335, 1.699218, 1.704101, 1.708984, 1.713867, 1.71875, 1.723632, 1.728515, 1.733398, 1.738281, 1.743164, 1.748046, 1.752929, 1.757812, 1.762695, 1.767578, 1.77246, 1.777343, 1.782226, 1.787109, 1.791992, 1.796875, 1.801757, 1.80664, 1.811523, 1.816406, 1.821289, 1.826171, 1.831054, 1.835937, 1.84082, 1.845703, 1.850585, 1.855468, 1.860351, 1.865234, 1.870117, 1.875, 1.879882, 1.884765, 1.889648, 1.894531, 1.899414, 1.904296, 1.909179, 1.914062, 1.918945, 1.923828, 1.92871, 1.933593, 1.938476, 1.943359, 1.948242, 1.953125, 1.958007, 1.96289, 1.967773, 1.972656, 1.977539, 1.982421, 1.987304, 1.992187, 1.99707, 2.001953, 2.006835, 2.011718, 2.016601, 2.021484, 2.026367, 2.03125, 2.036132, 2.041015, 2.045898, 2.050781, 2.055664, 2.060546, 2.065429, 2.070312, 2.075195, 2.080078, 2.08496, 2.089843, 2.094726, 2.099609, 2.104492, 2.109375, 2.114257, 2.11914, 2.124023, 2.128906, 2.133789, 2.138671, 2.143554, 2.148437, 2.15332, 2.158203, 2.163085, 2.167968, 2.172851, 2.177734, 2.182617, 2.1875, 2.192382, 2.197265, 2.202148, 2.207031, 2.211914, 2.216796, 2.221679, 2.226562, 2.231445, 2.236328, 2.24121, 2.246093, 2.250976, 2.255859, 2.260742, 2.265625, 2.270507, 2.27539, 2.280273, 2.285156, 2.290039, 2.294921, 2.299804, 2.304687, 2.30957, 2.314453, 2.319335, 2.324218, 2.329101, 2.333984, 2.338867, 2.34375, 2.348632, 2.353515, 2.358398, 2.363281, 2.368164, 2.373046, 2.377929, 2.382812, 2.387695, 2.392578, 2.39746, 2.402343, 2.407226, 2.412109, 2.416992, 2.421875, 2.426757, 2.43164, 2.436523, 2.441406, 2.446289, 2.451171, 2.456054, 2.460937, 2.46582, 2.470703, 2.475585, 2.480468, 2.485351, 2.490234, 2.495117, 2.5, 2.504882, 2.509765, 2.514648, 2.519531, 2.524414, 2.529296, 2.534179, 2.539062, 2.543945, 2.548828, 2.55371, 2.558593, 2.563476, 2.568359, 2.573242, 2.578125, 2.583007, 2.58789, 2.592773, 2.597656, 2.602539, 2.607421, 2.612304, 2.617187, 2.62207, 2.626953, 2.631835, 2.636718, 2.641601, 2.646484, 2.651367, 2.65625, 2.661132, 2.666015, 2.670898, 2.675781, 2.680664, 2.685546, 2.690429, 2.695312, 2.700195, 2.705078, 2.70996, 2.714843, 2.719726, 2.724609, 2.729492, 2.734375, 2.739257, 2.74414, 2.749023, 2.753906, 2.758789, 2.763671, 2.768554, 2.773437, 2.77832, 2.783203, 2.788085, 2.792968, 2.797851, 2.802734, 2.807617, 2.8125, 2.817382, 2.822265, 2.827148, 2.832031, 2.836914, 2.841796, 2.846679, 2.851562, 2.856445, 2.861328, 2.86621, 2.871093, 2.875976, 2.880859, 2.885742, 2.890625, 2.895507, 2.90039, 2.905273, 2.910156, 2.915039, 2.919921, 2.924804, 2.929687, 2.93457, 2.939453, 2.944335, 2.949218, 2.954101, 2.958984, 2.963867, 2.96875, 2.973632, 2.978515, 2.983398, 2.988281, 2.993164, 2.998046, 3.002929, 3.007812, 3.012695, 3.017578, 3.02246, 3.027343, 3.032226, 3.037109, 3.041992, 3.046875, 3.051757, 3.05664, 3.061523, 3.066406, 3.071289, 3.076171, 3.081054, 3.085937, 3.09082, 3.095703, 3.100585, 3.105468, 3.110351, 3.115234, 3.120117, 3.125, 3.129882, 3.134765, 3.139648, 3.144531, 3.149414, 3.154296, 3.159179, 3.164062, 3.168945, 3.173828, 3.17871, 3.183593, 3.188476, 3.193359, 3.198242, 3.203125, 3.208007, 3.21289, 3.217773, 3.222656, 3.227539, 3.232421, 3.237304, 3.242187, 3.24707, 3.251953, 3.256835, 3.261718, 3.266601, 3.271484, 3.276367, 3.28125, 3.286132, 3.291015, 3.295898, 3.300781, 3.305664, 3.310546, 3.315429, 3.320312, 3.325195, 3.330078, 3.33496, 3.339843, 3.344726, 3.349609, 3.354492, 3.359375, 3.364257, 3.36914, 3.374023, 3.378906, 3.383789, 3.388671, 3.393554, 3.398437, 3.40332, 3.408203, 3.413085, 3.417968, 3.422851, 3.427734, 3.432617, 3.4375, 3.442382, 3.447265, 3.452148, 3.457031, 3.461914, 3.466796, 3.471679, 3.476562, 3.481445, 3.486328, 3.49121, 3.496093, 3.500976, 3.505859, 3.510742, 3.515625, 3.520507, 3.52539, 3.530273, 3.535156, 3.540039, 3.544921, 3.549804, 3.554687, 3.55957, 3.564453, 3.569335, 3.574218, 3.579101, 3.583984, 3.588867, 3.59375, 3.598632, 3.603515, 3.608398, 3.613281, 3.618164, 3.623046, 3.627929, 3.632812, 3.637695, 3.642578, 3.64746, 3.652343, 3.657226, 3.662109, 3.666992, 3.671875, 3.676757, 3.68164, 3.686523, 3.691406, 3.696289, 3.701171, 3.706054, 3.710937, 3.71582, 3.720703, 3.725585, 3.730468, 3.735351, 3.740234, 3.745117, 3.75, 3.754882, 3.759765, 3.764648, 3.769531, 3.774414, 3.779296, 3.784179, 3.789062, 3.793945, 3.798828, 3.80371, 3.808593, 3.813476, 3.818359, 3.823242, 3.828125, 3.833007, 3.83789, 3.842773, 3.847656, 3.852539, 3.857421, 3.862304, 3.867187, 3.87207, 3.876953, 3.881835, 3.886718, 3.891601, 3.896484, 3.901367, 3.90625, 3.911132, 3.916015, 3.920898, 3.925781, 3.930664, 3.935546, 3.940429, 3.945312, 3.950195, 3.955078, 3.95996, 3.964843, 3.969726, 3.974609, 3.979492, 3.984375, 3.989257, 3.99414, 3.999023, 4.003906, 4.008789, 4.013671, 4.018554, 4.023437, 4.02832, 4.033203, 4.038085, 4.042968, 4.047851, 4.052734, 4.057617, 4.0625, 4.067382, 4.072265, 4.077148, 4.082031, 4.086914, 4.091796, 4.096679, 4.101562, 4.106445, 4.111328, 4.11621, 4.121093, 4.125976, 4.130859, 4.135742, 4.140625, 4.145507, 4.15039, 4.155273, 4.160156, 4.165039, 4.169921, 4.174804, 4.179687, 4.18457, 4.189453, 4.194335, 4.199218, 4.204101, 4.208984, 4.213867, 4.21875, 4.223632, 4.228515, 4.233398, 4.238281, 4.243164, 4.248046, 4.252929, 4.257812, 4.262695, 4.267578, 4.27246, 4.277343, 4.282226, 4.287109, 4.291992, 4.296875, 4.301757, 4.30664, 4.311523, 4.316406, 4.321289, 4.326171, 4.331054, 4.335937, 4.34082, 4.345703, 4.350585, 4.355468, 4.360351, 4.365234, 4.370117, 4.375, 4.379882, 4.384765, 4.389648, 4.394531, 4.399414, 4.404296, 4.409179, 4.414062, 4.418945, 4.423828, 4.42871, 4.433593, 4.438476, 4.443359, 4.448242, 4.453125, 4.458007, 4.46289, 4.467773, 4.472656, 4.477539, 4.482421, 4.487304, 4.492187, 4.49707, 4.501953, 4.506835, 4.511718, 4.516601, 4.521484, 4.526367, 4.53125, 4.536132, 4.541015, 4.545898, 4.550781, 4.555664, 4.560546, 4.565429, 4.570312, 4.575195, 4.580078, 4.58496, 4.589843, 4.594726, 4.599609, 4.604492, 4.609375, 4.614257, 4.61914, 4.624023, 4.628906, 4.633789, 4.638671, 4.643554, 4.648437, 4.65332, 4.658203, 4.663085, 4.667968, 4.672851, 4.677734, 4.682617, 4.6875, 4.692382, 4.697265, 4.702148, 4.707031, 4.711914, 4.716796, 4.721679, 4.726562, 4.731445, 4.736328, 4.74121, 4.746093, 4.750976, 4.755859, 4.760742, 4.765625, 4.770507, 4.77539, 4.780273, 4.785156, 4.790039, 4.794921, 4.799804, 4.804687, 4.80957, 4.814453, 4.819335, 4.824218, 4.829101, 4.833984, 4.838867, 4.84375, 4.848632, 4.853515, 4.858398, 4.863281, 4.868164, 4.873046, 4.877929, 4.882812, 4.887695, 4.892578, 4.89746, 4.902343, 4.907226, 4.912109, 4.916992, 4.921875, 4.926757, 4.93164, 4.936523, 4.941406, 4.946289, 4.951171, 4.956054, 4.960937, 4.96582, 4.970703, 4.975585, 4.980468, 4.985351, 4.990234, 4.995117, 5, 5.004882, 5.009765, 5.014648, 5.019531, 5.024414, 5.029296, 5.034179, 5.039062, 5.043945, 5.048828, 5.05371, 5.058593, 5.063476, 5.068359, 5.073242, 5.078125, 5.083007, 5.08789, 5.092773, 5.097656, 5.102539, 5.107421, 5.112304, 5.117187, 5.12207, 5.126953, 5.131835, 5.136718, 5.141601, 5.146484, 5.151367, 5.15625, 5.161132, 5.166015, 5.170898, 5.175781, 5.180664, 5.185546, 5.190429, 5.195312, 5.200195, 5.205078, 5.20996, 5.214843, 5.219726, 5.224609, 5.229492, 5.234375, 5.239257, 5.24414, 5.249023, 5.253906, 5.258789, 5.263671, 5.268554, 5.273437, 5.27832, 5.283203, 5.288085, 5.292968, 5.297851, 5.302734, 5.307617, 5.3125, 5.317382, 5.322265, 5.327148, 5.332031, 5.336914, 5.341796, 5.346679, 5.351562, 5.356445, 5.361328, 5.36621, 5.371093, 5.375976, 5.380859, 5.385742, 5.390625, 5.395507, 5.40039, 5.405273, 5.410156, 5.415039, 5.419921, 5.424804, 5.429687, 5.43457, 5.439453, 5.444335, 5.449218, 5.454101, 5.458984, 5.463867, 5.46875, 5.473632, 5.478515, 5.483398, 5.488281, 5.493164, 5.498046, 5.502929, 5.507812, 5.512695, 5.517578, 5.52246, 5.527343, 5.532226, 5.537109, 5.541992, 5.546875, 5.551757, 5.55664, 5.561523, 5.566406, 5.571289, 5.576171, 5.581054, 5.585937, 5.59082, 5.595703, 5.600585, 5.605468, 5.610351, 5.615234, 5.620117, 5.625, 5.629882, 5.634765, 5.639648, 5.644531, 5.649414, 5.654296, 5.659179, 5.664062, 5.668945, 5.673828, 5.67871, 5.683593, 5.688476, 5.693359, 5.698242, 5.703125, 5.708007, 5.71289, 5.717773, 5.722656, 5.727539, 5.732421, 5.737304, 5.742187, 5.74707, 5.751953, 5.756835, 5.761718, 5.766601, 5.771484, 5.776367, 5.78125, 5.786132, 5.791015, 5.795898, 5.800781, 5.805664, 5.810546, 5.815429, 5.820312, 5.825195, 5.830078, 5.83496, 5.839843, 5.844726, 5.849609, 5.854492, 5.859375, 5.864257, 5.86914, 5.874023, 5.878906, 5.883789, 5.888671, 5.893554, 5.898437, 5.90332, 5.908203, 5.913085, 5.917968, 5.922851, 5.927734, 5.932617, 5.9375, 5.942382, 5.947265, 5.952148, 5.957031, 5.961914, 5.966796, 5.971679, 5.976562, 5.981445, 5.986328, 5.99121, 5.996093, 6.000976,
};
float freq_table[2048];
void setup1() {
}
void setup()
{
//Serial.begin(9600);//for development
pinMode(0, INPUT_PULLUP);//mode select
pinMode(1, INPUT_PULLUP);//mode select
pinMode(6, INPUT_PULLUP);//push sw
table_set();//set wavetable
qnt_set();
//-------------------octave select-------------------------------
for (int i = 0; i < 1230; i++) {//Covers 6(=1230) octaves. If it is 1230 or more, the operation becomes unstable.
freq_table[i] = f0 * pow(2, (voctpow[i]));
}
for (int i = 0; i < 2048 - 1230; i++) {
freq_table[i + 1230] = 6;
}
//-------------------PWM setting-------------------------------
gpio_set_function(2, GPIO_FUNC_PWM);// set GP2 function PWM
slice_num = pwm_gpio_to_slice_num(2);// GP2 PWM slice
pwm_clear_irq(slice_num);
pwm_set_irq_enabled(slice_num, true);
irq_set_exclusive_handler(PWM_IRQ_WRAP, on_pwm_wrap);
irq_set_enabled(PWM_IRQ_WRAP, true);
//set PWM frequency
pwm_set_clkdiv(slice_num, 4);//=sysclock/((resolution+1)*frequency)
pwm_set_wrap(slice_num, 1023);//resolutio
pwm_set_enabled(slice_num, true);//PWM output enable
}
void on_pwm_wrap() {
pwm_clear_irq(slice_num);
// if(select_mode!=2){
if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){
osc_progress[0]=osc_progress[0]+ osc_freq*osc_scale_rate[0];
osc_progress[1]=osc_progress[1]+ osc_freq*osc_scale_rate[1];
osc_progress[2]=osc_progress[2]+ osc_freq*osc_scale_rate[2];
osc_progress[4]=osc_progress[4]+ osc_freq*osc_scale_rate[0]/2;//bass
osc_progress[5]=osc_progress[5]+ osc_freq*osc_scale_rate[4];//arpeggio
}
else if(chord_mode==0 ||chord_mode==1||chord_mode==5){
osc_progress[0]=osc_progress[0]+ osc_freq*osc_scale_rate[0];
osc_progress[1]=osc_progress[1]+ osc_freq*osc_scale_rate[1];
osc_progress[2]=osc_progress[2]+ osc_freq*osc_scale_rate[2];
osc_progress[3]=osc_progress[3]+ osc_freq*osc_scale_rate[3];
osc_progress[4]=osc_progress[4]+ osc_freq*osc_scale_rate[0]/2;//bass
osc_progress[5]=osc_progress[5]+ osc_freq*osc_scale_rate[4];//arpeggio
}
for(byte i = 0; i < 6; i++){
if (osc_progress[i] > 255) {
osc_progress[i] = 0;
}
}
if(select_mode!=2){
if((chord_mode==2 ||chord_mode==3 ||chord_mode==4)&& select_mode==0){
pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[3]]/4+511);
}
else if((chord_mode==2 ||chord_mode==3 ||chord_mode==4)&& select_mode==1){
pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/4+wavetable[(int)osc_progress[1]]/4+wavetable[(int)osc_progress[2]]/4+wavetable[(int)osc_progress[4]]/4+511);
}
else if((chord_mode==0 ||chord_mode==1||chord_mode==5) && select_mode==0){
pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+511);
}
else if((chord_mode==0 ||chord_mode==1||chord_mode==5) && select_mode==1){
pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[0]]/5+wavetable[(int)osc_progress[1]]/5+wavetable[(int)osc_progress[2]]/5+wavetable[(int)osc_progress[3]]/5+wavetable[(int)osc_progress[4]]/5+511);
}
}
else if(select_mode==2){
pwm_set_chan_level(slice_num, PWM_CHAN_A, wavetable[(int)osc_progress[5]]/2+511);
}
}
void loop()
{
old_push_sw = push_sw;
// -------------------frequeny calculation-------------------------------
adc = analogRead(26) * calb;//Correct resistance errors
qnt_set();
freq_pot = map(analogRead(27), 0, 1023, 0, 127);
osc_freq = freq_table[qnt[thr] + freq_pot]; // V/oct apply
osc_freq = 256 * osc_freq / 122070 * 8;//7 is base octave
Serial.print(analogRead(26));//for development
Serial.print(",");//for development
Serial.print(adc);//for development
Serial.println("");//for development
// -------------------chord mode select-------------------------------
chord_mode = analogRead(29)/171;//171=1023/6 , 6 is amount of chord mode
//---------------------inversion---------------------
old_invAD=new_invAD;//countermeasure of noise
new_invAD=analogRead(28);
if(abs(old_invAD-new_invAD)<4){//countermeasure of noise
new_invAD=old_invAD;
}
inversion=new_invAD/125;
if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){//3 chord
switch(inversion){
case 0:
osc_inverse[0]=1;
osc_inverse[1]=1;
osc_inverse[2]=1;
osc_scale_rate[4]=osc_scale_rate[0];
break;
case 1:
osc_inverse[0]=2;
osc_inverse[1]=1;
osc_inverse[2]=1;
osc_scale_rate[4]=osc_scale_rate[1];
break;
case 2:
osc_inverse[0]=2;
osc_inverse[1]=2;
osc_inverse[2]=1;
osc_scale_rate[4]=osc_scale_rate[2];
break;
case 3:
osc_inverse[0]=2;
osc_inverse[1]=2;
osc_inverse[2]=2;
osc_scale_rate[4]=osc_scale_rate[0];
break;
case 4:
osc_inverse[0]=4;
osc_inverse[1]=2;
osc_inverse[2]=2;
osc_scale_rate[4]=osc_scale_rate[1];
break;
case 5:
osc_inverse[0]=4;
osc_inverse[1]=4;
osc_inverse[2]=2;
osc_scale_rate[4]=osc_scale_rate[2];
break;
case 6:
osc_inverse[0]=4;
osc_inverse[1]=4;
osc_inverse[2]=4;
osc_scale_rate[4]=osc_scale_rate[0];
break;
case 7:
osc_inverse[0]=8;
osc_inverse[1]=4;
osc_inverse[2]=4;
osc_scale_rate[4]=osc_scale_rate[1];
break;
}
}
if(chord_mode==0 ||chord_mode==1||chord_mode==5){//4 chord
switch(inversion){
case 0:
osc_inverse[0]=1;
osc_inverse[1]=1;
osc_inverse[2]=1;
osc_inverse[3]=1;
osc_scale_rate[4]=osc_scale_rate[0];
break;
case 1:
osc_inverse[0]=2;
osc_inverse[1]=1;
osc_inverse[2]=1;
osc_inverse[3]=1;
osc_scale_rate[4]=osc_scale_rate[1];
break;
case 2:
osc_inverse[0]=2;
osc_inverse[1]=2;
osc_inverse[2]=1;
osc_inverse[3]=1;
osc_scale_rate[4]=osc_scale_rate[2];
break;
case 3:
osc_inverse[0]=2;
osc_inverse[1]=2;
osc_inverse[2]=2;
osc_inverse[3]=1;
osc_scale_rate[4]=osc_scale_rate[3];
break;
case 4:
osc_inverse[0]=2;
osc_inverse[1]=2;
osc_inverse[2]=2;
osc_inverse[3]=2;
osc_scale_rate[4]=osc_scale_rate[0];
break;
case 5:
osc_inverse[0]=4;
osc_inverse[1]=2;
osc_inverse[2]=2;
osc_inverse[3]=2;
osc_scale_rate[4]=osc_scale_rate[1];
break;
case 6:
osc_inverse[0]=4;
osc_inverse[1]=4;
osc_inverse[2]=2;
osc_inverse[3]=2;
osc_scale_rate[4]=osc_scale_rate[2];
break;
case 7:
osc_inverse[0]=4;
osc_inverse[1]=4;
osc_inverse[2]=4;
osc_inverse[3]=2;
osc_scale_rate[4]=osc_scale_rate[3];
break;
}
}
//----------------------select chord table-----------------
switch(chord_mode){
case 0:
select_table=0;//4 chord
break;
case 1:
select_table=1;//4 chord
break;
case 2:
select_table=0;//3 chord
break;
case 3:
select_table=1;//3 chord
break;
case 4:
select_table=2;//3 chord
break;
case 5:
select_table=2;//4 chord
break;
}
//----------------------mode select-----------------
if (digitalRead(0) == 1 && digitalRead(1) == 1) {
select_mode = 1;//chord with bass
}
else if (digitalRead(0) == 0 && digitalRead(1) == 1) {
select_mode = 2;//arpeggio
}
else if (digitalRead(0) == 1 && digitalRead(1) == 0) {
select_mode = 0;//chord without bass
}
if(chord_mode==2 ||chord_mode==3 ||chord_mode==4){//set each oscillator frequency
osc_scale_rate[0]=freq_rate[chord_3[select_chord3[select_table][thr%6]][0]]*osc_inverse[0];
osc_scale_rate[1]=freq_rate[chord_3[select_chord3[select_table][thr%6]][1]]*osc_inverse[1];
osc_scale_rate[2]=freq_rate[chord_3[select_chord3[select_table][thr%6]][2]]*osc_inverse[2];
};
if(chord_mode==0 ||chord_mode==1||chord_mode==5){
osc_scale_rate[0]=freq_rate[chord_4[select_chord4[select_table][thr%6]][0]]*osc_inverse[0];
osc_scale_rate[1]=freq_rate[chord_4[select_chord4[select_table][thr%6]][1]]*osc_inverse[1];
osc_scale_rate[2]=freq_rate[chord_4[select_chord4[select_table][thr%6]][2]]*osc_inverse[2];
osc_scale_rate[3]=freq_rate[chord_4[select_chord4[select_table][thr%6]][3]]*osc_inverse[3];
};
// -------------------push sw , change wavetable-------------------------------
push_sw = digitalRead(6);
if (push_sw == 0 && old_push_sw == 1) {//when push sw ON
waveform++;//change waveform
if (waveform > 7) {
waveform = 0;
}
table_set();
}
}
void qnt_set(){//quantize v/oct input
if(chord_mode==0 ||chord_mode==1 ||chord_mode==2||chord_mode==3){//major scale
for(j=0;j<31;j++){
if(adc>=majthr[j] && adc<majthr[j+1]){
thr=j;
}
}
for(j=0;j<31;j++){
qnt[j]=majqnt[j];
}
}
if(chord_mode==4 ||chord_mode==5){//minor scale
for(j=0;j<31;j++){
if(adc>=minthr[j] && adc<minthr[j+1]){
thr=j;
}
}
for(j=0;j<31;j++){
qnt[j]=minqnt[j];
}
}
}
void table_set() {//make wavetable
switch (waveform) {
case 0:
for (int i = 0; i < 256; i++) { //saw
wavetable[i] = i * 4 - 512;
}
break;
case 1:
for (int i = 0; i < 256; i++) { //sin
wavetable[i] = (sin(2 * M_PI * i / 256)) * 511;
}
break;
case 2:
for (int i = 0; i < 128; i++) { //squ
wavetable[i] = 511;
wavetable[i + 128] = -511;
}
break;
case 3:
for (int i = 0; i < 128; i++) { //tri
wavetable[i] = i * 8 - 511;
wavetable[i + 128] = 511 - i * 8;
}
break;
case 4:
for (int i = 0; i < 128; i++) { //oct saw
wavetable[i] = i * 4 - 512 + i * 2;
wavetable[i + 128] = i * 2 - 256 + i * 4;
}
break;
case 5:
for (int i = 0; i < 256; i++) { //FM1
wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 3 * i / 256)) ) * 511;
}
break;
case 6:
for (int i = 0; i < 256; i++) { //FM2
wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 7 * i / 256))) * 511;
}
break;
case 7:
for (int i = 0; i < 256; i++) { //FM3
wavetable[i] = (sin(2 * M_PI * i / 256 + sin(2 * M_PI * 4 * i / 256 + sin(2 * M_PI * 11 * i / 256)))) * 511;
}
break;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment