Merge branch 'develop' of gitea.larke.org:klarke/libcm into develop

This commit is contained in:
kevin 2020-08-01 08:08:33 -04:00
commit 47d4dda2b0
12 changed files with 489 additions and 115 deletions

17
.gitignore vendored
View File

@ -1,3 +1,20 @@
Makefile.in Makefile.in
.DS_Store .DS_Store
aclocal.m4
config.h.in
config.h.in~
configure
Makefile.in
autom4te.cache
build-aux
m4/libtool.m4
m4/lt~obsolete.m4
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
m4/.DS_Store

View File

@ -354,10 +354,15 @@ cmAdRC_t _cmAdParseSysJsonTree( cmAd_t* p )
{ {
cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args; cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args;
const cmJsonNode_t* argsNodePtr = cmJsonArrayElementC(ssArrayNodePtr,j); const cmJsonNode_t* argsNodePtr = cmJsonArrayElementC(ssArrayNodePtr,j);
asap->inDevIdx = cmInvalidIdx;
asap->outDevIdx = cmInvalidIdx;
asap->inDevLabel = NULL;
asap->outDevLabel = NULL;
if((jsRC = cmJsonMemberValues( argsNodePtr, &errLabelPtr, if((jsRC = cmJsonMemberValues( argsNodePtr, &errLabelPtr,
"inDevIdx", kIntTId, &asap->inDevIdx, "inDevLabel", kStringTId, &asap->inDevLabel,
"outDevIdx", kIntTId, &asap->outDevIdx, "outDevLabel", kStringTId, &asap->outDevLabel,
"syncToInputFl", kTrueTId, &asap->syncInputFl, "syncToInputFl", kTrueTId, &asap->syncInputFl,
"msgQueueByteCnt", kIntTId, &asap->msgQueueByteCnt, "msgQueueByteCnt", kIntTId, &asap->msgQueueByteCnt,
"devFramesPerCycle", kIntTId, &asap->devFramesPerCycle, "devFramesPerCycle", kIntTId, &asap->devFramesPerCycle,
@ -443,6 +448,35 @@ cmAdRC_t _cmAdCreateAggDevices( cmAd_t* p )
return rc; return rc;
} }
cmAdRC_t _cmAdResolveDeviceLabels( cmAd_t* p )
{
cmAdRC_t rc = kOkAdRC;
unsigned i,j;
// for each cmAsAudioSysCfg record in audioSysCfgArray[]
for(i=0; i<p->asCfgCnt; ++i)
{
// for each audio system sub-subsystem
for(j=0; j<p->asCfgArray[i].cfg.ssCnt; ++j)
{
cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args;
if((asap->inDevIdx = cmApDeviceLabelToIndex( asap->inDevLabel )) == cmInvalidId )
{
rc = cmErrMsg(&p->err,kInvalidAudioDevIdxAdRC,"The audio input device '%s' could not be found.", cmStringNullGuard(asap->inDevLabel));
goto errLabel;
}
if((asap->outDevIdx = cmApDeviceLabelToIndex( asap->outDevLabel )) == cmInvalidId )
{
rc = cmErrMsg(&p->err,kInvalidAudioDevIdxAdRC,"The audio input device '%s' could not be found.", cmStringNullGuard(asap->inDevLabel));
goto errLabel;
}
}
}
errLabel:
return rc;
}
cmAdRC_t _cmAdCreateNrtDevices( cmAd_t* p ) cmAdRC_t _cmAdCreateNrtDevices( cmAd_t* p )
{ {
cmAdRC_t rc = kOkAdRC; cmAdRC_t rc = kOkAdRC;
@ -721,10 +755,11 @@ cmAdRC_t cmAudDspAlloc( cmCtx_t* ctx, cmAdH_t* hp, cmMsgSendFuncPtr_t cbFunc, vo
if((rc = _cmAdParseSysJsonTree(p)) != kOkAdRC ) if((rc = _cmAdParseSysJsonTree(p)) != kOkAdRC )
goto errLabel; goto errLabel;
// create the aggregate device // create the aggregate device
if( _cmAdCreateAggDevices(p) != kOkAdRC ) if( _cmAdCreateAggDevices(p) != kOkAdRC )
goto errLabel; goto errLabel;
// create the non-real-time devices // create the non-real-time devices
if( _cmAdCreateNrtDevices(p) != kOkAdRC ) if( _cmAdCreateNrtDevices(p) != kOkAdRC )
goto errLabel; goto errLabel;
@ -740,6 +775,12 @@ cmAdRC_t cmAudDspAlloc( cmCtx_t* ctx, cmAdH_t* hp, cmMsgSendFuncPtr_t cbFunc, vo
goto errLabel; goto errLabel;
} }
if( _cmAdResolveDeviceLabels(p) != kOkApRC )
{
rc = cmErrMsg(&p->err,kAudioPortFailAdRC,"Audio device labels could not be resolved..");
goto errLabel;
}
// initialize the audio buffer // initialize the audio buffer
if( cmApBufInitialize( cmApDeviceCount(), p->meterMs ) != kOkApRC ) if( cmApBufInitialize( cmApDeviceCount(), p->meterMs ) != kOkApRC )
{ {

View File

@ -27,7 +27,8 @@ extern "C" {
kAggDevCreateFailAdRC, kAggDevCreateFailAdRC,
kNrtDevSysFailAdRC, kNrtDevSysFailAdRC,
kAfpDevSysFailAdRC, kAfpDevSysFailAdRC,
kNetSysFailAdRC kNetSysFailAdRC,
kInvalidAudioDevIdxAdRC
}; };

View File

@ -189,6 +189,10 @@ cmApRC_t cmApNrtAllocate( cmRpt_t* rpt )
cmApRC_t cmApNrtFree() cmApRC_t cmApNrtFree()
{ {
cmApRC_t rc = kOkApRC; cmApRC_t rc = kOkApRC;
if( _cmNrt == NULL )
return rc;
cmApNrtDev_t* dp = _cmNrt->devs; cmApNrtDev_t* dp = _cmNrt->devs;
while( dp != NULL ) while( dp != NULL )
{ {

View File

@ -130,16 +130,18 @@ extern "C" {
// Audio device sub-sytem configuration record // Audio device sub-sytem configuration record
typedef struct cmAudioSysArgs_str typedef struct cmAudioSysArgs_str
{ {
cmRpt_t* rpt; // system console object cmRpt_t* rpt; // system console object
unsigned inDevIdx; // input audio device const cmChar_t* inDevLabel; // input audio device text label
unsigned outDevIdx; // output audio device const cmChar_t* outDevLabel; // output audio device text label
bool syncInputFl; // true/false sync the DSP update callbacks with audio input/output unsigned inDevIdx; // input audio device index
unsigned msgQueueByteCnt; // Size of the internal msg queue used to buffer msgs arriving via cmAudioSysDeliverMsg(). unsigned outDevIdx; // output audio device index
unsigned devFramesPerCycle; // (512) Audio device samples per channel per device update buffer. bool syncInputFl; // true/false sync the DSP update callbacks with audio input/output
unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle. unsigned msgQueueByteCnt; // Size of the internal msg queue used to buffer msgs arriving via cmAudioSysDeliverMsg().
unsigned audioBufCnt; // (3) Audio device buffers. unsigned devFramesPerCycle; // (512) Audio device samples per channel per device update buffer.
double srate; // Audio sample rate. unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle.
int srateMult; // Sample rate multiplication factor (negative for divide) unsigned audioBufCnt; // (3) Audio device buffers.
double srate; // Audio sample rate.
int srateMult; // Sample rate multiplication factor (negative for divide)
} cmAudioSysArgs_t; } cmAudioSysArgs_t;
// Audio sub-system configuration record. // Audio sub-system configuration record.

45
src/cmPP_NARG.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef cmPP_NARG_H
#define cmPP_NARG_H
// Taken from here:
// https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s
// and here:
// https://stackoverflow.com/questions/4421681/how-to-count-the-number-of-arguments-passed-to-a-function-that-accepts-a-variabl
#define PP_NARG(...) \
PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
#define PP_NARG_(...) \
PP_128TH_ARG(__VA_ARGS__)
#define PP_128TH_ARG( \
_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,N,...) N
#define PP_RSEQ_N() \
127,126,125,124,123,122,121,120, \
119,118,117,116,115,114,113,112,111,110, \
109,108,107,106,105,104,103,102,101,100, \
99,98,97,96,95,94,93,92,91,90, \
89,88,87,86,85,84,83,82,81,80, \
79,78,77,76,75,74,73,72,71,70, \
69,68,67,66,65,64,63,62,61,60, \
59,58,57,56,55,54,53,52,51,50, \
49,48,47,46,45,44,43,42,41,40, \
39,38,37,36,35,34,33,32,31,30, \
29,28,27,26,25,24,23,22,21,20, \
19,18,17,16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
#endif

View File

@ -1067,6 +1067,7 @@ enum
{ {
kChAoId, kChAoId,
kGainAoId, kGainAoId,
kEnableAoId,
kInAoId kInAoId
}; };
@ -1075,23 +1076,30 @@ cmDspClass_t _cmAudioOutDC;
typedef struct typedef struct
{ {
cmDspInst_t inst; cmDspInst_t inst;
unsigned onSymId;
unsigned offSymId;
} cmDspAudioOut_t; } cmDspAudioOut_t;
cmDspInst_t* _cmDspAudioOutAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl ) cmDspInst_t* _cmDspAudioOutAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
{ {
cmDspVarArg_t args[] = cmDspVarArg_t args[] =
{ {
{ "ch", kChAoId, 0, 0, kInDsvFl | kUIntDsvFl | kReqArgDsvFl, "Audio output channel index"}, { "ch", kChAoId, 0, 0, kInDsvFl | kUIntDsvFl | kReqArgDsvFl, "Audio output channel index"},
{ "gain",kGainAoId,0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Output gain multiplier"}, { "gain", kGainAoId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Output gain multiplier"},
{ "in", kInAoId, 0, 1, kInDsvFl | kAudioBufDsvFl, "Audio input" }, { "enable",kEnableAoId,0, 0, kInDsvFl | kSymDsvFl | kOptArgDsvFl, "Enable: on off"},
{ "in", kInAoId, 0, 1, kInDsvFl | kAudioBufDsvFl, "Audio input" },
{ NULL, 0, 0, 0, 0 } { NULL, 0, 0, 0, 0 }
}; };
cmDspAudioOut_t* p = cmDspInstAlloc(cmDspAudioOut_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl); cmDspAudioOut_t* p = cmDspInstAlloc(cmDspAudioOut_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
p->offSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"off");
p->onSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"on");
cmDspSetDefaultUInt( ctx, &p->inst, kChAoId, 0, 0); cmDspSetDefaultUInt( ctx, &p->inst, kChAoId, 0, 0);
cmDspSetDefaultDouble( ctx, &p->inst, kGainAoId, 0, 1.0); cmDspSetDefaultDouble( ctx, &p->inst, kGainAoId, 0, 1.0);
cmDspSetDefaultSymbol( ctx, &p->inst, kEnableAoId, p->onSymId );
return &p->inst; return &p->inst;
} }
@ -1106,10 +1114,12 @@ cmDspRC_t _cmDspAudioOutReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt
cmDspRC_t _cmDspAudioOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt ) cmDspRC_t _cmDspAudioOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{ {
cmDspRC_t rc = kOkDspRC; cmDspRC_t rc = kOkDspRC;
unsigned chIdx = cmDspUInt(inst,kChAoId); cmDspAudioOut_t* p = (cmDspAudioOut_t*)inst;
unsigned oChCnt = ctx->ctx->oChCnt; unsigned chIdx = cmDspUInt(inst,kChAoId);
double gain = cmDspDouble(inst,kGainAoId); bool enableFl = cmDspSymbol(inst,kEnableAoId) == p->onSymId;
unsigned oChCnt = ctx->ctx->oChCnt;
double gain = cmDspDouble(inst,kGainAoId);
if( chIdx >= oChCnt ) if( chIdx >= oChCnt )
{ {
@ -1118,7 +1128,7 @@ cmDspRC_t _cmDspAudioOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_
return rc; return rc;
} }
const cmSample_t* sp = cmDspAudioBuf(ctx,inst,kInAoId,0); const cmSample_t* sp = cmDspAudioBuf(ctx,inst,kInAoId,0);
if( sp == NULL ) if( sp == NULL )
{ {
@ -1132,7 +1142,7 @@ cmDspRC_t _cmDspAudioOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_
// if this channel is disabled or set to pass-through then chArray[chIdx] will be NULL // if this channel is disabled or set to pass-through then chArray[chIdx] will be NULL
if( ctx->ctx->oChArray[chIdx] != NULL ) if( ctx->ctx->oChArray[chIdx] != NULL )
cmVOS_MultVVS(ctx->ctx->oChArray[chIdx],n,sp,(cmSample_t)gain); cmVOS_MultVVS(ctx->ctx->oChArray[chIdx],n,sp, (cmSample_t)(enableFl ? gain : 0));
return kOkDspRC; return kOkDspRC;
} }
@ -1154,6 +1164,11 @@ cmDspRC_t _cmDspAudioOutRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_
case kGainAoId: case kGainAoId:
cmDspSetEvent(ctx,inst,evt); cmDspSetEvent(ctx,inst,evt);
break; break;
case kEnableAoId:
cmDspSetEvent(ctx,inst,evt);
break;
} }
return rc; return rc;
} }
@ -2907,6 +2922,7 @@ enum
kLoopWtId, kLoopWtId,
kBegWtId, kBegWtId,
kEndWtId, kEndWtId,
kChWtId,
kCmdWtId, kCmdWtId,
kOtWtId, kOtWtId,
kGainWtId, kGainWtId,
@ -2951,6 +2967,7 @@ typedef struct
cmAudioFileH_t afH; // current audio file handle cmAudioFileH_t afH; // current audio file handle
int nxtBegSmpIdx; // the beg/end sample index to use with the next filename to arrive at port 'fn' int nxtBegSmpIdx; // the beg/end sample index to use with the next filename to arrive at port 'fn'
int nxtEndSmpIdx; // int nxtEndSmpIdx; //
unsigned nxtChIdx;
cmThreadH_t thH; cmThreadH_t thH;
bool loadFileFl; bool loadFileFl;
cmDspCtx_t* ctx; cmDspCtx_t* ctx;
@ -2976,6 +2993,7 @@ cmDspInst_t* _cmDspWaveTableAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsi
{ "loop", kLoopWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "-1=loop forever >0=loop count (dflt:-1)"}, { "loop", kLoopWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "-1=loop forever >0=loop count (dflt:-1)"},
{ "beg", kBegWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "File begin sample index" }, { "beg", kBegWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "File begin sample index" },
{ "end", kEndWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "File end sample index (-1=play all)" }, { "end", kEndWtId, 0, 0, kInDsvFl | kIntDsvFl | kOptArgDsvFl, "File end sample index (-1=play all)" },
{ "ch", kChWtId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "File channel index 0=left, 1=right" },
{ "cmd", kCmdWtId, 0, 0, kInDsvFl | kSymDsvFl | kOptArgDsvFl, "Command: on off"}, { "cmd", kCmdWtId, 0, 0, kInDsvFl | kSymDsvFl | kOptArgDsvFl, "Command: on off"},
{ "ot", kOtWtId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Overtone count"}, { "ot", kOtWtId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Overtone count"},
{ "gain", kGainWtId, 0, 0, kInDsvFl | kDoubleDsvFl|kOptArgDsvFl, "Gain"}, { "gain", kGainWtId, 0, 0, kInDsvFl | kDoubleDsvFl|kOptArgDsvFl, "Gain"},
@ -3005,6 +3023,7 @@ cmDspInst_t* _cmDspWaveTableAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsi
cmDspSetDefaultInt( ctx, &p->inst, kLoopWtId, 0, -1 ); cmDspSetDefaultInt( ctx, &p->inst, kLoopWtId, 0, -1 );
cmDspSetDefaultInt( ctx, &p->inst, kBegWtId, 0, 0 ); cmDspSetDefaultInt( ctx, &p->inst, kBegWtId, 0, 0 );
cmDspSetDefaultInt( ctx, &p->inst, kEndWtId, 0, -1 ); cmDspSetDefaultInt( ctx, &p->inst, kEndWtId, 0, -1 );
cmDspSetDefaultUInt( ctx, &p->inst, kChWtId, 0, 0 );
cmDspSetDefaultSymbol(ctx, &p->inst, kCmdWtId, p->onSymId ); cmDspSetDefaultSymbol(ctx, &p->inst, kCmdWtId, p->onSymId );
cmDspSetDefaultUInt( ctx, &p->inst, kOtWtId, 0, 5 ); cmDspSetDefaultUInt( ctx, &p->inst, kOtWtId, 0, 5 );
cmDspSetDefaultDouble(ctx, &p->inst, kGainWtId, 0, 1.0 ); cmDspSetDefaultDouble(ctx, &p->inst, kGainWtId, 0, 1.0 );
@ -3038,10 +3057,9 @@ cmDspRC_t _cmDspWaveTableFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt
// mode then the the function will automatically begin reading from the begining of the // mode then the the function will automatically begin reading from the begining of the
// file segment. If the end of the file segment is encountered and the wave table is not // file segment. If the end of the file segment is encountered and the wave table is not
// in loop mode then the empty portion of wt[] will be set to zero. // in loop mode then the empty portion of wt[] will be set to zero.
cmDspRC_t _cmDspWaveTableReadBlock( cmDspCtx_t* ctx, cmDspWaveTable_t* p, cmSample_t* wt, unsigned rdSmpCnt, int begSmpIdx, int endSmpIdx, int maxLoopCnt ) cmDspRC_t _cmDspWaveTableReadBlock( cmDspCtx_t* ctx, cmDspWaveTable_t* p, cmSample_t* wt, unsigned rdSmpCnt, unsigned chIdx, int begSmpIdx, int endSmpIdx, int maxLoopCnt )
{ {
unsigned actFrmCnt = 0; unsigned actFrmCnt = 0;
unsigned chIdx = 0;
unsigned chCnt = 1; unsigned chCnt = 1;
unsigned fn = endSmpIdx - p->fi + 1; // count of samples between p->fi and endSmpIdx unsigned fn = endSmpIdx - p->fi + 1; // count of samples between p->fi and endSmpIdx
unsigned n0 = rdSmpCnt; unsigned n0 = rdSmpCnt;
@ -3117,9 +3135,10 @@ cmDspRC_t _cmDspWaveTableReadAudioFile( cmDspCtx_t* ctx, cmDspWaveTable_t* p, un
{ {
unsigned n0 = rdSmpCnt; unsigned n0 = rdSmpCnt;
unsigned n1 = 0; unsigned n1 = 0;
int begSmpIdx = cmDspInt(&p->inst,kBegWtId); int begSmpIdx = cmDspInt( &p->inst,kBegWtId);
int endSmpIdx = cmDspInt(&p->inst,kEndWtId); int endSmpIdx = cmDspInt( &p->inst,kEndWtId);
int maxLoopCnt= cmDspInt(&p->inst,kLoopWtId); unsigned chIdx = cmDspUInt(&p->inst,kChWtId);
int maxLoopCnt= cmDspInt( &p->inst,kLoopWtId);
if( endSmpIdx < begSmpIdx ) if( endSmpIdx < begSmpIdx )
endSmpIdx = p->fn-1; endSmpIdx = p->fn-1;
@ -3137,7 +3156,7 @@ cmDspRC_t _cmDspWaveTableReadAudioFile( cmDspCtx_t* ctx, cmDspWaveTable_t* p, un
if( p->doneFl ) if( p->doneFl )
cmVOS_Zero(p->wt + p->wti,n0); cmVOS_Zero(p->wt + p->wti,n0);
else else
if( _cmDspWaveTableReadBlock(ctx, p, p->wt+p->wti, n0,begSmpIdx,endSmpIdx,maxLoopCnt ) != kOkDspRC ) if( _cmDspWaveTableReadBlock(ctx, p, p->wt+p->wti, n0, chIdx, begSmpIdx,endSmpIdx,maxLoopCnt ) != kOkDspRC )
return cmDspInstErr(ctx,&p->inst,kVarNotValidDspRC,"An error occured while reading the wave table file."); return cmDspInstErr(ctx,&p->inst,kVarNotValidDspRC,"An error occured while reading the wave table file.");
p->wtn -= n0; // decrease the count of available samples p->wtn -= n0; // decrease the count of available samples
@ -3149,7 +3168,7 @@ cmDspRC_t _cmDspWaveTableReadAudioFile( cmDspCtx_t* ctx, cmDspWaveTable_t* p, un
if( p->doneFl ) if( p->doneFl )
cmVOS_Zero(p->wt,n1); cmVOS_Zero(p->wt,n1);
else else
if( _cmDspWaveTableReadBlock(ctx, p, p->wt, n1,begSmpIdx,endSmpIdx,maxLoopCnt ) != kOkDspRC ) if( _cmDspWaveTableReadBlock(ctx, p, p->wt, n1, chIdx, begSmpIdx,endSmpIdx,maxLoopCnt ) != kOkDspRC )
return cmDspInstErr(ctx,&p->inst,kVarNotValidDspRC,"An error occured while reading the wave table file."); return cmDspInstErr(ctx,&p->inst,kVarNotValidDspRC,"An error occured while reading the wave table file.");
p->wtn -= n1; // decrease the count of available samples p->wtn -= n1; // decrease the count of available samples
@ -3382,6 +3401,7 @@ cmDspRC_t _cmDspWaveTableReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEv
p->nxtBegSmpIdx = cmDspInt(&p->inst,kBegWtId); p->nxtBegSmpIdx = cmDspInt(&p->inst,kBegWtId);
p->nxtEndSmpIdx = cmDspInt(&p->inst,kEndWtId); p->nxtEndSmpIdx = cmDspInt(&p->inst,kEndWtId);
p->nxtChIdx = cmDspUInt(&p->inst,kChWtId);
return _cmDspWaveTableCreateTable(ctx,p); return _cmDspWaveTableCreateTable(ctx,p);
@ -3490,6 +3510,7 @@ cmDspRC_t _cmDspWaveTableRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt
cmDspSetEvent(ctx,inst,evt); // set the file name variable cmDspSetEvent(ctx,inst,evt); // set the file name variable
cmDspSetInt(ctx,inst,kBegWtId,p->nxtBegSmpIdx); // set the beg/end smp idx var's from the stored nxtBeg/EndSmpIdx values cmDspSetInt(ctx,inst,kBegWtId,p->nxtBegSmpIdx); // set the beg/end smp idx var's from the stored nxtBeg/EndSmpIdx values
cmDspSetInt(ctx,inst,kEndWtId,p->nxtEndSmpIdx); // cmDspSetInt(ctx,inst,kEndWtId,p->nxtEndSmpIdx); //
cmDspSetUInt(ctx,inst,kChWtId, p->nxtChIdx); //
cmDspSetUInt(ctx,inst,kShapeWtId,kFileWtId); // switch to file mode cmDspSetUInt(ctx,inst,kShapeWtId,kFileWtId); // switch to file mode
rc = _cmDspWaveTableCreateTable(ctx,p); // reload the wavetable rc = _cmDspWaveTableCreateTable(ctx,p); // reload the wavetable
} }
@ -3506,6 +3527,11 @@ cmDspRC_t _cmDspWaveTableRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt
p->nxtEndSmpIdx = cmDsvGetInt(evt->valuePtr); p->nxtEndSmpIdx = cmDsvGetInt(evt->valuePtr);
break; break;
case kChWtId:
// store for next incoming file name msg
p->nxtChIdx = cmDsvGetUInt(evt->valuePtr);
break;
case kShapeWtId: case kShapeWtId:
if( cmDsvGetUInt(evt->valuePtr) < kShapeWtCnt ) if( cmDsvGetUInt(evt->valuePtr) < kShapeWtCnt )
{ {
@ -5546,6 +5572,7 @@ cmDspClassConsFunc_t _cmDspClassBuiltInArray[] =
cm1UpClassCons, cm1UpClassCons,
cmGateToSymClassCons, cmGateToSymClassCons,
cmPortToSymClassCons, cmPortToSymClassCons,
cmIntToSymClassCons,
cmRouterClassCons, cmRouterClassCons,
cmAvailChClassCons, cmAvailChClassCons,

View File

@ -5587,6 +5587,7 @@ cmDspInst_t* _cmDspPortToSym_Alloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, uns
// register the symbol // register the symbol
symIdArray[i] = cmSymTblRegisterSymbol(ctx->stH,symLabel); symIdArray[i] = cmSymTblRegisterSymbol(ctx->stH,symLabel);
// input port - any msg in this port will generate an output from 'out' as well as the associated output port
cmDspArgSetup(ctx, args+kBaseInPtsId+i, symLabel, cmInvalidId, kBaseInPtsId+i, 0, 0, kInDsvFl | kTypeDsvMask, cmTsPrintfH(ctx->lhH,"%s Input.",symLabel) ); cmDspArgSetup(ctx, args+kBaseInPtsId+i, symLabel, cmInvalidId, kBaseInPtsId+i, 0, 0, kInDsvFl | kTypeDsvMask, cmTsPrintfH(ctx->lhH,"%s Input.",symLabel) );
cmDspArgSetup(ctx, args+baseOutPtsId+i, symLabel, cmInvalidId, baseOutPtsId+i, 0, 0, kOutDsvFl | kSymDsvFl, cmTsPrintfH(ctx->lhH,"%s Output.",symLabel) ); cmDspArgSetup(ctx, args+baseOutPtsId+i, symLabel, cmInvalidId, baseOutPtsId+i, 0, 0, kOutDsvFl | kSymDsvFl, cmTsPrintfH(ctx->lhH,"%s Output.",symLabel) );
@ -5631,7 +5632,7 @@ cmDspRC_t _cmDspPortToSym_Recv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEv
unsigned idx = evt->dstVarId - kBaseInPtsId; unsigned idx = evt->dstVarId - kBaseInPtsId;
assert( idx < p->symIdCnt ); assert( idx < p->symIdCnt );
cmDspSetSymbol(ctx,inst,p->baseOutPtsId + idx, p->symIdArray[idx]); cmDspSetSymbol(ctx,inst,p->baseOutPtsId + idx, p->symIdArray[idx]);
return cmDspSetSymbol(ctx,inst,kOutPtsId,p->symIdArray[ evt->dstVarId - kBaseInPtsId ]); return cmDspSetSymbol(ctx,inst,kOutPtsId, p->symIdArray[idx]);
} }
return rc; return rc;
@ -5652,6 +5653,178 @@ cmDspClass_t* cmPortToSymClassCons( cmDspCtx_t* ctx )
return &_cmPortToSym_DC; return &_cmPortToSym_DC;
} }
//------------------------------------------------------------------------------------------------------------
//)
//( { label:cmDspIntToSym file_desc:"Send a pre-defined symbol every time a message arrives a given input port." kw:[sunit] }
enum
{
kInItsId,
kOutItsId,
kBaseInItsId
};
cmDspClass_t _cmIntToSym_DC;
typedef struct
{
cmDspInst_t inst;
int* intArray;
unsigned* symIdArray;
unsigned symIdCnt;
unsigned baseIntItsId;
unsigned baseOutItsId;
} cmDspIntToSym_t;
cmDspInst_t* _cmDspIntToSym_Alloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
{
va_list vl1;
va_copy(vl1,vl);
if( va_cnt < 2 || va_cnt % 2 !=0 )
{
va_end(vl1);
cmDspClassErr(ctx,classPtr,kVarArgParseFailDspRC,"The 'IntToSym' constructor argument list must contain at least one int/symbol pair and all pairs must be complete.");
return NULL;
}
unsigned symCnt = va_cnt/2;
unsigned argCnt = 2 + 3*symCnt;
cmDspVarArg_t args[argCnt+1];
unsigned* symIdArray = cmMemAllocZ(unsigned,symCnt);
int* intArray = cmMemAllocZ(int,symCnt);
unsigned baseIntItsId = kBaseInItsId + symCnt;
unsigned baseOutItsId = baseIntItsId + symCnt;
// setup the integer input and symbol output port arg recd
cmDspArgSetup(ctx,args, "in", cmInvalidId, kInItsId, 0, 0, kInDsvFl | kIntDsvFl, "Integer input" );
cmDspArgSetup(ctx,args+1,"out", cmInvalidId, kOutItsId, 0, 0, kOutDsvFl | kSymDsvFl, "Output" );
unsigned i;
for(i=0; i<symCnt; ++i)
{
// get the integer value
intArray[i] = va_arg(vl,int);
// get the symbol label
const cmChar_t* symLabel = va_arg(vl,const char*);
assert( symLabel != NULL );
unsigned intLabelN = (symLabel==NULL ? 0 : strlen(symLabel)) + 5;
cmChar_t intLabel[ intLabelN ];
snprintf(intLabel,intLabelN,"%s%s", symLabel==NULL ? "" : symLabel, "-int" );
// register the symbol
symIdArray[i] = cmSymTblRegisterSymbol(ctx->stH,symLabel);
// trigger port associated with this symbol (any msg on this port will trigger an output)
cmDspArgSetup(ctx, args+kBaseInItsId+i, symLabel, cmInvalidId, kBaseInItsId+i, 0, 0, kInDsvFl | kTypeDsvMask, cmTsPrintfH(ctx->lhH,"%s Input.",symLabel) );
// this port is used to set the integer value associated with this symbol
cmDspArgSetup(ctx, args+baseIntItsId+i, intLabel, cmInvalidId, baseIntItsId+i, 0, 0, kInDsvFl | kIntDsvFl, cmTsPrintfH(ctx->lhH,"Set the integer value associated with %s.",symLabel) );
// symbol output port - when ever this symbol is sent out it will go out this port as well as the 'out' port
cmDspArgSetup(ctx, args+baseOutItsId+i, symLabel, cmInvalidId, baseOutItsId+i, 0, 0, kOutDsvFl | kSymDsvFl, cmTsPrintfH(ctx->lhH,"%s Output.",symLabel) );
}
cmDspArgSetupNull(args + argCnt);
cmDspIntToSym_t* p = cmDspInstAlloc(cmDspIntToSym_t,ctx,classPtr,args,instSymId,id,storeSymId,0,vl1);
p->symIdCnt = symCnt;
p->intArray = intArray;
p->symIdArray = symIdArray;
p->baseOutItsId = baseOutItsId;
p->baseIntItsId = baseIntItsId;
cmDspSetDefaultSymbol(ctx,&p->inst,kOutItsId,cmInvalidId);
va_end(vl1);
return &p->inst;
}
cmDspRC_t _cmDspIntToSym_Free(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
cmDspIntToSym_t* p = (cmDspIntToSym_t*)inst;
cmMemFree(p->symIdArray);
return kOkDspRC;
}
cmDspRC_t _cmDspIntToSym_Reset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
return cmDspApplyAllDefaults(ctx,inst);
}
cmDspRC_t _cmDspIntToSymSendOut( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned idx )
{
cmDspIntToSym_t* p = (cmDspIntToSym_t*)inst;
assert( idx < p->symIdCnt );
cmDspSetSymbol(ctx,inst,p->baseOutItsId + idx, p->symIdArray[idx]);
return cmDspSetSymbol(ctx, inst, kOutItsId, p->symIdArray[ idx ]);
}
cmDspRC_t _cmDspIntToSym_Recv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
cmDspRC_t rc = kOkDspRC;
cmDspIntToSym_t* p = (cmDspIntToSym_t*)inst;
// if an integer arrived at 'in'
if( evt->dstVarId == kInItsId )
{
cmDspSetEvent(ctx,inst,evt);
unsigned i;
int intVal = cmDspInt(inst,kInItsId);
for(i=0; i<p->symIdCnt; ++i)
if( intVal == p->intArray[i] )
{
rc = _cmDspIntToSymSendOut( ctx, inst, i );
break;
}
}
else
{
// if a msg of any type is recieved on an input port - send out the associated symbol
if( kBaseInItsId <= evt->dstVarId && evt->dstVarId < kBaseInItsId + p->symIdCnt )
{
_cmDspIntToSymSendOut( ctx, inst, evt->dstVarId - kBaseInItsId );
}
else
// if this is a new interger value for this symbol
if( p->baseIntItsId <= evt->dstVarId && evt->dstVarId < p->baseIntItsId + p->symIdCnt )
{
cmDspSetEvent(ctx,inst,evt);
p->intArray[ evt->dstVarId - p->baseIntItsId ] = cmDspInt( inst, evt->dstVarId );
}
}
return rc;
}
cmDspClass_t* cmIntToSymClassCons( cmDspCtx_t* ctx )
{
cmDspClassSetup(&_cmIntToSym_DC,ctx,"IntToSym",
NULL,
_cmDspIntToSym_Alloc,
_cmDspIntToSym_Free,
_cmDspIntToSym_Reset,
NULL,
_cmDspIntToSym_Recv,
NULL,NULL,
"If a message of any kind is received on a port then send the symbol associated with the port.");
return &_cmIntToSym_DC;
}
//------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------
//) //)
//( { label:cmDspRouter file_desc:"Route the input value to one of multiple output ports." kw:[sunit] } //( { label:cmDspRouter file_desc:"Route the input value to one of multiple output ports." kw:[sunit] }

View File

@ -36,6 +36,7 @@ extern "C" {
struct cmDspClass_str* cm1UpClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cm1UpClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmGateToSymClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cmGateToSymClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmPortToSymClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cmPortToSymClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmIntToSymClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmRouterClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cmRouterClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmAvailChClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cmAvailChClassCons( cmDspCtx_t* ctx );
struct cmDspClass_str* cmPresetClassCons( cmDspCtx_t* ctx ); struct cmDspClass_str* cmPresetClassCons( cmDspCtx_t* ctx );

View File

@ -21,6 +21,7 @@
#include "cmTime.h" #include "cmTime.h"
#include "cmAudioSys.h" #include "cmAudioSys.h"
#include "cmProcObj.h" #include "cmProcObj.h"
#include "cmPP_NARG.h"
#include "cmDspCtx.h" #include "cmDspCtx.h"
#include "cmDspClass.h" #include "cmDspClass.h"
#include "cmDspSys.h" #include "cmDspSys.h"
@ -2870,36 +2871,77 @@ cmDspRC_t _cmDspSysPgm_PortToSym( cmDspSysH_t h, void** userPtrPtr )
{ {
cmDspRC_t rc = kOkDspRC; cmDspRC_t rc = kOkDspRC;
cmDspInst_t* btn0 = cmDspSysAllocButton( h, "Btn0", 0.0 ); inst_t* btn0 = button( "Btn0", 0.0 );
cmDspInst_t* btn1 = cmDspSysAllocButton( h, "Btn1", 0.0 ); inst_t* btn1 = button( "Btn1", 0.0 );
cmDspInst_t* btn2 = cmDspSysAllocButton( h, "Btn2", 0.0 ); inst_t* btn2 = button( "Btn2", 0.0 );
cmDspInst_t* pts = cmDspSysAllocInst( h, "PortToSym", NULL, 3, "one", "two", "three"); inst_t* pts = inst( "PortToSym", NULL, "one", "two", "three");
cmDspInst_t* pr0 = cmDspSysAllocInst( h, "Printer", NULL, 1, "0:" ); inst_t* pr0 = inst( "Printer", NULL, "sym:" );
cmDspInst_t* pr1 = cmDspSysAllocInst( h, "Printer", NULL, 1, "1:" ); inst_t* pr1 = inst( "Printer", NULL, "btn:" );
inst_t* pr2 = inst( "Printer", NULL, "out:" );
// check for allocation errors // check for allocation errors
if((rc = cmDspSysLastRC(h)) != kOkDspRC ) if((rc = cmDspSysLastRC(h)) != kOkDspRC )
goto errLabel; goto errLabel;
cmDspSysInstallCb( h, btn0, "out", pts, "one",NULL); event( btn0, out, pts, one );
cmDspSysInstallCb( h, btn1, "out", pts, "two",NULL); event( btn1, out, pts, two );
cmDspSysInstallCb( h, btn2, "out", pts, "three",NULL); event( btn2, out, pts, three );
cmDspSysInstallCb( h, btn0, "out", pr1, "in",NULL); event( btn0, out, pr1, in );
cmDspSysInstallCb( h, btn1, "out", pr1, "in",NULL); event( btn1, out, pr1, in );
cmDspSysInstallCb( h, btn2, "out", pr1, "in",NULL); event( btn2, out, pr1, in );
cmDspSysInstallCb( h, pts, "one", pr0, "in", NULL );
cmDspSysInstallCb( h, pts, "two", pr0, "in", NULL );
cmDspSysInstallCb( h, pts, "three", pr0, "in", NULL );
event( pts, one, pr0, in );
event( pts, two, pr0, in );
event( pts, three, pr0, in );
event( pts, out, pr2, in );
errLabel: errLabel:
return rc; return rc;
} }
//------------------------------------------------------------------------------
//)
//( { label:cmDspPgm_IntToSym file_desc:"IntToSym example program." kw:[spgm] }
cmDspRC_t _cmDspSysPgm_IntToSym( cmDspSysH_t h, void** userPtrPtr )
{
cmDspRC_t rc = kOkDspRC;
inst_t* sel0 = scalar( "Sel0", 0.0, 10.0, 1.0, 1.0 );
inst_t* sel1 = scalar( "Sel1", 0.0, 10.0, 1.0, 1.0 );
inst_t* sel2 = scalar( "Sel2", 0.0, 10.0, 1.0, 1.0 );
inst_t* val = scalar( "Val", 0.0, 10.0, 1.0, 1.0 );
inst_t* pts = inst( "IntToSym", NULL, 0, "one", 0, "two", 0, "three");
inst_t* pr0 = inst( "Printer", NULL, "val:" );
inst_t* pr1 = inst( "Printer", NULL, "sym:" );
inst_t* pr2 = inst( "Printer", NULL, "out:" );
// check for allocation errors
if((rc = cmDspSysLastRC(h)) != kOkDspRC )
goto errLabel;
event( sel0, val, pts, one-int );
event( sel1, val, pts, two-int );
event( sel2, val, pts, three-int );
event( val, val, pts, in );
event( val, val, pr0, in );
event( pts, one, pr1, in );
event( pts, two, pr1, in );
event( pts, three, pr1, in );
event( pts, out, pr2, in );
errLabel:
return rc;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
//) //)
//( { label:cmDspPgm_Line file_desc:"Line generator example program." kw:[spgm] } //( { label:cmDspPgm_Line file_desc:"Line generator example program." kw:[spgm] }
@ -3288,6 +3330,7 @@ _cmDspSysPgm_t _cmDspSysPgmArray[] =
{ "line", _cmDspSysPgm_Line, NULL, NULL }, { "line", _cmDspSysPgm_Line, NULL, NULL },
{ "1Up", _cmDspSysPgm_1Up, NULL, NULL }, { "1Up", _cmDspSysPgm_1Up, NULL, NULL },
{ "PortToSym", _cmDspSysPgm_PortToSym, NULL, NULL }, { "PortToSym", _cmDspSysPgm_PortToSym, NULL, NULL },
{ "IntToSym", _cmDspSysPgm_IntToSym, NULL, NULL },
{ "preset", _cmDspSysPgm_Preset, NULL, NULL }, { "preset", _cmDspSysPgm_Preset, NULL, NULL },
{ "rsrcWr", _cmDspSysPgm_RsrcWr, NULL, NULL }, { "rsrcWr", _cmDspSysPgm_RsrcWr, NULL, NULL },
{ "router", _cmDspSysPgm_Router, NULL, NULL }, { "router", _cmDspSysPgm_Router, NULL, NULL },

View File

@ -62,27 +62,22 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
//int baseAudioInCh = 0; // 2; //int baseAudioInCh = 0; // 2;
int baseAudioOutCh = 0;// 2; int baseAudioOutCh = 0;// 2;
//cmDspInst_t* ai0 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, baseAudioInCh + 0);
//cmDspInst_t* ai1 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, baseAudioInCh + 1);
//cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 2, "MOTU - Traveler mk3", "MIDI Port");
//cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 2, "Apple Inc. - IAC Driver", "Bus 1");
cmDspInst_t* tlp = cmDspSysAllocInst(h,"TimeLine", "tl", 2, r.tlFn, r.tlPrefixPath ); cmDspInst_t* tlp = cmDspSysAllocInst(h,"TimeLine", "tl", 2, r.tlFn, r.tlPrefixPath );
cmDspInst_t* scp = cmDspSysAllocInst(h,"Score", "sc", 1, r.scFn ); cmDspInst_t* scp = cmDspSysAllocInst(h,"Score", "sc", 1, r.scFn );
cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" ); cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" );
cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 ); cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable",NULL, 2, ((int)cmDspSysSampleRate(h)), 1 ); cmDspInst_t* wt0 = cmDspSysAllocInst(h,"WaveTable", NULL, 7, ((int)cmDspSysSampleRate(h)), 1, NULL, -1, 0, -1, 0 );
cmDspInst_t* wt1 = cmDspSysAllocInst(h,"WaveTable", NULL, 7, ((int)cmDspSysSampleRate(h)), 1, NULL, -1, 0, -1, 1 );
cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 ); cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 );
cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 ); cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 );
//cmDspInst_t* pic = cmDspSysAllocInst(h,"Picadae", NULL, 0 );
cmDspInst_t* mop = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "Fastlane","Fastlane MIDI A" );
cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "Fastlane","Fastlane MIDI B");
cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 5, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl ); cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 5, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl );
cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 ); cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 );
cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" ); cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" );
cmDspInst_t* its = cmDspSysAllocInst(h,"IntToSym", NULL, 2, 0, "off");
unsigned preGrpSymId = cmDspSysPresetRegisterGroup(h,"tl"); unsigned preGrpSymId = cmDspSysPresetRegisterGroup(h,"tl");
unsigned cmpPreGrpSymId = cmDspSysPresetRegisterGroup(h,"tl_cmp"); unsigned cmpPreGrpSymId = cmDspSysPresetRegisterGroup(h,"tl_cmp");
@ -95,14 +90,14 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspSysNewPage(h,"Controls-1"); cmDspSysNewPage(h,"Controls-1");
_cmDspSys_TlXformChain(h, &c1, preGrpSymId, cmpPreGrpSymId, amp, modp, 1, 1 ); _cmDspSys_TlXformChain(h, &c1, preGrpSymId, cmpPreGrpSymId, amp, modp, 1, 1 );
cmDspInst_t* lmix = cmDspSysAllocInst(h, "AMix", NULL, 1, 2 );
cmDspInst_t* rmix = cmDspSysAllocInst(h, "AMix", NULL, 1, 2 );
cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+2 ); // 4 Piano 1 Output cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+0 );
cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+3 ); // 5 2 cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+1 );
cmDspInst_t* ao2 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+0 ); // 2 Transform 1 OUtput
cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+1 ); // 3 2
cmDspSysNewPage(h,"Main"); cmDspSysNewPage(h,"Main");
cmDspInst_t* notesOffb= cmDspSysAllocInst(h,"Button", "notesOff", 2, kButtonDuiId, 1.0 ); //cmDspInst_t* notesOffb= cmDspSysAllocInst(h,"Button", "notesOff", 2, kButtonDuiId, 1.0 );
cmDspInst_t* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 ); cmDspInst_t* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 );
cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 ); cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 );
cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 ); cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 );
@ -115,11 +110,7 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
// Record <-> Live switches // Record <-> Live switches
cmDspInst_t* tlRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); // time line swich cmDspInst_t* tlRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); // time line swich
cmDspInst_t* mfpRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); cmDspInst_t* mfpRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
//cmDspInst_t* amRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
//cmDspSysNewColumn(h,0);
//cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
//cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
//cmDspSysNewColumn(h,0); //cmDspSysNewColumn(h,0);
cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
@ -127,6 +118,16 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
cmDspInst_t* ogain3 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-3", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain3 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-3", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
cmDspInst_t* ogainW = cmDspSysAllocInst(h,"Scalar", "Wet Master", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
cmDspInst_t* ogainD = cmDspSysAllocInst(h,"Scalar", "Dry Master", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
cmDspInst_t* gmult0 = cmDspSysAllocInst(h,"ScalarOp", NULL, 6, 2, "*", "in-0", 1.0, "in-1", 1.0 );
cmDspInst_t* gmult1 = cmDspSysAllocInst(h,"ScalarOp", NULL, 6, 2, "*", "in-0", 1.0, "in-1", 1.0 );
cmDspInst_t* gmult2 = cmDspSysAllocInst(h,"ScalarOp", NULL, 6, 2, "*", "in-0", 1.0, "in-1", 1.0 );
cmDspInst_t* gmult3 = cmDspSysAllocInst(h,"ScalarOp", NULL, 6, 2, "*", "in-0", 1.0, "in-1", 1.0 );
// Audio file recording // Audio file recording
cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 ); cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 );
cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 ); cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 );
@ -135,10 +136,11 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0); cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0); cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
cmDspInst_t* meas = cmDspSysAllocInst(h,"Scalar", "Meas", 5, kNumberDuiId, 1.0, 59.0,1.0, 1.0 ); cmDspInst_t* meas = cmDspSysAllocInst(h,"Scalar", "Begin Meas", 5, kNumberDuiId, 1.0, 1000.0, 1.0, 1.0 );
cmDspInst_t* emeas = cmDspSysAllocInst(h,"Scalar", "End Meas", 5, kNumberDuiId, 1.0, 1000.0, 1.0, 1.0 );
cmDspSysInstallCb( h, meas, "val", scp, "meas", NULL); cmDspSysInstallCb( h, meas, "val", scp, "meas", NULL);
cmDspSysInstallCb( h, meas, "val", tlp, "meas", NULL); cmDspSysInstallCb( h, meas, "val", tlp, "meas", NULL);
@ -173,37 +175,34 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL ); cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL );
// Audio connections // Audio connections
cmDspSysConnectAudio(h, php, "out", wt0, "phs" ); // phasor -> wave table
cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table cmDspSysConnectAudio(h, php, "out", wt1, "phs" ); //
cmDspSysConnectAudio(h, wtp, "out", ao0, "in" ); // wave table -> audio out (dry output)
cmDspSysConnectAudio(h, wtp, "out", ao1, "in" ); //
//cmDspSysConnectAudio( h, ai0, "out", ao0, "in" ); // dry signal through cmDspSysConnectAudio(h, wt0, "out", lmix, "in-0" ); // wave table -> audio out (dry output)
//cmDspSysConnectAudio( h, ai1, "out", ao1, "in" ); // cmDspSysConnectAudio(h, wt1, "out", rmix, "in-0" ); //
//cmDspSysConnectAudio( h, ai0, "out", mi0p, "in" ); //
//cmDspSysConnectAudio( h, ai0, "out", c0.kr0, "in" ); // ain -> ch0.kr0
//cmDspSysConnectAudio( h, ai0, "out", c0.kr1, "in" ); // ain -> ch0.kr1
cmDspSysConnectAudio( h, wtp, "out", mi0p, "in" ); // //cmDspSysConnectAudio(h, wt0, "out", lmix, "in-1" ); // wave table -> audio out (dry output)
cmDspSysConnectAudio( h, wtp, "out", c0.kr0, "in" ); // ain -> ch0.kr0 //cmDspSysConnectAudio(h, wt1, "out", rmix, "in-1" ); //
cmDspSysConnectAudio( h, wtp, "out", c0.kr1, "in" ); // ain -> ch0.kr1
cmDspSysConnectAudio( h, wt0, "out", mi0p, "in" ); //
cmDspSysConnectAudio( h, wt0, "out", c0.kr0, "in" ); // ain -> ch0.kr0
cmDspSysConnectAudio( h, wt0, "out", c0.kr1, "in" ); // ain -> ch0.kr1
cmDspSysConnectAudio( h, c0.cmp,"out", ao2, "in" ); // ch0.cmp -> aout cmDspSysConnectAudio( h, c0.cmp,"out", lmix, "in-1" ); // ch0.cmp -> aout
cmDspSysConnectAudio( h, c0.cmp,"out", afop, "in0"); // ch0.cmp -> audio_file_out cmDspSysConnectAudio( h, c0.cmp,"out", afop, "in0"); // ch0.cmp -> audio_file_out
//cmDspSysConnectAudio( h, ai1, "out", mi1p, "in" ); //
//cmDspSysConnectAudio( h, ai1, "out", c1.kr0, "in" ); // ain -> ch1.kr0
//cmDspSysConnectAudio( h, ai1, "out", c1.kr1, "in" ); // ain -> ch1.kr1
cmDspSysConnectAudio( h, wtp, "out", mi1p, "in" ); // cmDspSysConnectAudio( h, wt1, "out", mi1p, "in" ); //
cmDspSysConnectAudio( h, wtp, "out", c1.kr0, "in" ); // ain -> ch1.kr0 cmDspSysConnectAudio( h, wt1, "out", c1.kr0, "in" ); // ain -> ch1.kr0
cmDspSysConnectAudio( h, wtp, "out", c1.kr1, "in" ); // ain -> ch1.kr1 cmDspSysConnectAudio( h, wt1, "out", c1.kr1, "in" ); // ain -> ch1.kr1
cmDspSysConnectAudio( h, c1.cmp,"out", ao3, "in" ); // ch1.cmp -> aout cmDspSysConnectAudio( h, c1.cmp,"out", rmix, "in-1" ); // ch1.cmp -> aout
cmDspSysConnectAudio( h, c1.cmp,"out", afop, "in1"); // ch1.cmp ->audio_file_out cmDspSysConnectAudio( h, c1.cmp,"out", afop, "in1"); // ch1.cmp ->audio_file_out
cmDspSysConnectAudio( h, lmix, "out", ao0, "in" );
cmDspSysConnectAudio( h, rmix, "out", ao1, "in" );
cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas. cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas.
@ -252,8 +251,9 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspSysInstallCb( h, sfp, "vcost",prt, "in", NULL ); // cmDspSysInstallCb( h, sfp, "vcost",prt, "in", NULL ); //
cmDspSysInstallCb( h, sfp, "vtyp", prc, "in", NULL ); // cmDspSysInstallCb( h, sfp, "vtyp", prc, "in", NULL ); //
*/ */
// wave-table to time-line cursor // wave-table to time-line cursor
//cmDspSysInstallCb( h, wtp, "fidx",tlp, "curs", NULL); cmDspSysInstallCb( h, wt0, "fidx",tlp, "curs", NULL);
cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL ); cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
@ -267,7 +267,8 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL ); cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL );
cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL ); cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL );
cmDspSysInstallCb(h, pts, "on", wtp, "cmd", NULL ); cmDspSysInstallCb(h, pts, "on", wt0, "cmd", NULL );
cmDspSysInstallCb(h, pts, "on", wt1, "cmd", NULL );
cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL ); cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL );
cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind", NULL ); cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind", NULL );
cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL ); cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL );
@ -278,11 +279,10 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
// stop connections // stop connections
cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL. cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL.
cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL ); cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL );
cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL ); cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL );
cmDspSysInstallCb(h, pts, "off", wtp, "cmd", NULL ); cmDspSysInstallCb(h, pts, "off", wt0, "cmd", NULL );
cmDspSysInstallCb(h, pts, "off", wt1, "cmd", NULL );
cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL ); cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL );
cmDspSysInstallCb(h, offb, "sym", mop, "reset", NULL );
cmDspSysInstallCb(h, offb, "sym", mo2p,"reset", NULL );
// time-line to MIDI file player selection // time-line to MIDI file player selection
@ -292,9 +292,13 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
// time-line to Audio file player selection // time-line to Audio file player selection
cmDspSysInstallCb(h, tlp, "absi", wtp, "beg", NULL ); cmDspSysInstallCb(h, tlp, "absi", wt0, "beg", NULL );
cmDspSysInstallCb(h, tlp, "aesi", wtp, "end", NULL ); cmDspSysInstallCb(h, tlp, "aesi", wt0, "end", NULL );
cmDspSysInstallCb(h, tlp, "afn", wtp, "fn", NULL ); cmDspSysInstallCb(h, tlp, "afn", wt0, "fn", NULL );
cmDspSysInstallCb(h, tlp, "absi", wt1, "beg", NULL );
cmDspSysInstallCb(h, tlp, "aesi", wt1, "end", NULL );
cmDspSysInstallCb(h, tlp, "afn", wt1, "fn", NULL );
// score to score follower - to set initial search location // score to score follower - to set initial search location
cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL ); cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL );
@ -309,40 +313,45 @@ cmDspRC_t _cmDspSysPgm_TimeLineLiteAf(cmDspSysH_t h, void** userPtrPtr )
cmDspSysInstallCb(h, msrc, "d1", sfp, "d1", NULL ); cmDspSysInstallCb(h, msrc, "d1", sfp, "d1", NULL );
cmDspSysInstallCb(h, msrc, "d1", nmp, "d1", NULL ); cmDspSysInstallCb(h, msrc, "d1", nmp, "d1", NULL );
cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL );
//cmDspSysInstallCb(h, nmp, "d1", pic, "d1", NULL );
//cmDspSysInstallCb(h, pic, "d1", mo2p, "d1", NULL );
cmDspSysInstallCb(h, msrc, "d0", sfp, "d0", NULL ); cmDspSysInstallCb(h, msrc, "d0", sfp, "d0", NULL );
cmDspSysInstallCb(h, msrc, "d0", nmp, "d0", NULL ); cmDspSysInstallCb(h, msrc, "d0", nmp, "d0", NULL );
cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL );
//cmDspSysInstallCb(h, nmp, "d0", pic, "d0", NULL );
//cmDspSysInstallCb(h, pic, "d0", mo2p, "d0", NULL );
cmDspSysInstallCb(h, msrc, "status", sfp, "status",NULL ); cmDspSysInstallCb(h, msrc, "status", sfp, "status",NULL );
cmDspSysInstallCb(h, msrc, "status", nmp, "status",NULL ); cmDspSysInstallCb(h, msrc, "status", nmp, "status",NULL );
cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL );
//cmDspSysInstallCb(h, nmp, "status", pic, "status",NULL );
//cmDspSysInstallCb(h, pic, "status", mo2p, "status", NULL );
// score follower to recd_play,modulator and printers // score follower to recd_play,modulator and printers
cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL ); cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL );
cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index
//cmDspSysInstallCb(h, igain0, "val", ai0, "gain", NULL ); // input gain control cmDspSysInstallCb( h, emeas, "val", its, "off-int", NULL);
//cmDspSysInstallCb(h, igain1, "val", ai1, "gain", NULL ); cmDspSysInstallCb( h, sfp, "out", its, "in", NULL);
cmDspSysInstallCb( h, its, "out", offb, "in", NULL);
cmDspSysInstallCb( h, its, "out", prp, "in", NULL);
cmDspSysInstallCb(h, modp, "dgain0", ogain0, "val", NULL ); cmDspSysInstallCb(h, modp, "dgain0", ogain0, "val", NULL );
cmDspSysInstallCb(h, modp, "dgain1", ogain1, "val", NULL ); cmDspSysInstallCb(h, modp, "dgain1", ogain1, "val", NULL );
cmDspSysInstallCb(h, modp, "wgain0", ogain2, "val", NULL ); cmDspSysInstallCb(h, modp, "wgain0", ogain2, "val", NULL );
cmDspSysInstallCb(h, modp, "wgain1", ogain3, "val", NULL ); cmDspSysInstallCb(h, modp, "wgain1", ogain3, "val", NULL );
cmDspSysInstallCb(h, ogain0, "val", ao0, "gain", NULL ); // output gain control - dry 0
cmDspSysInstallCb(h, ogain1, "val", ao1, "gain", NULL ); // dry 1 cmDspSysInstallCb(h, ogain0, "val", gmult0, "in-0", NULL );
cmDspSysInstallCb(h, ogain2, "val", ao2, "gain", NULL ); // wet 0 cmDspSysInstallCb(h, ogainD, "val", gmult0, "in-1", NULL );
cmDspSysInstallCb(h, ogain3, "val", ao3, "gain", NULL ); // wet 1
cmDspSysInstallCb(h, ogain1, "val", gmult1, "in-0", NULL );
cmDspSysInstallCb(h, ogainD, "val", gmult1, "in-1", NULL );
cmDspSysInstallCb(h, ogain2, "val", gmult2, "in-0", NULL );
cmDspSysInstallCb(h, ogainW, "val", gmult2, "in-1", NULL );
cmDspSysInstallCb(h, ogain3, "val", gmult3, "in-0", NULL );
cmDspSysInstallCb(h, ogainW, "val", gmult3, "in-1", NULL );
cmDspSysInstallCb(h, gmult0, "out", lmix, "gain-0", NULL ); // output gain control - dry 0
cmDspSysInstallCb(h, gmult1, "out", rmix, "gain-0", NULL ); // dry 1
cmDspSysInstallCb(h, gmult2, "out", lmix, "gain-1", NULL ); // wet 0
cmDspSysInstallCb(h, gmult3, "out", rmix, "gain-1", NULL ); // wet 1
return rc; return rc;

View File

@ -109,8 +109,7 @@ extern "C" {
cmDspRC_t cmDspSysInsertHorzBorder( cmDspSysH_t h ); cmDspRC_t cmDspSysInsertHorzBorder( cmDspSysH_t h );
cmDspRC_t cmDspSysNewPage( cmDspSysH_t h, const cmChar_t* title ); cmDspRC_t cmDspSysNewPage( cmDspSysH_t h, const cmChar_t* title );
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
// Connection Functions. // Connection Functions.
// //
@ -278,6 +277,18 @@ extern "C" {
//) //)
typedef cmDspInst_t inst_t;
#define inst( classLabel, instLabel, ... ) cmDspSysAllocInst( h, classLabel, instLabel, PP_NARG(__VA_ARGS__), __VA_ARGS__ )
#define button( label, real_val ) cmDspSysAllocButton( h, label, real_val )
#define scalar( label, rmin, rmax, rstep, rval ) cmDspSysAllocScalar( h, label, rmin, rmax, rstep, rval )
#define audio( src, sarg, dst, darg ) cmDspSysConnectAudio( h, src, #sarg, dst, #darg )
#define event( src, sarg, dst, darg ) cmDspSysInstallCb( h, src, #sarg, dst, #darg, NULL )
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif