Pages: 1
Bonjour
Comment compiler des objets maxmsp avec Microsoft visual studio C++ 2008,
Quel type de projet choisir et comment lier les diiferentes librairie quicktime SDK, et les api propre à Max
J'aimerais pour commencer et comprendre comment ça marche compiler ceci :
// // Copyright: Copyright 2003 Craig Stuart Sapp // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Fri Feb 7 18:12:43 PST 2003 // Last Modified: Sat Feb 8 14:33:37 PST 2003 // Filename: squelch.c // Web Address: http://peabody.sapp.org/class/dmp2/lab/squelch/squelch.c // Syntax: C; Max4/MSP2 External Object; CodeWarrior 6.0 // OS: Mac OS 9; PPC // // Description: Suppress feedback notes from the PianoDisc MIDI player // piano. The object is designed to minimize the squelch time // so that performer notes have a better change of being // recognized. Returning velocity information could be used // to increase the accuracy of identifying feedback notes. // // Currently does not do note-off suppression. It is expected // that the computer does not feedback note-offs. // #include "ext.h" #define BUFFERSZ 100 /* maximum note count that can be remembered */ typedef struct { // data structure for note memory short key; // MIDI note pitch short vel; // MIDI note velocity long mints; // minimum timestamp for expected note return long maxts; // maximum timestamp for expected note return } NoteInfo; typedef struct { t_object max_data; // Max/MSP data, MUST come first in struct NoteInfo memory[BUFFERSZ]; // storage buffer for incoming notes long writeindex; // write index of memory buffer long invel; // temporary storage for output velocity long outvel; // temporary storage for input velocity void* outputKeyNumberOut; // outlet for MIDI note number output void* outputVelocityOut; // outlet for MIDI attack velocity output void* outputKeyNumberIn; // outlet for MIDI note number input void* outputVelocityIn; // outlet for MIDI attack velocity input } MyObject; void* object_data = NULL; // function declarations: void* create_object (void); void InputKeyNumberOut (MyObject* mo, long value); void InputVelocityOut (MyObject* mo, long value); void InputKeyNumberIn (MyObject* mo, long value); void InputVelocityIn (MyObject* mo, long value); void MessageClear (MyObject* mo); long midilimit (long value); void storeNoteInMemory (MyObject* mo, long note, long timestamp); int squelched (MyObject* mo, long inkey, long curtime); void getTimeRange (long curtime, long key, long vel, long *mintime, long *maxtime); ///////////////////////////////////////////////////////////////////////// // // Initialization functions // ////////////////////////////// // // main -- called once when the object is created in a patcher window. // void main(void) { setup((t_messlist**)&object_data, (method)create_object, NULL, sizeof(MyObject), NULL, A_NOTHING); addint ((method)InputKeyNumberOut); // inlet 1 addinx ((method)InputVelocityOut, 3); // inlet 2 addinx ((method)InputKeyNumberIn, 2); // inlet 3 addinx ((method)InputVelocityIn, 1); // inlet 4 } ////////////////////////////// // // create_object -- create the data storage for the object and // and setup input 1. Default value in object is the duration // of the analysis window in seconds. // void* create_object(void) { MyObject* mo = (MyObject*)newobject(object_data); MessageClear(mo); // initialize the memory buffer and other data mo->outputVelocityIn = intout(mo); // outlet 4 mo->outputKeyNumberIn = intout(mo); // outlet 3 mo->outputVelocityOut = intout(mo); // outlet 2 mo->outputKeyNumberOut = intout(mo); // outlet 1 intin(mo, 1); // inlet 3 intin(mo, 2); // inlet 2 intin(mo, 3); // inlet 1 return mo; } ///////////////////////////////////////////////////////////////////////// // // Behavior functions // ////////////////////////////// // // InputKeyNumberOut -- The output MIDI note will be stored in memory after // being sent out of the computer. // void InputKeyNumberOut(MyObject* mo, long value) { long curtime = gettime(); outlet_int(mo->outputVelocityOut, mo->outvel); outlet_int(mo->outputKeyNumberOut, value); if (mo->outvel > 0) { storeNoteInMemory(mo, value, curtime); } } ////////////////////////////// // // InputVelocityOut -- Store the velocity and wait for the key number to come. // void InputVelocityOut(MyObject* mo, long value) { mo->outvel = value; } ////////////////////////////// // // InputKeyNumberIn -- check to see if the note should be squelched or not. // void InputKeyNumberIn(MyObject* mo, long value) { long curtime = gettime(); if (!squelched(mo, value, curtime)) { outlet_int(mo->outputVelocityIn, mo->invel); outlet_int(mo->outputKeyNumberIn, value); } } ////////////////////////////// // // InputVelocityIn -- Store the velocity and wait for the key number to come. // void InputVelocityIn(MyObject* mo, long value) { mo->invel = value; } ////////////////////////////// // // MessageClear -- remove all notes from memory buffer. // void MessageClear(MyObject* mo) { int i; for (i=0; i<BUFFERSZ; i++) { mo->memory[i].mints = -1; mo->memory[i].maxts = -1; mo->memory[i].key = -1; mo->memory[i].vel = -1; } mo->writeindex = 0; } ///////////////////////////////////////////////////////////////////////// // // Non-interface functions: // ////////////////////////////// // // midilimit -- limit a number to the range from 0 to 127. // if the input is less than 0, return 0. // if the input is greater than 127, return 127. // long midilimit(long value) { if (value < 0) return 0; if (value > 127) return 127; return value; } /////////////////////////////// // // storeNoteInMemory -- // void storeNoteInMemory(MyObject* mo, long note, long timestamp) { long mintime, maxtime; getTimeRange(timestamp, midilimit(note), midilimit(mo->outvel), &mintime, &maxtime); mo->memory[mo->writeindex].key = midilimit(note); mo->memory[mo->writeindex].vel = midilimit(mo->outvel); mo->memory[mo->writeindex].mints = mintime; mo->memory[mo->writeindex].maxts = maxtime; mo->writeindex += 1; if (mo->writeindex >= BUFFERSZ) { mo->writeindex = 0; } } ////////////////////////////// // // squelched -- determine if the input note should be suppressed or not. // int squelched(MyObject* mo, long inkey, long curtime) { NoteInfo* mem = mo->memory; int i; // don't try to suppress note offs for now. if (mo->invel == 0) { return 0; } // search for a matching note and see if it is in the exected time-frame. // If so, then remove the note from memory, and return 1; for (i=0; i<BUFFERSZ; i++) { if (mem[i].key == inkey && mem[i].mints < curtime && mem[i].maxts > curtime) { mem[i].key = -1; return 1; } } return 0; } ////////////////////////////// // // getTimeRange -- calculate the minimum and maximum time the output note is // expected to return to the computer. // void getTimeRange(long curtime, long key, long vel, long *mintime, long *maxtime) { #pgagma unused(vel) #pragma unused(key) *mintime = curtime + 40; *maxtime = curtime + 250; }
Hors ligne
Pour le moment j'ai fait ceci
Create a new project: Créez un nouveau projet:
Ouvrez Visual C + +.
Ouvrir la fenêtre Nouveau Projet (Ctrl + Maj + N).
Dans le volet Types de projets, sélectionnez Visual C + +.
Dans le volet Modèles, emptyproj sélectionner.
Entrez le nom d'objet (Squelchc).
Laisser Créer le répertoire pour la solution n'est pas cochée, puis cliquez sur OK.
Mais comment lier les différentes source du maxmsp sdk? J'ai essayer de pointer le header. h désiré mais peut etre je m'y prend mal je n'arrive qu'a sélectionner le dossier. comment associer les sources etc Pourriez vous m'aidez pour que je comprenne une bonne fois pour toute comment compilez un objet pour MaxMsp du début à la fin.
Dernière modification par baudry (2009-10-03 04:50:47)
Hors ligne
un SDK est fournis avec une documentation et des exemples. Il faut donc commencer par lire la documentation.
Je ne connais rien à "MaxMsp" mais un peu de méthode peu servir.
Il y a une fonction main dans votre code, il est donc très probable que votre code correspond à celui d'un exécutable.
Donc, pour généré un exécutable avec VS2008, il faut :
Ouvrez Visual C + +.
Ouvrir la fenêtre Nouveau Projet (Ctrl + Maj + N).
Dans le volet Types de projets, sélectionnez Visual C++, puis Win32, puis Win32 Console Application.
Dans le Wizard, Ne pas sélectionner "Empty project", il faut prendre les réglages par défaut
Dans le fichier .cpp portant le même nom que le projet, supprimez la fonction _tmain et copiez le code que vous avez posté. Ne supprimez par l'include de stdafx.h.
Vous cliquez droit sur le projet -> Properties -> Configuration Properties -> C/C++ -> General ->Additional Include Directories : vous y ajutez le ou les répertoire contenant les fichiers d'en-tête (.h) de "MaxMsp"
Vous cliquez droit sur le projet -> Properties -> Configuration Properties -> Linker -> General ->Additional Library Directories : vous y ajutez le ou les répertoire contenant les fichiers bibliothèque (.lib) de "MaxMsp"
Vous cliquez droit sur le projet -> Properties -> Configuration Properties -> Linker -> Input ->Additional Dependencies : vous y ajoutez le ou les nom des fichiers bibliothèque (.lib) de "MaxMsp" nécessaire (voir documentation)
Hors ligne
Pages: 1