--- linuxsampler/trunk/src/engines/gig/InstrumentScriptVMFunctions.cpp 2014/06/09 19:20:37 2611 +++ linuxsampler/trunk/src/engines/gig/InstrumentScriptVMFunctions.cpp 2014/06/13 15:01:06 2630 @@ -22,54 +22,93 @@ { } + bool InstrumentScriptVMFunction_gig_set_dim_zone::acceptsArgType(int iArg, ExprType_t type) const { + return type == INT_EXPR || type == INT_ARR_EXPR; + } + VMFnResult* InstrumentScriptVMFunction_gig_set_dim_zone::exec(VMFnArgs* args) { - int id = args->arg(0)->asInt()->evalInt(); + EngineChannel* pEngineChannel = + static_cast(m_vm->m_event->cause.pEngineChannel); + int dim = args->arg(1)->asInt()->evalInt(); int zone = args->arg(2)->asInt()->evalInt(); - if (id < 0) { - wrnMsg("gig_set_dim_zone(): argument 1 may not be a negative event ID"); - return successResult(); - } - - EngineChannel* pEngineChannel = - static_cast(m_vm->m_event->cause.pEngineChannel); + if (args->arg(0)->exprType() == INT_EXPR) { + int id = args->arg(0)->asInt()->evalInt(); + if (id < 0) { + wrnMsg("gig_set_dim_zone(): argument 1 may not be a negative event ID"); + return successResult(); + } - RTList::Iterator itEvent = pEngineChannel->pEngine->EventByID(id); - if (!itEvent) { - dmsg(2,("gig_set_dim_zone(): no active event with ID %d\n", id)); - return successResult(); - } + RTList::Iterator itEvent = pEngineChannel->pEngine->EventByID(id); + if (!itEvent) { + dmsg(2,("gig_set_dim_zone(): no active event with ID %d\n", id)); + return successResult(); + } - int note = itEvent->Param.Note.Key; + int note = itEvent->Param.Note.Key; - ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note); - if (!pRegion) { - dmsg(2,("gig_set_dim_zone(): no region for key %d\n", note)); - return successResult(); - } + ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note); + if (!pRegion) { + dmsg(2,("gig_set_dim_zone(): no region for key %d\n", note)); + return successResult(); + } - int idx = -1, baseBits = 0; - for (int i = 0; i < pRegion->Dimensions; ++i) { - if (pRegion->pDimensionDefinitions[i].dimension == dim) { - idx = i; - break; + int idx = -1, baseBits = 0; + for (int i = 0; i < pRegion->Dimensions; ++i) { + if (pRegion->pDimensionDefinitions[i].dimension == dim) { + idx = i; + break; + } + baseBits += pRegion->pDimensionDefinitions[i].bits; + } + if (idx < 0) { + dmsg(2,("gig_set_dim_zone(): no such gig dimension %d\n", dim)); + return successResult(); // no such dimension found } - baseBits += pRegion->pDimensionDefinitions[i].bits; - } - if (idx < 0) { - dmsg(2,("gig_set_dim_zone(): no such gig dimension %d\n", dim)); - return successResult(); // no such dimension found - } - int bits = pRegion->pDimensionDefinitions[idx].bits; - int mask = 0; - for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i)); + int bits = pRegion->pDimensionDefinitions[idx].bits; + int mask = 0; + for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i)); + + itEvent->Format.Gig.DimMask |= mask; + itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask; + + dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits)); + } else if (args->arg(0)->exprType() == INT_ARR_EXPR) { + VMIntArrayExpr* ids = args->arg(0)->asIntArray(); + for (int i = 0; i < ids->arraySize(); ++i) { + int id = ids->evalIntElement(i); + if (id < 0) continue; + + RTList::Iterator itEvent = pEngineChannel->pEngine->EventByID(id); + if (!itEvent) continue; + + int note = itEvent->Param.Note.Key; + + ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note); + if (!pRegion) continue; + + int idx = -1, baseBits = 0; + for (int i = 0; i < pRegion->Dimensions; ++i) { + if (pRegion->pDimensionDefinitions[i].dimension == dim) { + idx = i; + break; + } + baseBits += pRegion->pDimensionDefinitions[i].bits; + } + if (idx < 0) continue; + + int bits = pRegion->pDimensionDefinitions[idx].bits; + int mask = 0; + for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i)); - itEvent->Format.Gig.DimMask |= mask; - itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask; + itEvent->Format.Gig.DimMask |= mask; + itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask; - dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits)); + dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits)); + } + } return successResult(); }