1010#define HV_OWL_PARAM_C " Channel-C"
1111#define HV_OWL_PARAM_D " Channel-D"
1212#define HV_OWL_PARAM_E " Channel-E"
13+ #define HV_OWL_PARAM_F " Channel-F"
14+ #define HV_OWL_PARAM_G " Channel-G"
15+ #define HV_OWL_PARAM_H " Channel-H"
1316#define HV_OWL_PARAM_PUSH " Channel-Push"
17+ #define HEAVY_MESSAGE_POOL_SIZE 4 // in kB (default 10kB)
18+ #define HEAVY_MESSAGE_QUEUE_SIZE 1 // in kB (default 2kB)
1419
1520extern " C" {
1621 static bool isButtonPressed (PatchButtonId bid){
@@ -48,9 +53,8 @@ extern "C" {
4853
4954class HeavyPatch : public Patch {
5055private:
51- bool pushbutton;
52- unsigned int receiverHash[6 ];
53-
56+ unsigned int receiverHash[9 ];
57+ HvMessage* notein;
5458public:
5559 HeavyPatch () {
5660 registerParameter (PARAMETER_E, HV_OWL_PARAM_A);
@@ -63,31 +67,67 @@ class HeavyPatch : public Patch {
6367 receiverHash[2 ] = hv_stringToHash (HV_OWL_PARAM_C);
6468 receiverHash[3 ] = hv_stringToHash (HV_OWL_PARAM_D);
6569 receiverHash[4 ] = hv_stringToHash (HV_OWL_PARAM_E);
66- receiverHash[5 ] = hv_stringToHash (HV_OWL_PARAM_PUSH);
67- context = hv_owl_new (getSampleRate ());
70+ receiverHash[5 ] = hv_stringToHash (HV_OWL_PARAM_F);
71+ receiverHash[6 ] = hv_stringToHash (HV_OWL_PARAM_G);
72+ receiverHash[7 ] = hv_stringToHash (HV_OWL_PARAM_H);
73+ receiverHash[8 ] = hv_stringToHash (HV_OWL_PARAM_PUSH);
74+ context = hv_owl_new_with_options (getSampleRate (),
75+ HEAVY_MESSAGE_POOL_SIZE,
76+ HEAVY_MESSAGE_QUEUE_SIZE);
6877 hv_setPrintHook (context, &printHook);
6978 hv_setSendHook (context, sendHook);
79+
80+ // create note in message
81+ notein = (HvMessage*)malloc (hv_msg_getByteSize (5 ));
82+ hv_msg_init (notein, 5 , 0.0 );
83+ hv_msg_setFloat (notein, 0 , 60.0 ); // note
84+ hv_msg_setFloat (notein, 1 , 80.0 ); // velocity
85+ hv_msg_setFloat (notein, 2 , 1 .0f ); // channel
86+ hv_msg_setFloat (notein, 3 , 0x90 ); // command
87+ hv_msg_setFloat (notein, 4 , 0 .0f ); // port
7088 }
7189
7290 ~HeavyPatch () {
7391 hv_owl_free (context);
92+ free (notein);
7493 }
7594
95+ void buttonChanged (PatchButtonId bid, uint16_t value, uint16_t samples){
96+ if (bid == PUSHBUTTON){
97+ hv_sendFloatToReceiver (context, receiverHash[8 ], value ? 1.0 : 0.0 );
98+ }else if (bid >= MIDI_NOTE_BUTTON){
99+ // send message to notein object
100+ unsigned int hash = 0x67E37CA3 ; // __hv_notein
101+ float note = (float )(bid - MIDI_NOTE_BUTTON);
102+ float velocity = (float )(value>>5 );
103+ // unsigned int hash = 0x41BE0F9C; // __hv_ctlin
104+ float ms = 1000 .0f *(samples+getBlockSize ())/getSampleRate (); // delay in milliseconds
105+ // float cmd = value ? 0x90 : 0x80;
106+ hv_msg_setFloat (notein, 0 , note);
107+ hv_msg_setFloat (notein, 1 , velocity);
108+ // notein expects: note, velocity, channel, command, port
109+ // not thread safe
110+ hv_scheduleMessageForReceiver (context, hash, ms, notein);
111+ }
112+ }
113+
76114 void processAudio (AudioBuffer &buffer) {
77115 float paramA = getParameterValue (PARAMETER_A);
78116 float paramB = getParameterValue (PARAMETER_B);
79117 float paramC = getParameterValue (PARAMETER_C);
80118 float paramD = getParameterValue (PARAMETER_D);
81119 float paramE = getParameterValue (PARAMETER_E);
82- if (isButtonPressed (PUSHBUTTON) != pushbutton){
83- pushbutton = isButtonPressed (PUSHBUTTON);
84- hv_sendFloatToReceiver (context, receiverHash[5 ], pushbutton ? 1.0 : 0.0 );
85- }
120+ float paramF = getParameterValue (PARAMETER_F);
121+ float paramG = getParameterValue (PARAMETER_G);
122+ float paramH = getParameterValue (PARAMETER_H);
86123 hv_sendFloatToReceiver (context, receiverHash[0 ], paramA);
87124 hv_sendFloatToReceiver (context, receiverHash[1 ], paramB);
88125 hv_sendFloatToReceiver (context, receiverHash[2 ], paramC);
89126 hv_sendFloatToReceiver (context, receiverHash[3 ], paramD);
90127 hv_sendFloatToReceiver (context, receiverHash[4 ], paramE);
128+ hv_sendFloatToReceiver (context, receiverHash[5 ], paramF);
129+ hv_sendFloatToReceiver (context, receiverHash[6 ], paramG);
130+ hv_sendFloatToReceiver (context, receiverHash[7 ], paramH);
91131 float * outputs[] = {buffer.getSamples (LEFT_CHANNEL), buffer.getSamples (RIGHT_CHANNEL) };
92132 hv_owl_process (context, outputs, outputs, getBlockSize ());
93133 }
0 commit comments