Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Util
diff options
context:
space:
mode:
authorJames <olpc@localhost.localdomain>2007-01-29 11:14:17 (GMT)
committer James <olpc@localhost.localdomain>2007-01-29 11:14:17 (GMT)
commit37d5b1c8b1248eb86db2dc8d0550569cd08b8535 (patch)
treedee858c8c92be50f742b4c85d30cbee0a24c4c35 /Util
parent9b3d8e0a679913b29390fab8f2da7c68acc9bd1c (diff)
merged new notelooper into edit
Diffstat (limited to 'Util')
-rw-r--r--Util/CSoundClient.py10
-rw-r--r--Util/CSoundNote.py13
-rw-r--r--Util/Clooper/SoundClient.cpp80
-rw-r--r--Util/Clooper/SoundClient.h6
-rwxr-xr-xUtil/Clooper/_SClient.sobin126467 -> 131293 bytes
5 files changed, 73 insertions, 36 deletions
diff --git a/Util/CSoundClient.py b/Util/CSoundClient.py
index 3da180a..c40efb1 100644
--- a/Util/CSoundClient.py
+++ b/Util/CSoundClient.py
@@ -234,6 +234,16 @@ class CSoundClientPlugin( CSoundClientBase ):
for (o,n) in onset_note:
n.playLoop() # a special non-documented CSoundNote function!
+ def loopAdd(self, notelist ):
+ for n in notelist:
+ n.playLoop() # a special non-documented CSoundNote function!
+
+ def loopClear(self):
+ sc_loop_clear()
+ def loopDel( self, notelist ):
+ print 'ERROR: CSoundClient::loopDel() note removing is not implemented, clearing instead'
+ sc_loop_clear()
+
def loopStart(self):
sc_loop_playing(1)
def loopStop(self):
diff --git a/Util/CSoundNote.py b/Util/CSoundNote.py
index bf215ca..77ea459 100644
--- a/Util/CSoundNote.py
+++ b/Util/CSoundNote.py
@@ -47,6 +47,7 @@ def CSound_playNote( loopMode, secs_per_tick,
if instr == 'drum3kit':
instr = Config.DRUM3INSTRUMENTS[ key ]
pitch = 1
+ time_in_ticks = 0
else:
pitch = GenerationConstants.TRANSPOSE[ pitch - 24 ]
@@ -56,6 +57,7 @@ def CSound_playNote( loopMode, secs_per_tick,
# condition for overlaped notes
if Config.INSTRUMENTS[ instr ].csoundInstrumentId == 102 and overlap:
duration += 1.0
+ time_in_ticks = 1
# condition for tied notes
if Config.INSTRUMENTS[ instr].csoundInstrumentId == Config.INST_TIED and tied and fullDuration:
@@ -64,7 +66,7 @@ def CSound_playNote( loopMode, secs_per_tick,
if Config.INSTRUMENTS[ instr ].csoundInstrumentId == Config.INST_PERC and overlap:
duration = duration + 1.0
if loopMode :
- sc_loop_addScoreEvent15( 'i',
+ sc_loop_addScoreEvent15( time_in_ticks, 'i',
Config.INSTRUMENTS[ instr ].csoundInstrumentId + trackId * 0.01,
onset,
duration,
@@ -73,15 +75,15 @@ def CSound_playNote( loopMode, secs_per_tick,
amplitude,
pan,
Config.INSTRUMENT_TABLE_OFFSET + Config.INSTRUMENTS[instr].instrumentId,
- max(attack*duration, 0.002),
- max(decay *duration, 0.002),
+ attack,
+ decay,
filterType,
filterCutoff,
Config.INSTRUMENTS[ instr ].loopStart,
Config.INSTRUMENTS[ instr ].loopEnd,
Config.INSTRUMENTS[ instr ].crossDur )
else:
- sc_scoreEvent15( 'i',
+ sc_scoreEvent15( 0, 'i',
Config.INSTRUMENTS[ instr ].csoundInstrumentId + trackId * 0.01,
onset * secs_per_tick,
duration,
@@ -99,6 +101,7 @@ def CSound_playNote( loopMode, secs_per_tick,
Config.INSTRUMENTS[ instr ].crossDur )
class CSoundNote :
+ NOTE_ID_COUNTER = 0
#-----------------------------------
# initialization
#-----------------------------------
@@ -140,6 +143,8 @@ class CSoundNote :
else:
self.instrumentFlag = self.instrument
self.nchanges = 0
+ self.noteId = self.NOTE_ID_COUNTER
+ self.NOTE_ID_COUNTER += 1
def __getstate__(self):
return {'onset': self.onset,
diff --git a/Util/Clooper/SoundClient.cpp b/Util/Clooper/SoundClient.cpp
index 116e8c6..3b5f90a 100644
--- a/Util/Clooper/SoundClient.cpp
+++ b/Util/Clooper/SoundClient.cpp
@@ -8,32 +8,43 @@
#include "SoundClient.h"
#include <vector>
#include <map>
+#include <cmath>
+
+using namespace std;
struct ev_t
{
- int onset;
char type;
+ int onset;
+ bool time_in_ticks;
+ MYFLT prev_secs_per_tick;
+ MYFLT duration, attack, decay;
std::vector<MYFLT> param;
- ev_t(char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15)
- : onset(onset), type(type), param(15)
+ ev_t(char type, bool in_ticks, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15)
+ : type(type), onset(0), time_in_ticks(in_ticks), param(15)
{
onset = (int) p2;
+ duration = p3;
+ attack = p9;
+ decay = p10;
+ prev_secs_per_tick = -1.0;
+
param[0] = p1;
- param[1] = 0.0;
- param[2] = p3;
- param[3] = p4;
- param[4] = p5;
- param[5] = p6;
- param[6] = p7;
- param[7] = p8;
- param[8] = p9;
- param[9] = p10;
- param[10] = p11;
- param[11] = p12;
- param[12] = p13;
- param[13] = p14;
- param[14] = p15;
+ param[1] = 0.0; //onset
+ param[2] = p3; //duration
+ param[3] = p4; //pitch
+ param[4] = p5; //reverbSend
+ param[5] = p6; //amplitude
+ param[6] = p7; //pan
+ param[7] = p8; //table
+ param[8] = p9; //attack
+ param[9] = p10; //decay
+ param[10] = p11;//filterType
+ param[11] = p12;//filterCutoff
+ param[12] = p13;//loopStart
+ param[13] = p14;//loopEnd
+ param[14] = p15;//crossDur
}
bool operator<(const ev_t &e) const
{
@@ -46,8 +57,16 @@ struct ev_t
fprintf(f, "\n");
}
- void event(CSOUND * csound)
+ void event(CSOUND * csound, MYFLT secs_per_tick)
{
+ if (time_in_ticks && (secs_per_tick != prev_secs_per_tick))
+ {
+ param[2] = duration * secs_per_tick;
+ param[8] = max(0.002f, attack * secs_per_tick);
+ param[9] = max(0.002f, decay * secs_per_tick);
+ prev_secs_per_tick = secs_per_tick;
+ fprintf(stdout, "setting duration to %f\n", param[5]);
+ }
csoundScoreEvent(csound, type, &param[0], param.size());
}
};
@@ -55,8 +74,9 @@ struct EvLoop
{
int tick_prev;
int tickMax;
- double rtick;
- double ticks_per_ksmp;
+ MYFLT rtick;
+ MYFLT secs_per_tick;
+ MYFLT ticks_per_ksmp;
typedef std::pair<int, ev_t *> pair_t;
typedef std::multimap<int, ev_t *>::iterator iter_t;
std::multimap<int, ev_t *> ev;
@@ -64,8 +84,9 @@ struct EvLoop
CSOUND * csound;
void * mutex;
- EvLoop(CSOUND * cs) : tick_prev(0), tickMax(1), rtick(0.0), ticks_per_ksmp(0.3333), ev_pos(ev.end()), csound(cs), mutex(NULL)
+ EvLoop(CSOUND * cs) : tick_prev(0), tickMax(1), rtick(0.0), ev(), ev_pos(ev.end()), csound(cs), mutex(NULL)
{
+ setTickDuration(0.05);
mutex = csoundCreateMutex(0);
}
~EvLoop()
@@ -105,14 +126,15 @@ struct EvLoop
void setTick(int t)
{
t = t % tickMax;
- rtick = (double)(t % tickMax);
+ rtick = (MYFLT)(t % tickMax);
//TODO: binary search would be faster
csoundLockMutex(mutex);
ev_pos = ev.lower_bound( t );
csoundUnlockMutex(mutex);
}
- void setTickDuration(double d)
+ void setTickDuration(MYFLT d)
{
+ secs_per_tick = d;
ticks_per_ksmp = 1.0 / (d * csoundGetKr(csound));
if (0) fprintf(stderr, "INFO: duration %lf -> ticks_pr_skmp %lf\n", d, ticks_per_ksmp);
}
@@ -134,7 +156,7 @@ struct EvLoop
while (ev_pos != ev.end())
{
if (f) ev_pos->second->print(f);
- if (events < eventMax) ev_pos->second->event(csound);
+ if (events < eventMax) ev_pos->second->event(csound, secs_per_tick);
++ev_pos;
++events;
++loop0;
@@ -144,7 +166,7 @@ struct EvLoop
while ((ev_pos != ev.end()) && (tick >= ev_pos->first))
{
if (f) ev_pos->second->print(f);
- if (events < eventMax) ev_pos->second->event(csound);
+ if (events < eventMax) ev_pos->second->event(csound, secs_per_tick);
++ev_pos;
++events;
++loop1;
@@ -354,7 +376,7 @@ int sc_stop()
return sc_tt->stop();
}
//set the output volume to given level. max volume is 100.0
-void sc_setMasterVolume(double v)
+void sc_setMasterVolume(MYFLT v)
{
sc_tt->setMasterVolume(v);
}
@@ -405,13 +427,13 @@ void sc_loop_setTick(int ctick)
{
sc_tt->loop->setTick(ctick);
}
-void sc_loop_setTickDuration(double secs_per_tick)
+void sc_loop_setTickDuration(MYFLT secs_per_tick)
{
sc_tt->loop->setTickDuration(secs_per_tick);
}
-void sc_loop_addScoreEvent15(char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15)
+void sc_loop_addScoreEvent15(int in_ticks, char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15)
{
- sc_tt->loop->addEvent( new ev_t(type, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15));
+ sc_tt->loop->addEvent( new ev_t(type, in_ticks, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15));
}
void sc_loop_clear()
{
diff --git a/Util/Clooper/SoundClient.h b/Util/Clooper/SoundClient.h
index fd1b4bd..a946ced 100644
--- a/Util/Clooper/SoundClient.h
+++ b/Util/Clooper/SoundClient.h
@@ -12,18 +12,18 @@ extern "C"
int sc_initialize(char * csd);
int sc_start();
int sc_stop();
- void sc_setMasterVolume(double);
+ void sc_setMasterVolume(float);
void sc_inputMessage(const char *msg);
void sc_scoreEvent4(char type, MYFLT p0, MYFLT p1, MYFLT p2, MYFLT p3);
void sc_scoreEvent15(char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15);
- void sc_loop_addScoreEvent15(char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15);
+ void sc_loop_addScoreEvent15(int in_ticks, char type, MYFLT p1, MYFLT p2, MYFLT p3, MYFLT p4, MYFLT p5, MYFLT p6, MYFLT p7, MYFLT p8, MYFLT p9, MYFLT p10, MYFLT p11, MYFLT p12, MYFLT p13, MYFLT p14, MYFLT p15);
void sc_loop_clear();
int sc_loop_getTick();
void sc_loop_playing(int tf);
void sc_loop_setNumTicks(int nticks);
void sc_loop_setTick(int ctick);
- void sc_loop_setTickDuration(double secs_per_tick);
+ void sc_loop_setTickDuration(MYFLT secs_per_tick);
#ifdef __cplusplus
}
#endif
diff --git a/Util/Clooper/_SClient.so b/Util/Clooper/_SClient.so
index 594ebe3..90f73ca 100755
--- a/Util/Clooper/_SClient.so
+++ b/Util/Clooper/_SClient.so
Binary files differ