class library: SynthDef - replaceUGen fixes
[supercollider.git] / server / plugins / iPhoneUGens.mm
blob4726bd85ff92a53915682e7fd867d1f28f3a382d
1 /*
2         SuperCollider real time audio synthesis system
3     Copyright (c) 2002 James McCartney. All rights reserved.
4         http://www.audiosynth.com
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 #include <TargetConditionals.h>
23 #if defined(SC_IPHONE) && !TARGET_IPHONE_SIMULATOR
25 #import <UIKit/UIKit.h>
27 #include "SC_PlugIn.h"
30 #if TARGET_IPHONE_SIMULATOR
31 const double pi = 3.14f;
32 #endif
35 static InterfaceTable *ft;
37 @interface AccelerometerDelegate : NSObject<UIAccelerometerDelegate>
39         UIAccelerationValue accel_x, accel_y, accel_z;
41 - (float) accel_x;
42 - (float) accel_y;
43 - (float) accel_z;
44 @end
46 static AccelerometerDelegate *delegate = 0;
49 struct AccelerometerUGen : public Unit
51         float m_y1, m_b1, m_lag;
54 //////////////////////////////////////////////////////////////////////////////////////////////////
56 extern "C"
58         void load(InterfaceTable *inTable);
60         void AccelerometerX_next(AccelerometerUGen *unit, int inNumSamples);
61         void AccelerometerY_next(AccelerometerUGen *unit, int inNumSamples);
62         void AccelerometerZ_next(AccelerometerUGen *unit, int inNumSamples);
64         void AccelerometerX_Ctor(AccelerometerUGen *unit);
65         void AccelerometerY_Ctor(AccelerometerUGen *unit);
66         void AccelerometerZ_Ctor(AccelerometerUGen *unit);
69 //////////////////////////////////////////////////////////////////////////////////////////////////
71 void AccelerometerX_next(AccelerometerUGen *unit, int inNumSamples)
72 {       
73         // minval, maxval, warp, lag
75         float minval = ZIN0(0);
76         float maxval = ZIN0(1);
77         float warp = ZIN0(2);
78         float lag = ZIN0(3);
80         float y1 = unit->m_y1;
81         float b1 = unit->m_b1;
82         
83         if (lag != unit->m_lag) {
84                 unit->m_b1 = lag == 0.f ? 0.f : exp(log001 / (lag * unit->mRate->mSampleRate));
85                 unit->m_lag = lag;
86         }
87         float y0 = ([delegate accel_x] + 1.0f)*0.5f;
88         if (warp == 0.0) {
89                 y0 = (maxval - minval) * y0 + minval;
90         } else {
91                 y0 = pow(maxval/minval, y0) * minval;
92         }
93         ZOUT0(0) = y1 = y0 + b1 * (y1 - y0);
94         unit->m_y1 = zapgremlins(y1);
97 void AccelerometerX_Ctor(AccelerometerUGen *unit)
98 {       
99         SETCALC(AccelerometerX_next);
100         unit->m_b1 = 0.f;
101         unit->m_lag = 0.f;
102         AccelerometerX_next(unit, 1);
106 void AccelerometerY_next(AccelerometerUGen *unit, int inNumSamples)
107 {       
108         // minval, maxval, warp, lag
110         float minval = ZIN0(0);
111         float maxval = ZIN0(1);
112         float warp = ZIN0(2);
113         float lag = ZIN0(3);
115         float y1 = unit->m_y1;
116         float b1 = unit->m_b1;
117         
118         if (lag != unit->m_lag) {
119                 unit->m_b1 = lag == 0.f ? 0.f : exp(log001 / (lag * unit->mRate->mSampleRate));
120                 unit->m_lag = lag;
121         }
122         float y0 = ([delegate accel_y] + 1.0f)*0.5f;
123         if (warp == 0.0) {
124                 y0 = (maxval - minval) * y0 + minval;
125         } else {
126                 y0 = pow(maxval/minval, y0) * minval;
127         }
128         ZOUT0(0) = y1 = y0 + b1 * (y1 - y0);
129         unit->m_y1 = zapgremlins(y1);
132 void AccelerometerY_Ctor(AccelerometerUGen *unit)
133 {       
134         SETCALC(AccelerometerY_next);
135         unit->m_b1 = 0.f;
136         unit->m_lag = 0.f;
137         AccelerometerY_next(unit, 1);
140 void AccelerometerZ_next(AccelerometerUGen *unit, int inNumSamples)
141 {       
142         // minval, maxval, warp, lag
144         float minval = ZIN0(0);
145         float maxval = ZIN0(1);
146         float warp = ZIN0(2);
147         float lag = ZIN0(3);
149         float y1 = unit->m_y1;
150         float b1 = unit->m_b1;
151         
152         if (lag != unit->m_lag) {
153                 unit->m_b1 = lag == 0.f ? 0.f : exp(log001 / (lag * unit->mRate->mSampleRate));
154                 unit->m_lag = lag;
155         }
156         float y0 = ([delegate accel_z] + 1.0f)*0.5f;
157         if (warp == 0.0) {
158                 y0 = (maxval - minval) * y0 + minval;
159         } else {
160                 y0 = pow(maxval/minval, y0) * minval;
161         }
162         ZOUT0(0) = y1 = y0 + b1 * (y1 - y0);
163         unit->m_y1 = zapgremlins(y1);
166 void AccelerometerZ_Ctor(AccelerometerUGen *unit)
167 {       
168         SETCALC(AccelerometerZ_next);
169         unit->m_b1 = 0.f;
170         unit->m_lag = 0.f;
171         AccelerometerZ_next(unit, 1);
174 @implementation AccelerometerDelegate
176 - (id) init
178         if (self=[super init])
179         {
180         
181         }
182         return self;
185 - (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
187         accel_x = acceleration.x;
188         accel_y = acceleration.y;
189         accel_z = acceleration.z;
190         
192         accel_x += ([acceleration x] - accel_x)*0.8f;
193         accel_y += ([acceleration y] - accel_y)*0.8f;
194         accel_z += ([acceleration z] - accel_z)*0.8f;
195 */      
198 - (float) accel_x
200         return (float) accel_x;
203 - (float) accel_y
205         return (float) accel_y;
208 - (float) accel_z
210         return (float) accel_z;
213 @end
215 PluginLoad(iPhone)
217         ft = inTable;
218         
219         delegate = [[AccelerometerDelegate alloc] init];
220         UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
221         [accel setUpdateInterval:0.01f];
222         [accel setDelegate:delegate];
223         DefineUnit("AccelerometerX", sizeof(AccelerometerUGen), (UnitCtorFunc)&AccelerometerX_Ctor, 0, 0);
224         DefineUnit("AccelerometerY", sizeof(AccelerometerUGen), (UnitCtorFunc)&AccelerometerY_Ctor, 0, 0);
225         DefineUnit("AccelerometerZ", sizeof(AccelerometerUGen), (UnitCtorFunc)&AccelerometerZ_Ctor, 0, 0);      
228 #endif