/[svn]/linuxsampler/trunk/src/engines/common/InstrumentScriptVMFunctions.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/InstrumentScriptVMFunctions.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3218 by schoenebeck, Thu May 25 16:32:17 2017 UTC revision 3255 by schoenebeck, Tue May 30 15:43:39 2017 UTC
# Line 23  namespace LinuxSampler { Line 23  namespace LinuxSampler {
23      VMFnResult* InstrumentScriptVMFunction_play_note::exec(VMFnArgs* args) {      VMFnResult* InstrumentScriptVMFunction_play_note::exec(VMFnArgs* args) {
24          int note = args->arg(0)->asInt()->evalInt();          int note = args->arg(0)->asInt()->evalInt();
25          int velocity = (args->argsCount() >= 2) ? args->arg(1)->asInt()->evalInt() : 127;          int velocity = (args->argsCount() >= 2) ? args->arg(1)->asInt()->evalInt() : 127;
         int sampleoffset = (args->argsCount() >= 3) ? args->arg(2)->asInt()->evalInt() : 0;  
26          int duration = (args->argsCount() >= 4) ? args->arg(3)->asInt()->evalInt() : 0; //TODO: -1 might be a better default value instead of 0          int duration = (args->argsCount() >= 4) ? args->arg(3)->asInt()->evalInt() : 0; //TODO: -1 might be a better default value instead of 0
27    
28          if (note < 0 || note > 127) {          if (note < 0 || note > 127) {
# Line 36  namespace LinuxSampler { Line 35  namespace LinuxSampler {
35              return errorResult(0);              return errorResult(0);
36          }          }
37    
38          if (sampleoffset < 0) {          if (duration < -2) {
39              errMsg("play_note(): argument 3 may not be a negative sample offset");              errMsg("play_note(): argument 4 must be a duration value of at least -2 or higher");
             return errorResult(0);  
         } else if (sampleoffset != 0) {  
             wrnMsg("play_note(): argument 3 does not support a sample offset other than 0 yet");  
         }  
   
         if (duration < -1) {  
             errMsg("play_note(): argument 4 must be a duration value of at least -1 or higher");  
40              return errorResult(0);              return errorResult(0);
41          }          }
42    
# Line 63  namespace LinuxSampler { Line 55  namespace LinuxSampler {
55                  return errorResult(0);                  return errorResult(0);
56              }              }
57              e.Param.Note.ParentNoteID = m_vm->m_event->cause.Param.Note.ID;              e.Param.Note.ParentNoteID = m_vm->m_event->cause.Param.Note.ID;
58                // check if that requested parent note is actually still alive
59                NoteBase* pParentNote =
60                    pEngineChannel->pEngine->NoteByID( e.Param.Note.ParentNoteID );
61                // if parent note is already gone then this new note is not required anymore
62                if (!pParentNote)
63                    return successResult(0);
64          }          }
65    
66          const note_id_t id = pEngineChannel->ScheduleNoteMicroSec(&e, 0);          const note_id_t id = pEngineChannel->ScheduleNoteMicroSec(&e, 0);
67    
68            // if a sample offset is supplied, assign the offset as override
69            // to the previously created Note object
70            if (args->argsCount() >= 3) {
71                int sampleoffset = args->arg(2)->asInt()->evalInt();
72                if (sampleoffset >= 0) {
73                    NoteBase* pNote = pEngineChannel->pEngine->NoteByID(id);
74                    if (pNote) {
75                        pNote->Override.SampleOffset = sampleoffset;
76                    }
77                } else if (sampleoffset < -1) {
78                    errMsg("play_note(): sample offset of argument 3 may not be less than -1");
79                }
80            }
81    
82          // if a duration is supplied (and play-note event was scheduled          // if a duration is supplied (and play-note event was scheduled
83          // successfully above), then schedule a subsequent stop-note event          // successfully above), then schedule a subsequent stop-note event
84          if (id && duration > 0) {          if (id && duration > 0) {
# Line 1071  namespace LinuxSampler { Line 1083  namespace LinuxSampler {
1083          return successResult();          return successResult();
1084      }      }
1085    
1086        // template for change_*() functions
1087    
1088      bool VMChangeSynthParamFunction::acceptsArgType(int iArg, ExprType_t type) const {      bool VMChangeSynthParamFunction::acceptsArgType(int iArg, ExprType_t type) const {
1089          if (iArg == 0)          if (iArg == 0)
1090              return type == INT_EXPR || type == INT_ARR_EXPR;              return type == INT_EXPR || type == INT_ARR_EXPR;
# Line 1217  namespace LinuxSampler { Line 1231  namespace LinuxSampler {
1231                      false, NO_LIMIT, 0>( args, "change_tune_time" );                      false, NO_LIMIT, 0>( args, "change_tune_time" );
1232      }      }
1233    
1234        // template for change_*_curve() functions
1235    
1236        bool VMChangeFadeCurveFunction::acceptsArgType(int iArg, ExprType_t type) const {
1237            if (iArg == 0)
1238                return type == INT_EXPR || type == INT_ARR_EXPR;
1239            else
1240                return type == INT_EXPR;
1241        }
1242    
1243        template<fade_curve_t NoteBase::_Override::*T_noteParam, int T_synthParam>
1244        VMFnResult* VMChangeFadeCurveFunction::execTemplate(VMFnArgs* args, const char* functionName) {
1245            int value = args->arg(1)->asInt()->evalInt();
1246            switch (value) {
1247                case FADE_CURVE_LINEAR:
1248                case FADE_CURVE_EASE_IN_EASE_OUT:
1249                    break;
1250                default:
1251                    wrnMsg(String(functionName) + "(): invalid curve type passed as argument 2");
1252                    return successResult();
1253            }
1254    
1255            AbstractEngineChannel* pEngineChannel =
1256                static_cast<AbstractEngineChannel*>(m_vm->m_event->cause.pEngineChannel);
1257    
1258            if (args->arg(0)->exprType() == INT_EXPR) {
1259                const ScriptID id = args->arg(0)->asInt()->evalInt();
1260                if (!id) {
1261                    wrnMsg(String(functionName) + "(): note ID for argument 1 may not be zero");
1262                    return successResult();
1263                }
1264                if (!id.isNoteID()) {
1265                    wrnMsg(String(functionName) + "(): argument 1 is not a note ID");
1266                    return successResult();
1267                }
1268    
1269                NoteBase* pNote = pEngineChannel->pEngine->NoteByID( id.noteID() );
1270                if (!pNote) return successResult();
1271    
1272                // if this change_*_curve() script function was called immediately after
1273                // note was triggered then immediately apply the synth parameter
1274                // change to Note object
1275                if (m_vm->m_event->scheduleTime == pNote->triggerSchedTime) {
1276                    pNote->Override.*T_noteParam = (fade_curve_t) value;
1277                } else { // otherwise schedule this synth parameter change ...
1278                    Event e = m_vm->m_event->cause; // copy to get fragment time for "now"
1279                    e.Init(); // clear IDs
1280                    e.Type = Event::type_note_synth_param;
1281                    e.Param.NoteSynthParam.NoteID   = id.noteID();
1282                    e.Param.NoteSynthParam.Type     = (Event::synth_param_t) T_synthParam;
1283                    e.Param.NoteSynthParam.Delta    = value;
1284                    e.Param.NoteSynthParam.Relative = false;
1285    
1286                    pEngineChannel->ScheduleEventMicroSec(&e, 0);
1287                }
1288            } else if (args->arg(0)->exprType() == INT_ARR_EXPR) {
1289                VMIntArrayExpr* ids = args->arg(0)->asIntArray();
1290                for (int i = 0; i < ids->arraySize(); ++i) {
1291                    const ScriptID id = ids->evalIntElement(i);
1292                    if (!id || !id.isNoteID()) continue;
1293    
1294                    NoteBase* pNote = pEngineChannel->pEngine->NoteByID( id.noteID() );
1295                    if (!pNote) continue;
1296    
1297                    // if this change_*_curve() script function was called immediately after
1298                    // note was triggered then immediately apply the synth parameter
1299                    // change to Note object
1300                    if (m_vm->m_event->scheduleTime == pNote->triggerSchedTime) {
1301                        pNote->Override.*T_noteParam = (fade_curve_t) value;
1302                    } else { // otherwise schedule this synth parameter change ...
1303                        Event e = m_vm->m_event->cause; // copy to get fragment time for "now"
1304                        e.Init(); // clear IDs
1305                        e.Type = Event::type_note_synth_param;
1306                        e.Param.NoteSynthParam.NoteID   = id.noteID();
1307                        e.Param.NoteSynthParam.Type     = (Event::synth_param_t) T_synthParam;
1308                        e.Param.NoteSynthParam.Delta    = value;
1309                        e.Param.NoteSynthParam.Relative = false;
1310    
1311                        pEngineChannel->ScheduleEventMicroSec(&e, 0);
1312                    }
1313                }
1314            }
1315    
1316            return successResult();
1317        }
1318    
1319        // change_vol_curve() function
1320    
1321        VMFnResult* InstrumentScriptVMFunction_change_vol_curve::exec(VMFnArgs* args) {
1322            return VMChangeFadeCurveFunction::execTemplate<
1323                        &NoteBase::_Override::VolumeCurve,
1324                        Event::synth_param_volume_curve>( args, "change_vol_curve" );
1325        }
1326    
1327        // change_tune_curve() function
1328    
1329        VMFnResult* InstrumentScriptVMFunction_change_tune_curve::exec(VMFnArgs* args) {
1330            return VMChangeFadeCurveFunction::execTemplate<
1331                        &NoteBase::_Override::PitchCurve,
1332                        Event::synth_param_pitch_curve>( args, "change_tune_curve" );
1333        }
1334    
1335      // fade_in() function      // fade_in() function
1336    
1337      InstrumentScriptVMFunction_fade_in::InstrumentScriptVMFunction_fade_in(InstrumentScriptVM* parent)      InstrumentScriptVMFunction_fade_in::InstrumentScriptVMFunction_fade_in(InstrumentScriptVM* parent)
# Line 1689  namespace LinuxSampler { Line 1804  namespace LinuxSampler {
1804    
1805          return successResult();          return successResult();
1806      }      }
1807    
1808        // change_play_pos() function
1809    
1810        InstrumentScriptVMFunction_change_play_pos::InstrumentScriptVMFunction_change_play_pos(InstrumentScriptVM* parent)
1811        : m_vm(parent)
1812        {
1813        }
1814    
1815        VMFnResult* InstrumentScriptVMFunction_change_play_pos::exec(VMFnArgs* args) {
1816            const ScriptID id = args->arg(0)->asInt()->evalInt();
1817            if (!id) {
1818                wrnMsg("change_play_pos(): note ID for argument 1 may not be zero");
1819                return successResult();
1820            }
1821            if (!id.isNoteID()) {
1822                wrnMsg("change_play_pos(): argument 1 is not a note ID");
1823                return successResult();
1824            }
1825    
1826            const int pos = args->arg(1)->asInt()->evalInt();
1827            if (pos < 0) {
1828                wrnMsg("change_play_pos(): playback position of argument 2 may not be negative");
1829                return successResult();
1830            }
1831    
1832            AbstractEngineChannel* pEngineChannel =
1833                static_cast<AbstractEngineChannel*>(m_vm->m_event->cause.pEngineChannel);
1834    
1835            NoteBase* pNote = pEngineChannel->pEngine->NoteByID( id.noteID() );
1836            if (!pNote) return successResult();
1837    
1838            pNote->Override.SampleOffset = pos;
1839    
1840            return successResult();
1841        }
1842    
1843      // event_status() function      // event_status() function
1844    

Legend:
Removed from v.3218  
changed lines
  Added in v.3255

  ViewVC Help
Powered by ViewVC