Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
R
rp2040 Chord Vco
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
sdiy
rp2040 Chord Vco
Commits
7559cd14
Commit
7559cd14
authored
2 years ago
by
Arthur Saunier
Browse files
Options
Downloads
Patches
Plain Diff
add soft for RP2040
parent
21ec9704
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
Soft/Rp2040/Rp2040.ino
+456
-0
456 additions, 0 deletions
Soft/Rp2040/Rp2040.ino
with
456 additions
and
0 deletions
Soft/Rp2040/Rp2040.ino
0 → 100644
+
456
−
0
View file @
7559cd14
#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
;
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment