|
@@ -17,7 +17,8 @@ class TinyOp(Enum):
|
17
|
17
|
writeOp = 5
|
18
|
18
|
writeTableOp = 6
|
19
|
19
|
holdDelayOp = 7
|
20
|
|
- invalidOp = 8
|
|
20
|
+ flagsOp = 8
|
|
21
|
+ invalidOp = 9
|
21
|
22
|
|
22
|
23
|
|
23
|
24
|
class TinyRegAddr(Enum):
|
|
@@ -40,7 +41,22 @@ class TinyRegAddr(Enum):
|
40
|
41
|
kMaxAllowTmrAddr = 16
|
41
|
42
|
kDelayCoarseAddr = 17
|
42
|
43
|
kDelayFineAddr = 18
|
|
44
|
+ kFlagsAddr = 19
|
|
45
|
+
|
|
46
|
+class TinyRegAddr0(Enum):
|
|
47
|
+ kRdRegAddrAddr = 0
|
|
48
|
+ kRdSrcAddr = 1
|
|
49
|
+ kWrRegAddrAddr = 2
|
|
50
|
+ kWrDstAddr = 3
|
|
51
|
+ kAttkDutyAddr = 4
|
|
52
|
+ kAttkDurHiAddr = 5
|
|
53
|
+ kAttkDurLoAddr = 6
|
|
54
|
+ kDecayStepAddr = 7
|
|
55
|
+ kDecayDecrAddr = 8
|
|
56
|
+ kPwmDutyAddr = 9
|
|
57
|
+ kErrorCodeAddr = 10
|
43
|
58
|
|
|
59
|
+
|
44
|
60
|
class TinyConst(Enum):
|
45
|
61
|
kRdRegSrcId = TinyRegAddr.kRdRegAddrAddr.value # 0
|
46
|
62
|
kRdTableSrcId = TinyRegAddr.kRdTableAddrAddr.value # 1
|
|
@@ -263,6 +279,14 @@ class Picadae:
|
263
|
279
|
|
264
|
280
|
return res
|
265
|
281
|
|
|
282
|
+ def set_flags( self, midi_pitch, flags ):
|
|
283
|
+ return self.call_op( midi_pitch, TinyOp.flagsOp.value, [int(flags)] )
|
|
284
|
+ #return self.call_op( midi_pitch, 5, [int(flags)] )
|
|
285
|
+
|
|
286
|
+ def get_flags( self, midi_pitch, time_out_ms=250 ):
|
|
287
|
+ return self.block_on_picadae_read_reg( midi_pitch, TinyRegAddr.kFlagsAddr.value, byteOutN=1, time_out_ms=time_out_ms )
|
|
288
|
+ #return self.block_on_picadae_read_reg( midi_pitch, TinyRegAddr.kAttkDutyAddr.value, byteOutN=1, time_out_ms=time_out_ms )
|
|
289
|
+
|
266
|
290
|
|
267
|
291
|
def set_velocity_map( self, midi_pitch, midi_vel, pulse_usec ):
|
268
|
292
|
coarse,fine = self._usec_to_coarse_and_fine( pulse_usec )
|
|
@@ -321,7 +345,18 @@ class Picadae:
|
321
|
345
|
self.make_note( midi_pitch, base_atk_us + i*delta_us, dur_ms )
|
322
|
346
|
time.sleep( dur_ms / 1000.0 )
|
323
|
347
|
return Result()
|
|
348
|
+
|
|
349
|
+ def make_scale( self, pitch0, pitch1, atk_us, dur_ms ):
|
324
|
350
|
|
|
351
|
+ if pitch0>pitch1:
|
|
352
|
+ printf("pitch0 must be <= pitch1")
|
|
353
|
+ else:
|
|
354
|
+ for pitch in range(pitch0,pitch1+1):
|
|
355
|
+ self.make_note( pitch, atk_us, dur_ms )
|
|
356
|
+ time.sleep( dur_ms / 1000.0 )
|
|
357
|
+ return Result()
|
|
358
|
+
|
|
359
|
+
|
325
|
360
|
def set_log_level( self, log_level ):
|
326
|
361
|
self.log_level = log_level
|
327
|
362
|
return Result()
|
|
@@ -344,6 +379,17 @@ class Picadae:
|
344
|
379
|
|
345
|
380
|
x = coarse*coarse_usec + fine*self.prescaler_usec
|
346
|
381
|
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+ #####
|
|
385
|
+ # n = int(16e6*usec/(256*1e6))
|
|
386
|
+
|
|
387
|
+ # coarse = n >> 8;
|
|
388
|
+ # fine = n & 0xff;
|
|
389
|
+
|
|
390
|
+ # x = usec
|
|
391
|
+ ####
|
|
392
|
+
|
347
|
393
|
print("C:%i F:%i : %i %i (%i)" % (coarse,fine, x, usec, usec-x ))
|
348
|
394
|
|
349
|
395
|
return coarse,fine
|