1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/*
flext tutorial - library 1
Copyright (c) 2002,2003 Thomas Grill (xovo@gmx.net)
For information on usage and redistribution, and for a DISCLAIMER OF ALL
WARRANTIES, see the file, "license.txt," in this distribution.
-------------------------------------------------------------------------
This is an example of an external library containing a few simple objects
It uses attributes, so be sure that you've already worked through attr1 and attr2
*/
// Enable attribute processing
// For clarity, this is done here, but you'd better specify it as a compiler definition
#define FLEXT_ATTRIBUTES 1
// include flext header
#include <flext.h>
// check for appropriate flext version
#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400)
#error You need at least flext version 0.4.0
#endif
// -------------------------------------------------------------------------------------
// Define the base class
// Note that you don't have to instantiate the base class (with FLEXT_NEW or variants)
class libbase:
// inherit from basic flext class
public flext_base
{
// obligatory flext header (class name,base class name)
FLEXT_HEADER(libbase,flext_base)
public:
// constructor
libbase();
protected:
void Output(float f) const { ToOutFloat(0,f); }
// method for floats into left inlet
virtual void m_trigger(float f) = 0;
float arg; // argument variable
private:
FLEXT_CALLBACK_F(m_trigger) // callback for method "m_trigger" (with one float argument)
FLEXT_ATTRVAR_F(arg)
};
libbase::libbase():
arg(0) // initialize argument
{
// define inlets:
// first inlet must always by of type anything (or signal for dsp objects)
AddInAnything(); // add one inlet for any message
// define outlets:
AddOutFloat(); // add one float outlet (has index 0)
// register methods
FLEXT_ADDMETHOD(0,m_trigger); // register method (for float messages) "m_float" for inlet 0
// register attributes
FLEXT_ADDATTR_VAR1("arg",arg); // register attribute "arg"
}
// ------------------------------------------------------------------
// Define the actual library objects (derived from the base class)
// These classes have an implementation of the virtual function m_trigger
class libadd:
public libbase
{
// obligatory flext header, inherit from libbase
FLEXT_HEADER(libadd,libbase)
public:
virtual void m_trigger(float f) { Output(f+arg); }
};
FLEXT_LIB("lib1.+",libadd);
class libsub:
public libbase
{
// obligatory flext header, inherit from libbase
FLEXT_HEADER(libsub,libbase)
public:
virtual void m_trigger(float f) { Output(f-arg); }
};
FLEXT_LIB("lib1.-",libsub);
class libmul:
public libbase
{
// obligatory flext header, inherit from libbase
FLEXT_HEADER(libmul,libbase)
public:
virtual void m_trigger(float f) { Output(f*arg); }
};
FLEXT_LIB("lib1.*",libmul);
// ------------------------------------------------
// Do the library setup
static void lib_setup()
{
post("flext tutorial lib1, (C)2002 Thomas Grill");
post("lib1: lib1.+ lib1.- lib1.*");
post("");
// call the objects' setup routines
FLEXT_SETUP(libadd);
FLEXT_SETUP(libsub);
FLEXT_SETUP(libmul);
}
// setup the library
FLEXT_LIB_SETUP(lib1,lib_setup)
|