69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
|
import types
|
||
|
import time
|
||
|
|
||
|
class ChordTester:
|
||
|
def __init__( self, cfg, api ):
|
||
|
self.api = api
|
||
|
self.cfg = types.SimpleNamespace(**cfg.ChordTester)
|
||
|
|
||
|
self.nextMs = 0
|
||
|
self.isStartedFl = False
|
||
|
self.curNoteCnt = 0
|
||
|
self.curRepeatCnt = 0
|
||
|
self.isPlayingFl = False
|
||
|
|
||
|
|
||
|
def start( self ):
|
||
|
self.api.set_hold_duty_all( self.cfg.holdDuty )
|
||
|
if self.cfg.useVelTableFl:
|
||
|
self.api.set_vel_table_all( self.cfg.pitchL )
|
||
|
self.curNoteCnt = 0
|
||
|
self.curRepeatCnt = 0
|
||
|
self.isStartedFl = True
|
||
|
|
||
|
def stop( self ):
|
||
|
self.isStartedFl = False
|
||
|
self.api.all_notes_off()
|
||
|
|
||
|
|
||
|
|
||
|
def tick( self, ms ):
|
||
|
|
||
|
if self.isStartedFl and ms >= self.nextMs:
|
||
|
|
||
|
if self.isPlayingFl:
|
||
|
|
||
|
# turn notes off
|
||
|
for i in range(0,self.curNoteCnt+1):
|
||
|
self.api.note_off( self.cfg.pitchL[i])
|
||
|
time.sleep( 0.01 )
|
||
|
|
||
|
# repeat or advance the chord note count
|
||
|
self.curRepeatCnt += 1
|
||
|
if self.curRepeatCnt >= self.cfg.repeatCnt:
|
||
|
self.curRepeatCnt = 0
|
||
|
self.curNoteCnt += 1
|
||
|
if self.curNoteCnt >= len(self.cfg.pitchL):
|
||
|
self.isStartedFl = False
|
||
|
self.curNoteCnt = 0
|
||
|
|
||
|
self.isPlayingFl = False
|
||
|
self.nextMs = ms + self.cfg.pauseMs
|
||
|
|
||
|
else:
|
||
|
for i in range(0,self.curNoteCnt+1):
|
||
|
if self.cfg.useVelTableFl:
|
||
|
self.api.note_on_vel(self.cfg.pitchL[i], 45 )
|
||
|
else:
|
||
|
self.api.note_on_us(self.cfg.pitchL[i], self.cfg.atkUsec)
|
||
|
time.sleep( 0.02 )
|
||
|
|
||
|
self.nextMs = ms + self.cfg.durMs
|
||
|
self.isPlayingFl = True
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|