Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Util/CSoundClient.py
diff options
context:
space:
mode:
Diffstat (limited to 'Util/CSoundClient.py')
-rw-r--r--Util/CSoundClient.py272
1 files changed, 145 insertions, 127 deletions
diff --git a/Util/CSoundClient.py b/Util/CSoundClient.py
index 0555929..2bab169 100644
--- a/Util/CSoundClient.py
+++ b/Util/CSoundClient.py
@@ -12,6 +12,16 @@ from Generation.GenerationConstants import GenerationConstants
from Util.Clooper.aclient import *
from Util import NoteDB
+
+_note_template = array.array('f', [0] * 19 )
+def _new_note_array():
+ return _note_template.__copy__()
+
+def _noteid(dbnote):
+ return (dbnote.page << 16) + dbnote.id
+
+_loop_default=0
+
class _CSoundClientPlugin:
#array index constants for csound
@@ -37,31 +47,27 @@ class _CSoundClientPlugin:
self.on = False
#self.masterVolume = 80.0
self.periods_per_buffer = 2
+ global _loop_default
+ _loop_default = self.loopCreate()
def __del__(self):
self.connect(False)
sc_destroy()
def setChannel(self, name, val):
- if self.on:
- sc_setChannel(name, val)
+ sc_setChannel(name, val)
def setMasterVolume(self, volume):
- #self.masterVolume = volume
- if self.on:
- sc_setMasterVolume(volume)
+ sc_setChannel( 'masterVolume', volume)
def setTrackVolume( self, volume, trackId ):
- self.trackVolume = volume
- sc_setTrackVolume(volume, trackId+1)
+ sc_setChannel( 'trackVolume' + str(trackId + 1), volume )
def setTrackpadX( self, value ):
- trackpadX = value
- sc_setTrackpadX(trackpadX)
+ sc_setChannel( 'trackpadX', value)
def setTrackpadY( self, value ):
- trackpadY = value
- sc_setTrackpadY(trackpadY)
+ sc_setChannel( 'trackpadY', value)
def micRecording( self, table ):
sc_inputMessage( Config.CSOUND_MIC_RECORD % table )
@@ -113,37 +119,61 @@ class _CSoundClientPlugin:
def inputMessage(self,msg):
sc_inputMessage(msg)
- def loopClear(self):
- sc_loop_clear()
- def loopDelete(self, dbnote):
- sc_loop_delScoreEvent( (dbnote.page << 16) + dbnote.id)
- def loopDelete1(self, page, id):
- sc_loop_delScoreEvent( (page << 16) + id)
- def loopStart(self):
- sc_loop_playing(1)
- def loopPause(self):
- sc_loop_playing(0)
- def loopSetTick(self,t):
- sc_loop_setTick(t)
- def loopGetTick(self):
- return sc_loop_getTick()
- def loopSetNumTicks(self,n):
- sc_loop_setNumTicks(n)
- def loopSetTickDuration(self,d):
- sc_loop_setTickDuration(d)
- def loopAdjustTick(self,d):
- sc_loop_adjustTick(d)
- def loopSetTempo(self,t):
+ def getTick( self ):
+ return sc_getTickf()
+
+ def adjustTick( self, amt ):
+ sc_adjustTick(amt)
+
+ def setTempo(self,t):
if (Config.DEBUG > 3) : print 'INFO: loop tempo: %f -> %f' % (t, 60.0 / (Config.TICKS_PER_BEAT * t))
- sc_loop_setTickDuration( 60.0 / (Config.TICKS_PER_BEAT * t))
+ sc_setTickDuration( 60.0 / (Config.TICKS_PER_BEAT * t))
+
+
+ def loopCreate(self):
+ return sc_loop_new()
+
+ def loopDestroy(self, loopId):
+ sc_loop_delete(loopId)
+
+ def loopClear(self):
+ global _loop_default
+ sc_loop_delete(_loop_default)
+ _loop_default = sc_loop_new()
+
+ # this is function deletes an Event from a loop
+ # TODO: rename this function
+ def loopDelete(self, dbnote, loopId=_loop_default):
+ sc_loop_delScoreEvent( loopId, _noteid(dbnote))
+
+ def loopDelete1(self, page, id, loopId=_loop_default):
+ sc_loop_delScoreEvent( loopId, (page << 16) + id)
+
+ def loopStart(self, loopId=_loop_default):
+ sc_loop_playing(loopId, 1)
- def loopDeactivate(self, note = None):
- if note == None:
- sc_loop_deactivate_all()
+ def loopPause(self, loopId=_loop_default):
+ sc_loop_playing(loopId, 0)
+
+ def loopSetTick(self,t, loopId=_loop_default):
+ sc_loop_setTickf(loopId, t)
+
+ def loopGetTick(self, loopId=_loop_default):
+ return sc_loop_getTickf(loopId)
+
+ def loopSetNumTicks(self,n, loopId=_loop_default):
+ sc_loop_setNumTicks(loopId, n)
+
+ def loopSetTickDuration(self,d, loopId=_loop_default):
+ sc_loop_setTickDuration(loopId, d)
+
+ def loopDeactivate(self, note = 'all', loopId=_loop_default):
+ if note == 'all':
+ sc_loop_deactivate_all(loopId)
else:
if (Config.DEBUG > 0) : print 'ERROR: deactivating a single note is not implemented'
- def loopUpdate(self, note, parameter, value,cmd):
+ def loopUpdate(self, note, parameter, value,cmd, loopId=_loop_default):
page = note.page
track = note.track
id = note.id
@@ -156,7 +186,7 @@ class _CSoundClientPlugin:
instrument_id_offset = 100
if (parameter == NoteDB.PARAMETER.ONSET):
if (Config.DEBUG > 2): print 'INFO: updating onset', (page<<16)+id, value
- sc_loop_updateEvent( (page<<16)+id, 1, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, 1, value, cmd)
elif (parameter == NoteDB.PARAMETER.PITCH):
if (Config.DEBUG > 2): print 'INFO: updating pitch', (page<<16)+id, value
pitch = value
@@ -165,18 +195,18 @@ class _CSoundClientPlugin:
csoundInstId = instrument.csoundInstrumentId
csoundTable = Config.INSTRUMENT_TABLE_OFFSET + instrument.instrumentId
if (Config.DEBUG > 2): print 'INFO: updating drum instrument (pitch)', (page<<16)+id, instrument.name, csoundInstId
- sc_loop_updateEvent( (page<<16)+id, 0, (csoundInstId + instrument_id_offset) + note.track * 0.01, -1 )
- sc_loop_updateEvent( (page<<16)+id, 7, csoundTable , -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 0, (csoundInstId + instrument_id_offset) + note.track * 0.01, -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 7, csoundTable , -1 )
pitch = 1
else:
pitch = GenerationConstants.TRANSPOSE[ pitch - 24 ]
- sc_loop_updateEvent( (page<<16)+id, 3, pitch, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, 3, pitch, cmd)
elif (parameter == NoteDB.PARAMETER.AMPLITUDE):
if (Config.DEBUG > 2): print 'INFO: updating amp', (page<<16)+id, value
- sc_loop_updateEvent( (page<<16)+id, 5, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, 5, value, cmd)
elif (parameter == NoteDB.PARAMETER.DURATION):
if (Config.DEBUG > 2): print 'INFO: updating duration', (page<<16)+id, value
- sc_loop_updateEvent( (page<<16)+id, self.DURATION, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.DURATION, value, cmd)
elif (parameter == NoteDB.PARAMETER.INSTRUMENT):
pitch = note.cs.pitch
instrument = Config.INSTRUMENTSID[value]
@@ -188,42 +218,43 @@ class _CSoundClientPlugin:
loopEnd = instrument.loopEnd
crossDur = instrument.crossDur
if (Config.DEBUG > 2): print 'INFO: updating instrument', (page<<16)+id, instrument.name, csoundInstId
- sc_loop_updateEvent( (page<<16)+id, 0, (csoundInstId + (track+1) + instrument_id_offset) + note.track * 0.01, cmd )
- sc_loop_updateEvent( (page<<16)+id, 7, csoundTable, -1 )
- sc_loop_updateEvent( (page<<16)+id, 12, loopStart, -1 )
- sc_loop_updateEvent( (page<<16)+id, 13, loopEnd, -1 )
- sc_loop_updateEvent( (page<<16)+id, 14, crossDur , -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 0, (csoundInstId + (track+1) + instrument_id_offset) + note.track * 0.01, cmd )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 7, csoundTable, -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 12, loopStart, -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 13, loopEnd, -1 )
+ sc_loop_updateEvent( loopId, (page<<16)+id, 14, crossDur , -1 )
elif (parameter == NoteDB.PARAMETER.PAN):
- sc_loop_updateEvent( (page<<16)+id, self.PAN, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.PAN, value, cmd)
elif (parameter == NoteDB.PARAMETER.REVERB):
- sc_loop_updateEvent( (page<<16)+id, self.REVERBSEND, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.REVERBSEND, value, cmd)
elif (parameter == NoteDB.PARAMETER.ATTACK):
- sc_loop_updateEvent( (page<<16)+id, self.ATTACK, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.ATTACK, value, cmd)
elif (parameter == NoteDB.PARAMETER.DECAY):
- sc_loop_updateEvent( (page<<16)+id, self.DECAY, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.DECAY, value, cmd)
elif (parameter == NoteDB.PARAMETER.FILTERTYPE):
- sc_loop_updateEvent( (page<<16)+id, self.FILTERTYPE, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.FILTERTYPE, value, cmd)
elif (parameter == NoteDB.PARAMETER.FILTERCUTOFF):
- sc_loop_updateEvent( (page<<16)+id, self.FILTERCUTOFF, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.FILTERCUTOFF, value, cmd)
elif (parameter == NoteDB.PARAMETER.INSTRUMENT2):
- sc_loop_updateEvent( (page<<16)+id, self.INSTRUMENT2, value, cmd)
+ sc_loop_updateEvent( loopId, (page<<16)+id, self.INSTRUMENT2, value, cmd)
else:
if (Config.DEBUG > 0): print 'ERROR: loopUpdate(): unsupported parameter change'
-
- def loopPlay(self, dbnote, active):
+ def loopPlay(self, dbnote, active, storage=_new_note_array(),
+ loopId=_loop_default ):
qid = (dbnote.page << 16) + dbnote.id
- sc_loop_addScoreEvent( qid, 1, active, 'i', self.csnote_to_array(dbnote.cs))
+ sc_loop_addScoreEvent( loopId, qid, 1, active, 'i',
+ self.csnote_to_array( dbnote.cs, storage))
- def play(self, csnote, secs_per_tick):
- a = self.csnote_to_array(csnote)
+ def play(self, csnote, secs_per_tick, storage=_new_note_array()):
+ a = self.csnote_to_array(csnote, storage)
a[self.DURATION] = a[self.DURATION] * secs_per_tick
a[self.ATTACK] = max(a[self.ATTACK]*a[self.DURATION], 0.002)
a[self.DECAY] = max(a[self.DECAY]*a[self.DURATION], 0.002)
sc_scoreEvent( 'i', a)
- def csnote_to_array(self, csnote):
- return self.csnote_to_array1(
+ def csnote_to_array(self, csnote, storage):
+ return self._csnote_to_array1(storage,
csnote.onset,
csnote.pitch,
csnote.amplitude,
@@ -240,22 +271,11 @@ class _CSoundClientPlugin:
csnote.mode,
csnote.instrumentId2 )
- def csnote_to_array1( self, onset,
- pitch,
- amplitude,
- pan,
- duration,
- trackId,
- attack = 0.002,
- decay = 0.098,
- reverbSend = 0.1,
- filterType = 0,
- filterCutoff = 1000,
- tied = False,
- instrumentId = Config.INSTRUMENTS["flute"].instrumentId,
- mode = 'edit',
- instrumentId2 = -1 ):
+ def _csnote_to_array1( self, storage, onset, pitch, amplitude, pan, duration,
+ trackId, attack, decay, reverbSend, filterType, filterCutoff,
+ tied, instrumentId, mode, instrumentId2 = -1):
+ rval=storage
instrument = Config.INSTRUMENTSID[instrumentId]
if instrument.kit != None:
instrument = instrument.kit[pitch]
@@ -267,63 +287,61 @@ class _CSoundClientPlugin:
instrument_id_offset = 0
# condition for tied notes
- if instrument.csoundInstrumentId == Config.INST_TIED and tied and mode == 'mini':
- duration = -1
- instrument_id_offset = 0
- elif instrument.csoundInstrumentId == Config.INST_TIED and not tied and mode == 'mini':
- instrument_id_offset = 0
- elif instrument.csoundInstrumentId == Config.INST_TIED and tied and mode == 'edit' and duration < 0:
- duration = -1
- instrument_id_offset = 0
- elif instrument.csoundInstrumentId == Config.INST_TIED and tied and mode == 'edit' and duration > 0:
- instrument_id_offset = 0
- elif instrument.csoundInstrumentId == Config.INST_TIED and not tied and mode == 'edit':
- instrument_id_offset = 100
-
- if instrument.csoundInstrumentId == Config.INST_SIMP and mode == 'mini':
- instrument_id_offset = 0
- elif instrument.csoundInstrumentId == Config.INST_SIMP and mode == 'edit':
- if instrument.soundClass == 'drum':
- instrument_id_offset = 0
+ if instrument.csoundInstrumentId == Config.INST_TIED:
+ if tied:
+ if mode == 'mini':
+ duration = -1
+ instrument_id_offset = 0
+ elif mode == 'edit':
+ instrument_id_offset = 0
+ if duration < 0:
+ duration = -1
else:
- instrument_id_offset = 100
+ if mode == 'mini':
+ instrument_id_offset = 0
+ elif mode == 'edit':
+ instrument_id_offset = 100
+
+ if instrument.csoundInstrumentId == Config.INST_SIMP:
+ if mode == 'mini':
+ instrument_id_offset = 0
+ elif mode == 'edit':
+ if instrument.soundClass == 'drum':
+ instrument_id_offset = 0
+ else:
+ instrument_id_offset = 100
+
+ rval[0] = (instrument.csoundInstrumentId + \
+ (trackId+1) + instrument_id_offset) + trackId * 0.01
+ rval[1] = onset
+ rval[2] = duration
+ rval[3] = pitch
+ rval[4] = reverbSend
+ rval[5] = amplitude
+ rval[6] = pan
+ rval[7] = Config.INSTRUMENT_TABLE_OFFSET + instrument.instrumentId
+ rval[8] = attack
+ rval[9] = decay
+ rval[10]= filterType
+ rval[11]= filterCutoff
+ rval[12]= instrument.loopStart
+ rval[13]= instrument.loopEnd
+ rval[14]= instrument.crossDur
if instrumentId2 != -1:
instrument2 = Config.INSTRUMENTSID[instrumentId2]
csInstrumentId2 = (instrument2.csoundInstrumentId + 100) * 0.0001
- secondInstrument = Config.INSTRUMENT_TABLE_OFFSET + instrumentId2 + csInstrumentId2
- loopStart2 = instrument2.loopStart
- loopEnd2 = instrument2.loopEnd
- crossDur2 = instrument2.crossDur
+ rval[15] = Config.INSTRUMENT_TABLE_OFFSET + instrumentId2 + csInstrumentId2
+ rval[16] = instrument2.loopStart
+ rval[17] = instrument2.loopEnd
+ rval[18] = instrument2.crossDur
else:
- secondInstrument = -1
- loopStart2 = 0
- loopEnd2 = 0
- crossDur2 = 0
-
- a = array.array('f')
- a.extend( [
- (instrument.csoundInstrumentId + (trackId+1) + instrument_id_offset) + trackId * 0.01,
- onset,
- duration,
- pitch,
- reverbSend,
- amplitude,
- pan,
- Config.INSTRUMENT_TABLE_OFFSET + instrument.instrumentId,
- attack,
- decay,
- filterType,
- filterCutoff,
- instrument.loopStart,
- instrument.loopEnd,
- instrument.crossDur,
- secondInstrument,
- loopStart2,
- loopEnd2,
- crossDur2])
- return a
+ rval[15] = -1
+ rval[16] = 0
+ rval[17] = 0
+ rval[18] = 0
+ return rval
_Client = None