File: std.hs

package info (click to toggle)
sfront 0.99-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 10,232 kB
  • ctags: 7,117
  • sloc: ansic: 113,695; haskell: 2,230; makefile: 1,242; objc: 677; yacc: 325
file content (340 lines) | stat: -rw-r--r-- 12,436 bytes parent folder | download | duplicates (7)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340

//////////////////////////////////////////////////////////////////////////
//
//   Slib, Sfront's SAOL library
//   This file: The std library (general-purpose library elements)
//
// Copyright (c) 1999-2006, Regents of the University of California
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//  Redistributions of source code must retain the above copyright
//  notice, this list of conditions and the following disclaimer.
//
//  Redistributions in binary form must reproduce the above copyright
//  notice, this list of conditions and the following disclaimer in the
//  documentation and/or other materials provided with the distribution.
//
//  Neither the name of the University of California, Berkeley nor the
//  names of its contributors may be used to endorse or promote products
//  derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//    Maintainer: John Lazzaro, lazzaro@cs.berkeley.edu
//
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
//                                                
//
// This library is a collection of constants, macros, and other items that
// are generally useful for SAOL programming. A brief description of each
// item is below, sorted by category.
//
// Temporal constants
// ------------------
//
// Name        Description                               Equation
//
// ACYCLE      Number of a-passes in an execution cycle  [int(s_rate/k_rate)]
// ARATE       Audio sample rate                         [s_rate Hz]
// ATIME       Audio sampling period                     [1/s_rate seconds]
// KRATE       Control sampling rate                     [k_rate Hz]
// KTIME       Control sampling period                   [1/k_rate seconds]
// SRATE       Audio sample rate                         [s_rate Hz]
// STIME       Audio sample period                       [1/s_rate seconds]
//
//
// Tempo constants
// ---------------
//
// Name              Description                   Value
//           
// INIT_TEMPO        Initial tempo for MP4-SA      60   beats/second
// INIT_INVTEMPO     1/INIT_TEMPO                  1/60 seconds/beat
//
//
// Math Constants
// --------------
//
// Name              Description                   Value
//
// M_PI and PI       Trigonometric constant        3.141 ...
// M_E               e (Euler's constant)          2.71 ...
//
//
//
// The NONE Constant 
// -----------------
//
// The C language uses the null pointer 0 as a special value, and the
// symbol constant NULL is used in place of 0 in code to denote its use. 
// Likewise, SAOL and SASL use the integral value -1 to indicate a 
// special value in many contexts, and so we define NONE to have the 
// value -1, and encourage its use in the following contexts instead
// of the literal -1:
//
// ***   For the size parameter in wavetable generators, to indicate
//       that the generator should compute the size of the table.
//
// ***   For the duration parameter in SAOL and SASL instr statements,
//       to indicate indefinite duration.
//
// ***   The loops parameter in the oscil and koscil core opcodes.
//
// ***   The nharm parameter in the buzz core opcode and core wavetable
//       wavetable generator.
//
// Note that the fft and ifft are exceptional, and use 0 (not -1) to
// code special semantics for the len, shift, and size parameters. So
// be careful not to use NONE in fft and ifft opcode calls.
//
//
// Pitch Representations
// ---------------------
//
// SAOL supports four different representations of pitch (cps, midi,
// pch, oct) with a set of core opcodes to convert between them. The
// following constants let you specify constant notes in each 
// representation in a familiar form:
//
//
// Name              Description                   Value
//
// CPS_MIDDLEC      Middle C in cps notation       261.6256     
// MIDI_MIDDLEC     Middle C in midi notation      60
// PCH_MIDDLEC      Middle C in pch notation       8
// OCT_MIDDLEC      Middle C in oct notation       8
//
// CPS_CONCERTA     Concert A in cps notation      440
// MIDI_CONCERTA    Concert A in midi notation     69
// PCH_CONCERTA     Concert A in pch notation      8.9
// OCT_CONCERTA     Concert A in oct notation      8.75
//
// 
// These macros take a parameter, the number of semitones away from
// Middle C, and compute the cps, midi, pch, or oct value. Semitones
// may be a positive or negative integral value. 
//
// Name                   Description
//
// CPS_SEMITONES(x)      CPS  value x semitones away Middle C
// MIDI_SEMITONES(x)     MIDI value x semitones away Middle C
// PCH_SEMITONES(x)      PCH  value x semitones away Middle C
// OCT_SEMITONES(x)      OCT  value x semitones away Middle C
//
//
// This constant is a useful argument to the semitone macros:
//
// Name              Description                       Value
//
// OCTAVESTEPS       Number of semitones per octave      12
//
//
//
// MIDI number scaling
// -------------------
//
// See the ssm.h library for mnemonic scaled, smoothed replacements
// for MIDIctrl[], MIDIbend, and MIDItouch standard names. The 
// constants in this section are for computing on the (7-bit) velocity 
// and note-number values, and for creating alternatives to the ssm.h
// library.
//
// Name           Description                                 Value
//
// MIDI_MAX       Largest value for 7-bit MIDI numbers.       127
// MIDI_SCALE     To scale 7-bit MIDI into [0, 1]             1/127
// MIDI_NULL      The zero value for bipolar 7-bit MIDI       64
// MIDI_SSCALE    Use with MIDI_NULL for [-1, 1] scaling      1/64
//
// MIDI_BIGMAX    Largest value for 14-bit MIDI numbers,      16383
//                used by MIDIbend, and coded by two 
//                MIDIctrl[] entries byr some controllers.
// MIDI_BIGSCALE  To scale 14-bit MIDI into [0, 1]            1/16383
// MIDI_BIGNULL   The zero value for bipolar 14-bit MIDI      8192
// MIDI_BIGSSCALE Use with MIDI_BIGNULL for [-1, 1] scaling   1/8192
// MIDI_MSBSHIFT  Multiply MSB's of MIDIctrl[] by this        128
//                value, and add to LSB to get 14-bit MIDI
// 
// MIDI_OFF       For binary MIDIctrl[] entries. Values       63
//                greater than MIDI_OFF are 1, else 0.
// 
//
//
// Symbolic constants for the fracdelay() core opcode
// ------------------------------------------------
//
//   aopcode fracdelay(ksig method, xsig p1, xsig p2) 
// 
//
// This core opcode, which is usually used via a sequence of oparray
// calls, has different semantics for different integral values of
// the method parameter. The constants in this section are the 
// supported methods.
//
//   Name        Value     Description                
//
//
//  FRAC_INIT      1       Initializes delay line structure. p1 is the
//                         length of the delay, in seconds. Returns 0.
//
//  FRAC_TAP       2       Returns data from the delay line. p1 is the 
//                         position to read, in seconds. If p1 does not
//                         correspond to an integral delay line position,
//                         return value is interpolated.
//
//  FRAC_SET       3       Sets the delay line position p1 to value p2.
//                         p1 is truncated to an integral delay line 
//                         position. Returns 0.
//
//  FRAC_SUM       4       Sums the value p2 into delay line position p1.
//                         p1 is truncated to an integral delay line
//                         position. Returns new value of delay line 
//                         position that is updated.
//
//  FRAC_SHIFT     5       Shifts delay line by 1. Shifts a zero into
//                         the delay line, returns value shifted off the
//                         end of the delay line.
//
//
//
//  Symbolic constants for the random core wavetable generator
//  ----------------------------------------------------------
//
//    table t(random, size, dist, p1 [,p2])
//
//  This core wavetable generator creates a table of length size
//  filled with random numbers. The distribution of the random numbers
//  depends on the integral value of the dist parameter. The constants
//  in this section are the supported distributions.
//
//
//   Name           Value     Description                
//
//  RANDOM_UNIFORM    1       Uniform distribution over [p1, p2]
//
//  RANDOM_LINEAR     2       Linearly ramped distribution from p1 to p2
//
//  RANDOM_EXPON      3       Poisson distribution: p(x) =  p1*exp(-p1*x)
//
//  RANDOM_GAUSSIAN   4       Gaussian distribution: mean p1 and variance p2
//
//  RANDOM_PROCESS    5       Table holds a binary sequence (0.0 and 1.0) that
//                            is generated by a Poisson process specified
//                            by the formula  p(x) =  p1*exp(-p1*x)
//
//
//  Symbolic constants for the window core wavetable generator
//  ----------------------------------------------------------
//
//    table t(window, size, type [,p])
//
//  This core wavetable generator creates a table of length size
//  holding a windowing function. The type of window function created
//  depends on the integral value of the type parameter. The constants
//  in this section are the supported windows.
//
//
//   Name             Value     Window type
//
//   WINDOW_HAMMING     1       Hamming  
//   WINDOW_HANNING     2       Hanning  (raise cosine)
//   WINDOW_BARTLETT    3       Bartlett (triangular)
//   WINDOW_GAUSSIAN    4       Gaussian
//   WINDOW_KAISER      5       Kaiser, with parameter p
//   WINDOW_BOXCAR      6       Boxcar
//
//


/////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
//                                                
// library definitions begin here
//

#ifndef SLIB_STD
#define SLIB_STD

#define ACYCLE (int(s_rate/k_rate))
#define ARATE  (s_rate)
#define ATIME  (1/s_rate)
#define KRATE  (k_rate)
#define KTIME  (1/k_rate)
#define SRATE  (s_rate)
#define STIME  (1/s_rate)

#define INIT_TEMPO     60
#define INIT_INVTEMPO  (1/60)

#define PI             3.14159265358979323846
#define M_PI           3.14159265358979323846
#define M_E            2.7182818284590452354

#define NONE           -1

#define  CPS_MIDDLEC     261.6256     
#define  MIDI_MIDDLEC    60
#define  PCH_MIDDLEC     8
#define  OCT_MIDDLEC     8

#define  CPS_CONCERTA    440
#define  MIDI_CONCERTA    69
#define  PCH_CONCERTA    8.9
#define  OCT_CONCERTA   8.75

#define MIDI_SEMITONES(x) (x + 60)
#define CPS_SEMITONES(x)  (cpsmidi(x + 60))
#define OCT_SEMITONES(x)  ((x + 96)/12)
#define PCH_SEMITONES(x)  (pchmidi(x + 60))
#define OCTAVESTEPS       12

#define  MIDI_MAX       127
#define  MIDI_SCALE     (1/127)
#define  MIDI_NULL      64
#define  MIDI_SSCALE    (1/64)
#define  MIDI_BIGMAX    (16383)
#define  MIDI_BIGSCALE  (1/16383)
#define  MIDI_BIGNULL   8192
#define  MIDI_BIGSSCALE (1/8192)
#define  MIDI_MSBSHIFT  128
#define  MIDI_OFF       63

#define FRAC_INIT  1
#define FRAC_TAP   2
#define FRAC_SET   3
#define FRAC_SUM   4
#define FRAC_SHIFT 5

#define RANDOM_UNIFORM  1
#define RANDOM_LINEAR   2
#define RANDOM_EXPON    3
#define RANDOM_GAUSSIAN 4
#define RANDOM_PROCESS  5

#define WINDOW_HAMMING  1
#define WINDOW_HANNING  2
#define WINDOW_BARTLETT 3
#define WINDOW_GAUSSIAN 4
#define WINDOW_KAISER   5
#define WINDOW_BOXCAR   6

#endif // SLIB_STD