int prArray_OSCBytes(VMGlobals *g, int numArgsPushed) { PyrSlot* a = g->sp; PyrObject *array = a->uo; PyrSlot* args = array->slots; int numargs = array->size; if (numargs < 1) return errFailed; big_scpacket packet; if (IsFloat(args) || IsNil(args) || IsInt(args)) { makeSynthBundle(&packet, args, numargs, false); } else if (IsSym(args) || isKindOfSlot(args, class_string)) { makeSynthMsgWithTags(&packet, args, numargs); } else { return errWrongType; } int size = packet.size(); PyrInt8Array* obj = newPyrInt8Array(g->gc, size, 0, true); obj->size = size; memcpy(obj->b, packet.data(), size); SetObject(a, (PyrObject*)obj); //for (int i=0; i<packet.size()/4; i++) post("%d %08X\n", i, packet.buf[i]); return errNone; }
static PyrInt8Array* MsgToInt8Array ( sc_msg_iter msg ) { int size = msg.getbsize() ; VMGlobals *g = gMainVMGlobals ; PyrInt8Array *obj = newPyrInt8Array ( g->gc , size , 0 , true ) ; obj->size = size ; msg.getb ( (char *)obj->b , obj->size ) ; return obj ; }
static void scCallSysexAction(PyrSymbol* action, int recoverFromUID) { VMGlobals *g = gMainVMGlobals; if(recoverFromUID) { // rebuild the VM so sc won't crash with two following calls ++g->sp; SetObject(g->sp, s_midiin->u.classobj); // Set the class MIDIIn ++g->sp; SetInt(g->sp, recoverFromUID); //src ++g->sp; } PyrInt8Array* sysexArray = newPyrInt8Array(g->gc, (int)gSysexData.size(), 0, true); sysexArray->size = (int)gSysexData.size(); std::copy(gSysexData.begin(), gSysexData.end(), sysexArray->b); SetObject(g->sp, (PyrObject*) sysexArray); // chan argument unneeded as there runInterpreter(g, action, 3 ); // special sysex action in the lang }
int prAsArchive(struct VMGlobals *g, int numArgsPushed) { PyrSlot *a = g->sp; PyrArchiver<char*> arch(g); int err = arch.prepareToWriteArchive(a); if (err) return err; int32 size = arch.calcArchiveSize(); PyrInt8Array *obj = newPyrInt8Array(g->gc, size, 0, true); obj->size = size; arch.setStream((char*)obj->b); err = arch.writeArchive(); if (err == errNone) SetObject(a, obj); else SetNil(a); return err; }