diff --git a/app/cmScore.c b/app/cmScore.c index 40be491..8733fff 100644 --- a/app/cmScore.c +++ b/app/cmScore.c @@ -613,29 +613,31 @@ cmScRC_t _cmScParseMarkers( cmSc_t* p, unsigned scoreIdx, const cmChar_t* text, if( cmSymTblIsValid(p->stH) == false ) return kOkScRC; - // go to command/id space - if((ip = cmTextNextWhiteOrEosC(text)) == NULL ) - goto errLabel; - - // goto label - if((ip = cmTextNextNonWhiteC(ip)) == NULL ) - goto errLabel; - - // goto end of label - if((ep = cmTextNextWhiteOrEosC(ip)) == NULL ) - goto errLabel; - else + for(;(cp = cmTextNextNonWhiteC(cp)) != NULL; cp=ep ) { - unsigned n = (ep-ip)+1; - cmChar_t markTextStr[n+1]; - strncpy(markTextStr,ip,n); + // go to command/id space + if((ip = cmTextNextWhiteOrEosC(cp)) == NULL ) + goto errLabel; - // for each command code - // (there may be more than one character) - for(; *cp && !isspace(*cp); ++cp) + // goto label + if((ip = cmTextNextNonWhiteC(ip)) == NULL ) + goto errLabel; + + // goto end of label + if((ep = cmTextNextWhiteOrEosC(ip)) == NULL ) + goto errLabel; + else { - cmMarkScMId_t cmdId = kInvalidScMId; + unsigned n = (ep-ip)+1; + cmChar_t markTextStr[n+1]; + strncpy(markTextStr,ip,n); + markTextStr[n] = 0; + // remove any trailing white space + cmTextTrimEnd(markTextStr); + + cmMarkScMId_t cmdId = kInvalidScMId; + switch( *cp ) { case 'c': cmdId = kRecdBegScMId; break; @@ -653,6 +655,8 @@ cmScRC_t _cmScParseMarkers( cmSc_t* p, unsigned scoreIdx, const cmChar_t* text, mp->scoreIdx = scoreIdx; mp->csvRowIdx = rowIdx; + //printf("%i %c '%s'\n",rowIdx,*cp,markTextStr); + // insert the new mark at the end of the list if( p->markList == NULL ) p->markList = mp; @@ -665,7 +669,9 @@ cmScRC_t _cmScParseMarkers( cmSc_t* p, unsigned scoreIdx, const cmChar_t* text, ep->link = mp; } } + } + return kOkScRC; errLabel: diff --git a/cmProc4.c b/cmProc4.c index a7d0cba..7c1365c 100644 --- a/cmProc4.c +++ b/cmProc4.c @@ -4352,6 +4352,49 @@ cmRC_t cmRecdPlayEndRecord( cmRecdPlay* p, unsigned labelSymId ) return cmCtxRtCondition( &p->obj, cmInvalidArgRC, "The fragment label symbol id '%i' not found for 'end record'.",labelSymId); } +cmRC_t cmRecdPlayInsertRecord(cmRecdPlay* p, unsigned labelSymId, const cmChar_t* wavFn ) +{ + cmRC_t rc = cmOkRC; + unsigned i; + + for(i=0; ifragCnt; ++i) + if( p->frags[i].labelSymId == labelSymId ) + { + cmAudioFileH_t afH = cmNullAudioFileH; + cmAudioFileInfo_t afInfo; + cmRC_t afRC = kOkAfRC; + + // open the audio file + if( cmAudioFileIsValid( afH = cmAudioFileNewOpen(wavFn, &afInfo, &afRC, p->obj.err.rpt )) == false ) + return cmCtxRtCondition( &p->obj, cmInvalidArgRC, "The audio file '%s' could not be opened'.",cmStringNullGuard(wavFn)); + + // ignore blank + if( afInfo.frameCnt == 0 ) + return cmOkRC; + + // allocate buffer space + unsigned j; + for(j=0; jchCnt; ++j) + p->frags[i].chArray[j] = cmMemResize(cmSample_t,p->frags[i].chArray[j],afInfo.frameCnt); + + p->frags[i].allocCnt = afInfo.frameCnt; + + // read samples into the buffer space + unsigned chIdx = 0; + unsigned chCnt = cmMin(p->chCnt,afInfo.chCnt); + unsigned actFrmCnt = 0; + if( cmAudioFileReadSample(afH,afInfo.frameCnt,chIdx,chCnt,p->frags[i].chArray, &actFrmCnt) != kOkAfRC ) + return cmCtxRtCondition(&p->obj, cmSubSysFailRC, "Read failed on the audio file '%s'.",cmStringNullGuard(wavFn)); + + p->frags[i].recdIdx = actFrmCnt; + + return rc; + } + + return cmCtxRtCondition( &p->obj, cmInvalidArgRC, "The fragment label symbol id '%i' not found for 'begin record'.",labelSymId); +} + + cmRC_t cmRecdPlayBeginPlay( cmRecdPlay* p, unsigned labelSymId ) { unsigned i; diff --git a/cmProc4.h b/cmProc4.h index eaabff7..82cc243 100644 --- a/cmProc4.h +++ b/cmProc4.h @@ -688,6 +688,8 @@ extern "C" { cmRC_t cmRecdPlayBeginRecord( cmRecdPlay* p, unsigned labelSymId ); cmRC_t cmRecdPlayEndRecord( cmRecdPlay* p, unsigned labelSymId ); + cmRC_t cmRecdPlayInsertRecord(cmRecdPlay* p, unsigned labelSymId, const cmChar_t* wavFn ); + cmRC_t cmRecdPlayBeginPlay( cmRecdPlay* p, unsigned labelSymId ); cmRC_t cmRecdPlayEndPlay( cmRecdPlay* p, unsigned labelSymId ); diff --git a/cmText.c b/cmText.c index 8d988cb..7af0957 100644 --- a/cmText.c +++ b/cmText.c @@ -539,6 +539,49 @@ void cmTextClip( cmChar_t* s, unsigned n ) } +cmChar_t* cmTextTrimBegin( cmChar_t* s ) +{ + if( s==NULL || strlen(s) == 0 ) + return s; + + cmChar_t* s0 = cmTextNextNonWhite(s); + + // no non-white char's exist + if( s0 == NULL ) + { + s[0] = 0; + return s; + } + + if( s0 != s ) + cmTextShrinkS(s,s,s0-s); + + return s; +} + +cmChar_t* cmTextTrimEnd( cmChar_t* s ) +{ + unsigned sn; + + if( s==NULL || (sn = strlen(s))==0) + return s; + + cmChar_t* s0 = cmTextLastNonWhiteChar(s); + + if(s0-s+1 < sn ) + s[s0-s+1] = 0; + + + return s; +} + +cmChar_t* cmTextTrim( cmChar_t* s) +{ + cmTextTrimBegin(s); + cmTextTrimEnd(s); + return s; +} + cmChar_t* cmTextExpandS( cmChar_t* s, const cmChar_t* t, unsigned tn ) { return cmVOC_Expand(s,strlen(s)+1,t,tn); } diff --git a/cmText.h b/cmText.h index 5576a76..8742abe 100644 --- a/cmText.h +++ b/cmText.h @@ -166,6 +166,11 @@ extern "C" { // Remove the last n characters from s by inserting a '\0' at s[ strlen(s)-n ]. void cmTextClip( cmChar_t* s, unsigned n ); + // Trim white space from the begining/end/both of a string + cmChar_t* cmTextTrimBegin( cmChar_t* s ); + cmChar_t* cmTextTrimEnd( cmChar_t* s ); + cmChar_t* cmTextTrim( cmChar_t* ); + // Expand s by copying all bytes past t to t+tn. cmChar_t* cmTextExpandS( cmChar_t* s, const cmChar_t* t, unsigned tn ); diff --git a/dsp/cmDspKr.c b/dsp/cmDspKr.c index 9a14f8f..5512919 100644 --- a/dsp/cmDspKr.c +++ b/dsp/cmDspKr.c @@ -27,7 +27,6 @@ #include "cmDspSys.h" #include "cmMath.h" - #include "cmAudioFile.h" #include "cmFileSys.h" #include "cmProcObj.h" @@ -2371,6 +2370,7 @@ cmDspClass_t _cmNanoMapDC; typedef struct { cmDspInst_t inst; + } cmDspNanoMap_t; cmDspRC_t _cmDspNanoMapSend( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned st, unsigned d0, unsigned d1 ) @@ -2383,6 +2383,8 @@ cmDspRC_t _cmDspNanoMapSend( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned st, un void _cmDspNanoMapPgm( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned pgm ) { + cmDspNanoMap_t* p = (cmDspNanoMap_t*)inst; + unsigned i; for(i=0; idstVarId ) { @@ -2439,7 +2441,7 @@ cmDspRC_t _cmDspNanoMapRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t case kStatusNmId: { - unsigned status = cmDsvGetUInt(evt->valuePtr); + unsigned status = cmDsvGetUInt(evt->valuePtr); if( (status & 0xf0) == kNoteOnMdId ) { unsigned d0 = cmDspUInt(inst,kD0NmId); @@ -2447,6 +2449,7 @@ cmDspRC_t _cmDspNanoMapRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t status = (status & 0xf0) + ch; cmDspSetUInt(ctx,inst,kStatusNmId,status); } + } break; @@ -2485,6 +2488,7 @@ enum kMaxLaSecsPrId, kCurLaSecsPrId, kFadeRatePrId, + kScInitLocIdxPrId, kScLocIdxPrId, kCmdPrId, kInAudioBasePrId @@ -2501,9 +2505,83 @@ typedef struct unsigned offSymId; unsigned audioOutBaseId; unsigned chCnt; - unsigned scLocIdx; + //unsigned scLocIdx; } cmDspRecdPlay_t; +cmDspRC_t _cmDspRecdPlayParseRsrc( cmDspCtx_t* ctx, cmDspInst_t* inst, cmRecdPlay* rcdply ) +{ + cmDspRC_t rc = kOkDspRC; + const cmChar_t* path = NULL; + + // read the 'recdplay' audio file path + if( cmDspRsrcString( ctx->dspH, &path, "recdPlayPath", NULL ) != kOkDspRC ) + { + cmDspInstErr(ctx,inst,kRsrcNotFoundDspRC,"The 'recdPlayPath' resource string was not found."); + } + + if( path == NULL ) + path = ""; + + cmJsonH_t jsH = cmDspSysPgmRsrcHandle(ctx->dspH); + cmJsonNode_t* jnp = cmJsonFindValue(jsH,"recdPlay",NULL, kArrayTId); + + if( jnp == NULL || cmJsonIsArray(jnp)==false ) + { + // this is really a warning - the object does not require preloaded segments. + cmDspInstErr(ctx,inst,kRsrcNotFoundDspRC,"The 'recdPlay' resource used to define pre-loaded segments was not found."); + return kOkDspRC; + } + + unsigned n = cmJsonChildCount(jnp); + unsigned i; + + // for each 'recdplay' segment record + for(i=0; istH,label)) == cmInvalidId ) + { + rc = cmDspInstErr(ctx,inst,kSymNotFoundDspRC,"The 'recdPlay' pre-load segment symbol '%s' could not be found or registered.",cmStringNullGuard(label)); + goto errLabel; + } + + // create the full path name for the segment audio file + if((fn = cmFsMakeFn( path, fn, NULL, NULL )) == NULL ) + { + rc = cmDspInstErr(ctx,inst,kFileSysFailDspRC,"The 'recdPlay' file name '%s/%s' could not be generated.",cmStringNullGuard(path),cmStringNullGuard(fn)); + goto errLabel; + } + + + // pre-load the segment + if( cmRecdPlayInsertRecord(rcdply,segSymId,fn) != cmOkRC ) + rc = cmDspInstErr(ctx,inst,kSubSysFailDspRC,"The 'recdPlay' segment label:'%s' file:'%s' could not be loaded.",cmStringNullGuard(label),cmStringNullGuard(fn)); + + + cmFsFreeFn(fn); + + } + + errLabel: + return rc; +} + cmDspRC_t _cmDspRecdPlayOpenScore( cmDspCtx_t* ctx, cmDspInst_t* inst ) { cmDspRC_t rc =kOkDspRC; @@ -2511,14 +2589,14 @@ cmDspRC_t _cmDspRecdPlayOpenScore( cmDspCtx_t* ctx, cmDspInst_t* inst ) cmDspRecdPlay_t* p = (cmDspRecdPlay_t*)inst; - p->scLocIdx = 0; + //p->scLocIdx = 0; if((fn = cmDspStrcz(inst,kFnPrId)) == NULL || strlen(fn)==0 ) - return cmErrMsg(&inst->classPtr->err, kInvalidArgDspRC, "No score file name supplied."); + return cmDspInstErr(ctx,inst, kInvalidArgDspRC, "No score file name supplied."); if( cmScoreInitialize(ctx->cmCtx, &p->scH, fn, cmDspSampleRate(ctx), NULL, 0, NULL, NULL, ctx->stH ) != kOkScRC ) - return cmErrMsg(&inst->classPtr->err, kSubSysFailDspRC, "Unable to open the score '%s'.",fn); + return cmDspInstErr(ctx,inst, kSubSysFailDspRC, "Unable to open the score '%s'.",fn); if( cmScoreIsValid(p->scH) ) { @@ -2537,6 +2615,11 @@ cmDspRC_t _cmDspRecdPlayOpenScore( cmDspCtx_t* ctx, cmDspInst_t* inst ) for(i=0; ircdply,i, cmScoreMarkerLabelSymbolId(p->scH,i )); + if((rc = _cmDspRecdPlayParseRsrc(ctx,inst,p->rcdply)) != kOkDspRC ) + rc = cmDspInstErr(ctx,inst,kInstResetFailDspRC,"The 'recdplay' segment pre-load failed."); + + //p->scLocIdx = cmDspUInt(inst,kScInitLocIdxPrId); + } return rc; @@ -2565,6 +2648,7 @@ cmDspInst_t* _cmDspRecdPlayAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig 1, "maxla", kMaxLaSecsPrId, 0,0, kInDsvFl | kDoubleDsvFl | kReqArgDsvFl, "Maximum look-ahead buffer in seconds.", 1, "curla", kCurLaSecsPrId, 0,0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Current look-head buffer in seconds.", 1, "frate", kFadeRatePrId, 0,0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Fade rate in dB per second.", + 1, "initIdx",kScInitLocIdxPrId,0,0,kInDsvFl | kUIntDsvFl, "Score search start location.", 1, "index", kScLocIdxPrId, 0,0, kInDsvFl | kUIntDsvFl, "Score follower location index.", 1, "cmd", kCmdPrId, 0,0, kInDsvFl | kSymDsvFl, "on=reset off=stop.", chCnt, "in", kInAudioBasePrId,0,1, kInDsvFl | kAudioBufDsvFl, "Audio input", @@ -2577,7 +2661,7 @@ cmDspInst_t* _cmDspRecdPlayAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig p->offSymId = cmSymTblId(ctx->stH,"off"); p->audioOutBaseId = audioOutBase; p->chCnt = chCnt; - p->scLocIdx = 0; + //p->scLocIdx = 0; printf("0 max la secs:%f\n",cmDspDouble(&p->inst,kMaxLaSecsPrId)); @@ -2585,9 +2669,12 @@ cmDspInst_t* _cmDspRecdPlayAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig cmDspSetDefaultDouble(ctx,&p->inst, kMaxLaSecsPrId,0.0, 2.0); cmDspSetDefaultDouble(ctx,&p->inst, kCurLaSecsPrId,0.0, 0.1); cmDspSetDefaultDouble(ctx,&p->inst, kFadeRatePrId, 0.0, 1.0); + cmDspSetDefaultUInt( ctx,&p->inst, kScInitLocIdxPrId,0,0); printf("1 max la secs:%f\n",cmDspDouble(&p->inst,kMaxLaSecsPrId)); + + return &p->inst; } @@ -2670,7 +2757,7 @@ cmDspRC_t _cmDspRecdPlayRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_ { printf("rewind\n"); cmRecdPlayRewind(p->rcdply); - p->scLocIdx = 0; + //p->scLocIdx = cmDspUInt(inst,kScInitLocIdxPrId); } else if( cmDspSymbol(inst,kCmdPrId) == p->offSymId ) @@ -2683,49 +2770,57 @@ cmDspRC_t _cmDspRecdPlayRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_ cmRecdPlaySetLaSecs(p->rcdply, cmDspDouble(inst,kCurLaSecsPrId)); break; + case kScInitLocIdxPrId: + printf("init-idx:%i\n",cmDspUInt(inst,kScInitLocIdxPrId)); + break; + case kScLocIdxPrId: { - unsigned endScLocIdx = cmDspUInt(inst,kScLocIdxPrId) ; + unsigned endScLocIdx = cmDspUInt(inst,kScLocIdxPrId); - for(; p->scLocIdx<=endScLocIdx; p->scLocIdx+=1) - { - cmScoreLoc_t* loc = cmScoreLoc(p->scH, p->scLocIdx ); - cmScoreMarker_t* mp = loc->markList; + if( endScLocIdx < cmDspUInt(inst,kScInitLocIdxPrId) ) + break; - for(; mp!=NULL; mp=mp->link) - switch( mp->markTypeId ) - { - case kRecdBegScMId: - printf("recd-beg\n"); - cmRecdPlayBeginRecord(p->rcdply, mp->labelSymId ); - break; + cmScoreLoc_t* loc = cmScoreLoc(p->scH, endScLocIdx ); + if( loc == NULL ) + break; + + cmScoreMarker_t* mp = loc->markList; + + for(; mp!=NULL; mp=mp->link) + switch( mp->markTypeId ) + { + case kRecdBegScMId: + printf("recd-beg %s\n",cmSymTblLabel(ctx->stH,mp->labelSymId)); + cmRecdPlayBeginRecord(p->rcdply, mp->labelSymId ); + break; - case kRecdEndScMId: - printf("recd-end\n"); - cmRecdPlayEndRecord(p->rcdply, mp->labelSymId ); - break; + case kRecdEndScMId: + printf("recd-end %s\n",cmSymTblLabel(ctx->stH,mp->labelSymId)); + cmRecdPlayEndRecord(p->rcdply, mp->labelSymId ); + break; - case kPlayBegScMId: - printf("play-beg\n"); - cmRecdPlayBeginPlay(p->rcdply, mp->labelSymId ); - break; + case kPlayBegScMId: + printf("play-beg\n"); + cmRecdPlayBeginPlay(p->rcdply, mp->labelSymId ); + break; - case kPlayEndScMId: - printf("play-end\n"); - cmRecdPlayEndPlay(p->rcdply, mp->labelSymId ); - break; + case kPlayEndScMId: + printf("play-end\n"); + cmRecdPlayEndPlay(p->rcdply, mp->labelSymId ); + break; - case kFadeScMId: - printf("fade-beg\n"); - cmRecdPlayBeginFade(p->rcdply, mp->labelSymId, cmDspDouble(inst,kFadeRatePrId) ); - break; + case kFadeScMId: + printf("fade-beg\n"); + cmRecdPlayBeginFade(p->rcdply, mp->labelSymId, cmDspDouble(inst,kFadeRatePrId) ); + break; - default: - break; - } - } + default: + break; + } + - p->scLocIdx = endScLocIdx+1; + //p->scLocIdx = endScLocIdx+1; } break; } diff --git a/dsp/cmDspPgmKr.c b/dsp/cmDspPgmKr.c index b8d3e14..b76f5de 100644 --- a/dsp/cmDspPgmKr.c +++ b/dsp/cmDspPgmKr.c @@ -61,8 +61,6 @@ cmDspRC_t krLoadRsrc(cmDspSysH_t h, cmErr_t* err, krRsrc_t* r) cmDspRsrcString(h,&r->midiDevice, "midiDevice", NULL); cmDspRsrcString(h,&r->midiOutPort, "midiOutPort", NULL); - - if((rc = cmDspSysLastRC(h)) != kOkDspRC ) cmErrMsg(err,rc,"A KR DSP resource load failed."); @@ -363,7 +361,8 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmCtx_t* cmCtx = cmDspSysPgmCtx(h); cmErr_t err; krRsrc_t r; - bool fragFl = false; + bool fragFl = true; + bool useWtFl = false; unsigned wtLoopCnt = 1; // 1=play once (-1=loop forever) unsigned wtInitMode = 0; // initial wt mode is 'silence' unsigned wtSmpCnt = floor(cmDspSysSampleRate(h)); // wt length == srate @@ -398,7 +397,7 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* mop = cmDspSysAllocInst(h,"MidiOut", NULL, 2, r.midiDevice,r.midiOutPort); cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 1, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl ); cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 ); - cmDspInst_t* rpp = cmDspSysAllocInst(h,"RecdPlay", NULL, 6, 2, r.scFn, recdPlayInitAllocSecs, recdPlayMaxLaSecs, recdPlayCurLaSecs, recdPlayFadeRateDbPerSec ); + cmDspInst_t* rpp = cmDspSysAllocInst(h,"RecdPlay", NULL, 6, 2, r.scFn, recdPlayInitAllocSecs, recdPlayMaxLaSecs, recdPlayCurLaSecs, recdPlayFadeRateDbPerSec); cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" ); cmDspInst_t* modr = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" ); @@ -498,21 +497,22 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) // Audio connections cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phs -> wt - cmDspSysConnectAudio(h, wtp, "out", au0Sw, "a-in-0" ); // wt -> sw - - /* - cmDspSysConnectAudio(h, ai0p, "out", au0Sw, "a-in-1" ); // ain -> sw - cmDspSysConnectAudio(h, ai0p, "out", mi0p, "in" ); - cmDspSysConnectAudio(h, au0Sw, "a-out", rpp, "in-0"); // sw -> rcdply - cmDspSysConnectAudio(h, au0Sw, "a-out", c0.kr0,"in" ); // sw -> kr - cmDspSysConnectAudio(h, au0Sw, "a-out", c0.kr1,"in" ); // sw -> kr - */ - - - cmDspSysConnectAudio(h, ai0p, "out", rpp, "in-0"); // sw -> rcdply - cmDspSysConnectAudio(h, ai0p, "out", c0.kr0, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai0p, "out", c0.kr1, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai0p, "out", mi0p, "in" ); + if( useWtFl ) + { + cmDspSysConnectAudio(h, wtp, "out", au0Sw, "a-in-0" ); // wt -> sw + cmDspSysConnectAudio(h, ai0p, "out", au0Sw, "a-in-1" ); // ain -> sw + cmDspSysConnectAudio(h, ai0p, "out", mi0p, "in" ); + cmDspSysConnectAudio(h, au0Sw, "a-out", rpp, "in-0"); // sw -> rcdply + cmDspSysConnectAudio(h, au0Sw, "a-out", c0.kr0,"in" ); // sw -> kr + cmDspSysConnectAudio(h, au0Sw, "a-out", c0.kr1,"in" ); // sw -> kr + } + else + { + cmDspSysConnectAudio(h, ai0p, "out", rpp, "in-0"); // sw -> rcdply + cmDspSysConnectAudio(h, ai0p, "out", c0.kr0, "in" ); // ain -> sw + cmDspSysConnectAudio(h, ai0p, "out", c0.kr1, "in" ); // ain -> sw + cmDspSysConnectAudio(h, ai0p, "out", mi0p, "in" ); + } if( fragFl ) { @@ -525,22 +525,26 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) else { cmDspSysConnectAudio(h, c0.cmp, "out", ao0p, "in" ); + //cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); } - cmDspSysConnectAudio(h, wtp, "out", au1Sw, "a-in-0" ); // wt -> sw - /* - cmDspSysConnectAudio(h, ai1p, "out", au1Sw, "a-in-1" ); // ain -> sw - cmDspSysConnectAudio(h, ai1p, "out", mi1p, "in" ); - cmDspSysConnectAudio(h, au1Sw, "a-out", rpp, "in-1"); // sw -> rcdply - cmDspSysConnectAudio(h, au1Sw, "a-out", c1.kr0,"in" ); // sw -> kr - cmDspSysConnectAudio(h, au1Sw, "a-out", c1.kr1,"in" ); // sw -> kr - */ - - cmDspSysConnectAudio(h, ai1p, "out", rpp, "in-1"); // sw -> rcdply - cmDspSysConnectAudio(h, ai1p, "out", c1.kr0, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai1p, "out", c1.kr1, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai1p, "out", mi1p, "in" ); + if( useWtFl ) + { + cmDspSysConnectAudio(h, wtp, "out", au1Sw, "a-in-0" ); // wt -> sw + cmDspSysConnectAudio(h, ai1p, "out", au1Sw, "a-in-1" ); // ain -> sw + cmDspSysConnectAudio(h, ai1p, "out", mi1p, "in" ); + cmDspSysConnectAudio(h, au1Sw, "a-out", rpp, "in-1"); // sw -> rcdply + cmDspSysConnectAudio(h, au1Sw, "a-out", c1.kr0,"in" ); // sw -> kr + cmDspSysConnectAudio(h, au1Sw, "a-out", c1.kr1,"in" ); // sw -> kr + } + else + { + cmDspSysConnectAudio(h, ai1p, "out", rpp, "in-1"); // sw -> rcdply + cmDspSysConnectAudio(h, ai1p, "out", c1.kr0, "in" ); // ain -> sw + cmDspSysConnectAudio(h, ai1p, "out", c1.kr1, "in" ); // ain -> sw + cmDspSysConnectAudio(h, ai1p, "out", mi1p, "in" ); + } if( fragFl ) { @@ -553,6 +557,8 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) else { cmDspSysConnectAudio(h, c1.cmp, "out", ao1p, "in" ); // cmp -> mix 0 + //cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" ); + } cmDspSysConnectAudio(h, c0.cmp, "out", afop, "in0" ); // comp -> audio_file_out @@ -689,7 +695,8 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL ); cmDspSysInstallCb(h, scp, "sel", modp,"reset", NULL ); cmDspSysInstallCb(h, scp, "sel", modr,"reset", NULL ); - + cmDspSysInstallCb(h, scp, "sel", rpp, "initIdx", NULL ); + cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL ); //cmDspSysInstallCb(h, reload,"out", modp, "reload", NULL ); diff --git a/osx/cmAudioPortOsx.c b/osx/cmAudioPortOsx.c index 9d428c9..063dff5 100644 --- a/osx/cmAudioPortOsx.c +++ b/osx/cmAudioPortOsx.c @@ -6,6 +6,7 @@ #include "cmPrefix.h" #include "cmGlobal.h" #include "cmRpt.h" +#include "cmTime.h" #include "cmAudioPort.h" #include "cmMem.h" #include "cmMallocDebug.h" diff --git a/osx/cmMidiOsx.c b/osx/cmMidiOsx.c index 6d193a0..cced912 100644 --- a/osx/cmMidiOsx.c +++ b/osx/cmMidiOsx.c @@ -10,6 +10,7 @@ #include "cmCtx.h" #include "cmMem.h" #include "cmMallocDebug.h" +#include "cmTime.h" #include "cmMidi.h" #include "cmMidiPort.h" @@ -507,7 +508,7 @@ void _cmMpMIDISystemReadProc( const MIDIPacketList *pktListPtr, void* readProcRe double nano = 1e-9 * ( (double) _cmMpRoot.timeBaseInfo.numer) / ((double) _cmMpRoot.timeBaseInfo.denom); - // so here's the delta in nanoseconds: + // so here's the timestamp in nanoseconds: double nanoSeconds = ((double) packetPtr->timeStamp) * nano; // 1000 times that for microSeconds: @@ -516,13 +517,17 @@ void _cmMpMIDISystemReadProc( const MIDIPacketList *pktListPtr, void* readProcRe // BUG BUG BUG: How can multiplying the nanoseconds produce microseconds? // Shouldn't the nano to micro conversion be a divide? - double deltaMicroSecs = microSecs - pp->prevMicroSecs; + //double deltaMicroSecs = microSecs - pp->prevMicroSecs; pp->prevMicroSecs = microSecs; + cmTimeSpec_t ts; + ts.tv_sec = floor(microSecs / 1000000.0); + ts.tv_nsec = (microSecs - ts.tv_sec * 1000000.0) * 1000.0; + assert( pp->inputFl == true ); - cmMpParseMidiData( pp->parserH, (unsigned)deltaMicroSecs, packetPtr->data, packetPtr->length ); + cmMpParseMidiData( pp->parserH, &ts, packetPtr->data, packetPtr->length ); packetPtr = MIDIPacketNext(packetPtr); }