-
Notifications
You must be signed in to change notification settings - Fork 2
/
hagiwo_generative_seq.ino
357 lines (298 loc) · 10.6 KB
/
hagiwo_generative_seq.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#include <SPI.h>
#include <FastGPIO.h>
//#include <EEPROM.h>
#define SWITCH_PIN1 2
#define SWITCH_PIN2 4
#define GATE_OUT 5
#define LED_OUT 6
#define CLK_PIN 7
#define MAIN_POT_PIN A2
#define SUB_POT_PIN A4
byte stgAgate[2][16] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
byte stgBgate[2][16] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
int stgAcv[2][16] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
int stgBcv[2][16] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
byte i = 0;
byte j = 0;
byte k = 0;
byte gate_set = 1;
byte gate_count = 0;
byte old_gate_count = 0;
byte chance_set = 3;//メインツマミの読み取り値。chanceに数字を渡す
byte chance = 1;//chance_setとlengthから決定。抽選で音が変わる数
byte lottery_stepA = 2;//stgA抽選
byte lottery_stepB = 2;//stgB抽選
byte lottery_done = 2;//抽選を頭一回だけに限定する
const int LDAC = 9; // ラッチ動作出力ピン
int sub_knob = 0 ;//サブツマミの読み取りAD値
int old_sub_knob = 0;//SW切り替え直後、切り替え前のAD値を反映させないため、古いADを記憶
byte refrain_set = 1;//リフレインの設定回数。AD値から導出。
byte refrain_count = 0;//リフレインした回数をカウント。指定値に達すると0に戻る。
byte length_set = 4;//レングスの数値
int width_max = 1023;
int width_min = 0;
int main_knob = 0 ;//メインツマミの読み取りAD値
byte repeat_set = 0;//リピートの設定回数。AD値から導出。
byte repeat_count = 0;//リピートした回数をカウント。指定値に達すると0に戻る
byte mode_swA = 0;
byte mode_swB = 0;
byte mode_set = 0; //0=length,1=width,2=refrain
byte old_mode_set = 4;//SW切り替え直後、切り替え前のAD値を反映させないため、SW状態を記憶
void setup() {
pinMode(LDAC, OUTPUT) ;//DAC通信用
pinMode(SS, OUTPUT) ;//DAC通信用
pinMode(CLK_PIN, INPUT); //gate_input
pinMode(GATE_OUT, OUTPUT); //gate_output
pinMode(LED_OUT, OUTPUT);//LED_output
pinMode(SWITCH_PIN1, INPUT_PULLUP);//mode_swA
pinMode(SWITCH_PIN2, INPUT_PULLUP);//mode_swB
digitalWrite(LED_OUT,HIGH);
digitalWrite(GATE_OUT,HIGH);
delay(500);
digitalWrite(LED_OUT,LOW);
digitalWrite(GATE_OUT,LOW);
delay(500);
digitalWrite(LED_OUT,HIGH);
digitalWrite(GATE_OUT,HIGH);
delay(500);
digitalWrite(LED_OUT,LOW);
digitalWrite(GATE_OUT,LOW);
delay(500);
//
// length_set = EEPROM.read(0);//前回終了時のデータ読み出し
// refrain_set = EEPROM.read(1);//前回終了時のデータ読み出し
// width_max = EEPROM.read(2);//前回終了時のデータ読み出し
// width_min = EEPROM.read(3);//前回終了時のデータ読み出し
SPI.begin();
SPI.setBitOrder(MSBFIRST) ; // ビットオーダー
SPI.setClockDivider(SPI_CLOCK_DIV4) ;// クロック(CLK)をシステムクロックの1/4で使用(16MHz/4)
SPI.setDataMode(SPI_MODE0) ; // クロック極性0(LOW) クロック位相0
delay(50);
for (i = 0; i < 2 ; i = i + 1) {
for (j = 0; j < 16 ; j = j + 1) {
stgAgate [i][j] = random(2);
stgBgate [i][j] = random(2);
stgAcv [i][j] = random(1024);
stgBcv [i][j] = random(1024);
}
}
}
void loop() {
//-------------外部入力状態の読み取り-----------------
gate_set = digitalRead(CLK_PIN);//gate_input状態を読み取り
main_knob = analogRead(MAIN_POT_PIN);
sub_knob = analogRead(SUB_POT_PIN);
mode_swA = digitalRead(SWITCH_PIN1);
mode_swB = digitalRead(SWITCH_PIN2);
old_mode_set = mode_set;
if ( mode_swA == 1 && mode_swB == 0 ) {
mode_set = 0;//length
}
else if ( mode_swA == 1 && mode_swB == 1 ) {
mode_set = 1;//width
}
else if ( mode_swA == 0 && mode_swB == 1 ) {
mode_set = 2; //refrain
}
if (old_mode_set != mode_set ) {
old_sub_knob = sub_knob;
// EEPROM.update(0, length_set); //変更データをEEPROMに書き込み
// EEPROM.update(1, refrain_set); //変更データをEEPROMに書き込み
// EEPROM.update(2, width_max); //変更データをEEPROMに書き込み
// EEPROM.update(3, width_min); //変更データをEEPROMに書き込み
}
//-------------refrainの設定----------------------
if ( mode_set == 2 && abs(old_sub_knob - sub_knob ) > 30) {
old_sub_knob = 1200;//abs(old_sub_knob - sub_knob ) > 30が絶対に成立するため
if ( sub_knob < 25 ) {
refrain_set = 1;//refrainしない
}
else if ( sub_knob < 313 && sub_knob >= 26 ) {
refrain_set = 2;//1回繰り返し
}
else if ( sub_knob < 624 && sub_knob >= 314 ) {
refrain_set = 3;//2回繰り返し
}
else if ( sub_knob < 873 && sub_knob >= 625 ) {
refrain_set = 4;//3回繰り返し
}
else if ( sub_knob >= 874 ) {
refrain_set = 8;//7回繰り返し
}
}
//----------------length設定---------------------
if ( mode_set == 0 && abs(old_sub_knob - sub_knob ) > 30) {
old_sub_knob = 1200;//abs(old_sub_knob - sub_knob ) > 30が絶対に成立するため
if ( sub_knob < 25 ) {
length_set = 4;
}
else if ( sub_knob < 313 && sub_knob >= 26 ) {
length_set = 6;
}
else if ( sub_knob < 624 && sub_knob >= 314 ) {
length_set = 8;
}
else if ( sub_knob < 873 && sub_knob >= 625 ) {
length_set = 12;
}
else if ( sub_knob >= 874 ) {
length_set = 16;
}
}
//-------------widthの設定----------------------
if ( mode_set == 1 && abs(old_sub_knob - sub_knob ) > 30) {
old_sub_knob = 1200;//abs(old_sub_knob - sub_knob ) > 30が絶対に成立するため
width_max = 612 + sub_knob * 4 / 10;
width_min = 412 - sub_knob * 4 / 10;
}
//-------------repeatの設定----------------------
if ( main_knob < 5 ) {
repeat_set = 0;//repeatしない
chance = 0;
}
else if ( main_knob < 111 && main_knob >= 6 ) {
repeat_set = 0;//repeatしない
chance = 1;
}
else if ( main_knob < 214 && main_knob >= 112 ) {
repeat_set = 0;//repeatしない
chance = 2;
}
else if ( main_knob < 376 && main_knob >= 215 ) {
repeat_set = 0;//repeatしない
if ( length_set == 4 || length_set == 6 ) {
chance = 3;
}
else {
chance = 4;
}
}
else if ( main_knob < 555 && main_knob >= 377 ) {
repeat_set = 0;//repeatしない
chance = length_set;
}
else if ( main_knob < 700 && main_knob >= 556 ) {
repeat_set = 1;//repeatしない
if ( length_set == 4 || length_set == 6 ) {
chance = 3;
}
else {
chance = 4;
}
}
else if ( main_knob < 861 && main_knob >= 701 ) {
repeat_set = 1;//repeatしない
chance = 2;
}
else if ( main_knob < 970 && main_knob >= 862 ) {
repeat_set = 1;//repeatしない
chance = 1;
}
else if ( main_knob < 1024 && main_knob >= 971 ) {
repeat_set = 1;//repeatしない
chance = 0;
}
//----------------抽選処理開始---------------------
if (refrain_count == 0 && gate_count == 1 && lottery_done == 0 && repeat_count == 0 ) {
lottery();//抽選処理開始
lottery_done = 1;
}
//-----------------stgシーケンス出力-----------------
switch (repeat_count) {
case 0:
switch (gate_set) {
case 0: //gate_inputがLOWのとき
digitalWrite(GATE_OUT, LOW); //gate_outputをLOWにする
old_gate_count = gate_count;
break;
case 1: //gate_inputがHIGHのとき
if (old_gate_count == gate_count) {
gate_count ++;
if ( gate_count > length_set ) {
gate_count = 1;
refrain_count ++;
if (refrain_count >= refrain_set ) {//stgAからstgBへの橋渡し
repeat_count++;
refrain_count = 0;
lottery_done = 0;
}
}
WriteRegister(map(stgAcv[0][gate_count - 1], 0, 1023, width_min, width_max));
digitalWrite(GATE_OUT, stgAgate[0][gate_count - 1]); //CV出力を出してからゲート出力
analogWrite(6, stgAcv[0][gate_count] / 4);
break;
}
break;
}
case 1:
if (repeat_set == 0 ) {
repeat_count = 0;
}
else {
switch (gate_set) {
case 0: //gate_inputがLOWのとき
digitalWrite(5, LOW); //gate_outputをLOWにする
old_gate_count = gate_count;
break;
case 1: //gate_inputがHIGHのとき
if (old_gate_count == gate_count) {
gate_count ++;
if ( gate_count > length_set ) {
gate_count = 1;
refrain_count ++;
if (refrain_count >= refrain_set ) {//stgBからstgAへの橋渡し
repeat_count++;
refrain_count = 0;
if ( repeat_count >= 2 ) {
repeat_count = 0;
lottery_done = 0;
}
}
}
WriteRegister(map(stgBcv[0][gate_count - 1], 0, 1023, width_min, width_max));
digitalWrite(5, stgBgate[0][gate_count - 1]); //CV出力を出してからゲート出力
analogWrite(LED_OUT, stgBcv[0][gate_count] / 4);
break;
}
break;
}
}
//開発用
// Serial.print( sub_knob);
// Serial.print(",");
// Serial.print( length_set);
// Serial.println("");
}
}
void lottery() {
if ( chance != 0 ) {
for (k = 0; k <= chance ; k = k + 1) {
lottery_stepA = random(length_set);
stgAgate[0][lottery_stepA] = 1 - stgAgate[0][lottery_stepA];
stgAcv[0][lottery_stepA] = random(1024);
lottery_stepB = random(length_set);
stgBgate[0][lottery_stepB] = 1 - stgBgate[0][lottery_stepB];
stgBcv[0][lottery_stepB] = random(1024);
}
}
}
void WriteRegister(int dat) {
digitalWrite(LDAC, HIGH) ;
digitalWrite(SS, LOW) ;
SPI.transfer((dat >> 6) | 0x30) ; // Highバイト(0x30=OUTA/BUFなし/1x/シャットダウンなし)
SPI.transfer((dat << 2) & 0xff) ; // Lowバイトの出力
digitalWrite(SS, HIGH) ;
digitalWrite(LDAC, LOW) ; // ラッチ信号を出す
}