Jamoma API  0.6.0.a19
PureData/source/j.model/j.model_signal.cpp
Go to the documentation of this file.
1 /** @file
2  *
3  * @ingroup implementationPdExternals
4  *
5  * @brief j.model / j.view - signal features
6  *
7  * @details
8  *
9  * @authors Théo de la Hogue, Trond Lossius, Antoine Villeret
10  *
11  * @copyright Copyright © 2010 Théo de la Hogue @n
12  * Copyright © 2015, Antoine Villeret@n
13  * This code is licensed under the terms of the "New BSD License" @n
14  * http://creativecommons.org/licenses/BSD/
15  */
16 
17 
18 #include "j.model.h"
19 
20 void model_signal_amenities(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
21 {
23 
24  // don't do nothing while internals are processed or the internals table is not availalble
25  if (x->iterateInternals || x->internals == NULL)
26  return;
27 
28  TTAddress modelAdrs, relativeAddress;
29  TTObject aData, aSender;
30  TTBoolean dataInput, dataOutput, audioInput, audioOutput;
31  TTValue v;
32 
33  // get model:address
34  EXTRA->modelInfo->get(kTTSym_address, v);
35  modelAdrs = v[0];
36 
37  // look into the patcher to know if there are data or audio input and output
38  jamoma_patcher_get_input_output(x->patcherPtr, dataInput, dataOutput, audioInput, audioOutput);
39 
40  if (model_test_amenities(self, TTSymbol("data"))) {
41 
42  // create internal datas depending on what have been found
43  if (dataInput || dataOutput) {
44 
45  // make internal parameter at data/active address
46  if (x->internals->lookup(TTSymbol("data/active"), v)) {
47 
48  makeInternals_data(x, modelAdrs, TTSymbol("data/active"), gensym("return_data_active"), x->patcherPtr, kTTSym_parameter, aData);
49  aData.set(kTTSym_type, kTTSym_boolean);
50  aData.set(kTTSym_tags, kTTSym_generic);
51  aData.set(kTTSym_description, TTSymbol("this parameter turns on model's data processing"));
52  aData.set(kTTSym_valueDefault, YES);
53  }
54 
55  // make an internal sender to access to all in|out instance mute attribute
56  if (x->internals->lookup(TTSymbol("data/*.*:mute"), v))
57  makeInternals_sender(self, modelAdrs, TTSymbol("data/*.*:mute"), aSender);
58  }
59 
60  if (dataInput && dataOutput) {
61 
62  // make internal parameter at data/bypass address
63  if (x->internals->lookup(TTSymbol("data/bypass"), v)) {
64 
65  makeInternals_data(x, modelAdrs, TTSymbol("data/bypass"), gensym("return_data_bypass"), x->patcherPtr, kTTSym_parameter, aData);
66  aData.set(kTTSym_type, kTTSym_boolean);
67  aData.set(kTTSym_tags, kTTSym_generic);
68  aData.set(kTTSym_description, TTSymbol("When active, this parameter bypasses the model's data processing algorithm, letting incoming signal pass through unaffected"));
69  aData.set(kTTSym_valueDefault, NO);
70  }
71 
72  // make an internal sender to access to all in instance bypass attribute
73  if (x->internals->lookup(TTSymbol("data/in.*:bypass"), v))
74  makeInternals_sender(self, modelAdrs, TTSymbol("data/in.*:bypass"), aSender);
75  }
76  }
77 
78  if (model_test_amenities(self, TTSymbol("audio"))) {
79 
80  // create internal audio datas depending on what have been found
81  if (audioInput || audioOutput) {
82 
83  // make internal parameter at audio/mute address
84  if (x->internals->lookup(TTSymbol("audio/mute"), v)) {
85 
86  makeInternals_data(x, modelAdrs, TTSymbol("audio/mute"), gensym("return_audio_mute"), x->patcherPtr, kTTSym_parameter, aData);
87  aData.set(kTTSym_type, kTTSym_boolean);
88  aData.set(kTTSym_tags, kTTSym_generic);
89  aData.set(kTTSym_description, TTSymbol("When active, this parameter turns off model's audio processing"));
90  aData.set(kTTSym_valueDefault, NO);
91  }
92 
93  // make an internal sender to access to all in|out instance mute attribute
94  if (x->internals->lookup(TTSymbol("audio/*.*:mute"), v))
95  makeInternals_sender(self, modelAdrs, TTSymbol("audio/*.*:mute"), aSender);
96  }
97 
98  if (audioInput && audioOutput) {
99 
100  // make internal parameter at audio/bypass address
101  if (x->internals->lookup(TTSymbol("audio/bypass"), v)) {
102 
103  makeInternals_data(x, modelAdrs, TTSymbol("audio/bypass"), gensym("return_audio_bypass"), x->patcherPtr, kTTSym_parameter, aData);
104  aData.set(kTTSym_type, kTTSym_boolean);
105  aData.set(kTTSym_tags, kTTSym_generic);
106  aData.set(kTTSym_description, TTSymbol("When active, this parameter bypasses the model's audio processing algorithm, letting incoming signal pass through unaffected"));
107  aData.set(kTTSym_valueDefault, NO);
108  }
109 
110  // make an internal sender to access to all in instance bypass attribute
111  if (x->internals->lookup(TTSymbol("audio/in.*:bypass"), v))
112  makeInternals_sender(self, modelAdrs, TTSymbol("audio/in.*:bypass"), aSender);
113 
114  // make internal parameter at data/mix address
115  if (x->internals->lookup(TTSymbol("audio/mix"), v)) {
116 
117  makeInternals_data(x, modelAdrs, TTSymbol("audio/mix"), gensym("return_audio_mix"), x->patcherPtr, kTTSym_parameter, aData);
118  aData.set(kTTSym_type, kTTSym_decimal);
119  aData.set(kTTSym_tags, kTTSym_generic);
120  v = TTValue(0., 100.);
121  aData.set(kTTSym_rangeBounds, v);
122  aData.set(kTTSym_rangeClipmode, kTTSym_both);
123  v = TTValue(100.);
124  aData.set(kTTSym_valueDefault, v); // Assume 100%, so that processed signal is passed through
125  aData.set(kTTSym_rampDrive, TTSymbol("max"));
126  aData.set(kTTSym_rampFunction, TTSymbol("linear"));
127  aData.set(kTTSym_description, TTSymbol("Controls the wet/dry mix in percent"));
128  }
129 
130  // make an internal sender to access to all out instance mix attribute
131  if (x->internals->lookup(TTSymbol("audio/out.*:mix"), v))
132  makeInternals_sender(self, modelAdrs, TTSymbol("audio/out.*:mix"), aSender);
133  }
134 
135  if (audioOutput) {
136 
137  // make internal parameter at audio/gain address
138  if (x->internals->lookup(TTSymbol("audio/gain"), v)) {
139 
140  makeInternals_data(x, modelAdrs, TTSymbol("audio/gain"), gensym("return_audio_gain"), x->patcherPtr, kTTSym_parameter, aData);
141  aData.set(kTTSym_type, kTTSym_decimal);
142  aData.set(kTTSym_tags, kTTSym_generic);
143  v = TTValue(0., 127.);
144  aData.set(kTTSym_rangeBounds, v);
145  aData.set(kTTSym_rangeClipmode, kTTSym_both);
146  v = TTValue(100.);
147  aData.set(kTTSym_valueDefault, v);
148  aData.set(kTTSym_rampDrive, TTSymbol("max"));
149  aData.set(kTTSym_rampFunction, TTSymbol("linear"));
150  aData.set(kTTSym_description, TTSymbol("Set gain of model's outputs (as MIDI value by default)."));
151  }
152 
153  // make an internal sender to access to all out instance gain attribute
154  if (x->internals->lookup(TTSymbol("audio/out.*:gain"), v))
155  makeInternals_sender(self, modelAdrs, TTSymbol("audio/out.*:gain"), aSender);
156  }
157  }
158 }
159 
160 void model_signal_return_data_active(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
161 {
163  TTObject aSender;
164  TTValue v, out;
165 
166  if (!x->internals->lookup(TTSymbol("data/*.*:mute"), v)) {
167 
168  aSender = v[0];
169 
170  v = TTBoolean(atom_getlong(argv) == 0);
171 
172  aSender.send(kTTSym_Send, v, out);
173  }
174 }
175 
176 void model_signal_return_data_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
177 {
179  TTObject aSender;
180  TTValue v, out;
181 
182  if (!x->internals->lookup(TTSymbol("data/in.*:bypass"), v)) {
183 
184  aSender = v[0];
185 
186  jamoma_ttvalue_from_Atom(v, msg, argc, argv);
187 
188  aSender.send(kTTSym_Send, v, out);
189  }
190 }
191 
192 void model_signal_return_audio_mute(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
193 {
195  TTObject aSender;
196  TTValue v, out;
197 
198  if (!x->internals->lookup(TTSymbol("audio/*.*:mute"), v)) {
199 
200  aSender = v[0];
201 
202  jamoma_ttvalue_from_Atom(v, msg, argc, argv);
203 
204  aSender.send(kTTSym_Send, v, out);
205  }
206 }
207 
208 void model_signal_return_audio_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
209 {
211  TTObject aSender;
212  TTValue v, out;
213 
214  if (!x->internals->lookup(TTSymbol("audio/in.*:bypass"), v)) {
215 
216  aSender = v[0];
217 
218  jamoma_ttvalue_from_Atom(v, msg, argc, argv);
219 
220  aSender.send(kTTSym_Send, v, out);
221  }
222 }
223 
224 void model_signal_return_audio_mix(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
225 {
227  TTObject aSender;
228  TTValue v, out;
229 
230  if (!x->internals->lookup(TTSymbol("audio/out.*:mix"), v)) {
231 
232  aSender = v[0];
233 
234  jamoma_ttvalue_from_Atom(v, msg, argc, argv);
235 
236  aSender.send(kTTSym_Send, v, out);
237  }
238 }
239 
240 void model_signal_return_audio_gain(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
241 {
243  TTObject aSender;
244  TTValue v, out;
245 
246  if (!x->internals->lookup(TTSymbol("audio/out.*:gain"), v)) {
247 
248  aSender = v[0];
249 
250  jamoma_ttvalue_from_Atom(v, msg, argc, argv);
251 
252  aSender.send(kTTSym_Send, v, out);
253  }
254 }
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
Definition: TTBase.h:167
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
Definition: TTObject.cpp:135
j.model / j.view - The main control center of Jamoma model and view patcher
TTErr lookup(const TTSymbol key, TTValue &value)
Find the value for the given key.
Definition: TTHash.cpp:76
void model_signal_return_audio_mix(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_signal_return_data_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Definition: TTAddress.h:29
Create and use Jamoma object instances.
Definition: TTObject.h:29
void model_signal_return_audio_gain(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void JAMOMA_EXPORT jamoma_patcher_get_input_output(t_object *patcher, TTBoolean &dataInput, TTBoolean &dataOutput, TTBoolean &audioInput, TTBoolean &audioOutput)
Look into the given patcher to know if there are data or audio inputs and outputs.
void * TTPtr
A generic pointer.
Definition: TTBase.h:248
void model_signal_amenities(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTErr set(const TTSymbol aName, T aValue)
Set an attribute value for an object.
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
Definition: TTSymbol.h:26
void model_signal_return_data_active(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTBoolean iterateInternals
The flag is true when an iteration is done on the internals.
TTBoolean model_test_amenities(TTPtr self, TTSymbol name)
void JAMOMA_EXPORT jamoma_ttvalue_from_Atom(TTValue &v, t_symbol *msg, long argc, const t_atom *argv)
Make a TTValue from Atom array.
Data Structure for this object.
void model_signal_return_audio_mute(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
[doxygenAppendixC_copyExample]
Definition: TTValue.h:34
void model_signal_return_audio_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)