xtrafluid.txt
上传用户:tjmskj2
上传日期:2020-08-17
资源大小:577k
文件大小:29k
源码类别:

midi

开发平台:

C/C++

  1. Xtra iiwu
  2. Version 2.7
  3. October 2002
  4. --- Introduction
  5. The iiwu Xtra integrates the iiwusynth synthesizer into Director.
  6. The iiwusynth software synthesizer has been designed by Peter Hanappe,
  7. and is available under the LGPL licence.  It emulates in software the
  8. SoundFont 2.01 Specifications (http://www.soundfont.com) designed by
  9. Creative Labs (SoundBlaster maker).  It is basically a small, fast and
  10. robust wavetable synthesizer, with a MIDI-like interface and
  11. integrated sequencer.  For more information on the iiwu synthesizer :
  12. http://www.iiwu.org/iiwusynth
  13. The iiwu Xtra has been developped as part of the "infiniteCD Author"
  14. project managed by Antoine Schmitt and Hyptique, with support from the
  15. PRIAM funds from the French government.
  16. For more information on the infiniteCD Author project :
  17. http://www.infiniteCD.org/
  18. http://www.hyptique.com/
  19. http://www.gratin.org/as/
  20. --- Licencing
  21. The Version 2.7 of the iiwu Xtra is beta. Do not distribute without
  22. permission.  Eventually, the Xtra will be part of the iiwu project,
  23. and thus will conform to the LGPL licence.
  24. --- Release notes
  25. Version 2.0.1 : first beta version - October 2002
  26. Version 2.0.1 : first beta version - October 2002
  27. Version 2.5 : second beta - November 2002
  28. Version 2.6 : third beta - November 2002
  29. Version 2.7 : fourth beta - November 2002
  30. --- Technical Requirements
  31. OS:
  32. - Macintosh >= MacOS8.6.1 < MacOSX
  33. - Windows >= 95
  34. Director 8.5.1
  35. Sound Card
  36. --- Installation
  37. Drop the folder "iiwuXtraFolder" into the Xtras folder of Director.
  38. -----------------
  39. --- Documentation
  40. -----------------
  41. - Calls
  42. All function calls are done using lingo's call syntax:
  43. object.func(args...)
  44. or
  45. func(object, args...)
  46. Where object is the instance of the Xtra created with the 'new'
  47. method.  All functions return either a value, which can be 0 (zero),
  48. meaning that the function executed without errors, either a negative
  49. number, meaning that an error occurred. If an error occured, the
  50. function 'getError' returns a human-readable string describing the
  51. error.
  52. - Instances
  53. Many instances of the Xtra may coexist at the same time.
  54. Instances are created with the 'new' function, and deleted by assigning
  55. the lingo variable to VOID, as usual for Xtra instances.
  56. - SoundFont file, stack, presets
  57. A SoundFont bank is typically stored in a file, called a SoundFont
  58. file, of extension .sf2. In the following documentation, we will refer
  59. to the SoundFont file or SoundFont bank by the term
  60. 'SoundFont'. Please note that the term 'bank' will always refer to a
  61. MIDI bank, not a SoundFont bank.
  62. A SoundFont has a name and contains 'presets'. A preset represents a
  63. way to play a sound, as a combination of sample data and parameters on
  64. how to play it. The preset is the fundamental sound object of the
  65. SoundFont format.
  66. A preset has a name, and is defined uniquely by a MIDI bank number and
  67. a preset number in the bank. The MIDI bank number ranges from 0 to
  68. 16383 and the preset number from 0 to 127. Thus a SoundFont file may
  69. contain up to 128x16384=2097152 presets.
  70. SoundFont files may be loaded in the synthesizer, using the
  71. 'loadSoundFont' function, thus making its presets available for
  72. playing. A SoundFont may be unloaded using the 'unloadSoundFont'
  73. function.
  74. If more than one SoundFont file is loaded, the SoundFonts are stacked
  75. in the synthesizer : when a preset is requested by the 'programChange'
  76. function, it is looked up in all succcessive SoundFonts, from first to
  77. last, until the preset with the right preset number and bank number is
  78. found. The SoundFont stack may be examined but not changed : the
  79. SoundFonts are stacked in inverse loading order: the last loaded
  80. SoundFont is the first searched.
  81. A special SoundFont is maintained by the synthesizer, corresponding to
  82. user-defined presets, built from user-provided samples. These presets
  83. are defined using the 'loadSample' and 'loadSoundMember'
  84. functions. This user SoundFont is inserted in the SoundFont stack at
  85. the first call of one of these functions. All subsequent calls to one
  86. of these functions will insert the created preset in the same user
  87. SoundFont.
  88. - Channels
  89. According to the MIDI format and protocol, the synthesizer has a fixed
  90. number of channels. This is the maximum number of presets that may be
  91. playing at the same time. At all times, one given channel plays at
  92. most one preset (but can play many notes from this preset). A preset
  93. is associated to a channel using the 'programChange' function. The
  94. number of channels of the synthesizer is defined at init time using
  95. the 'new' function. A given preset may be associated to many
  96. channels.
  97. -----------------
  98. -- Initialization
  99. -----------------
  100. new(Xtra"iiwusynth")
  101. new(Xtra"iiwusynth", plist initParams)
  102. -----------------
  103. ex : iiwuObj = new(Xtra "iiwusynth", [#channels: 32])
  104. Creates a new instance of the iiwu Xtra.
  105. The optional initParams argument is a propert-list
  106. of key-value paris defining initialization parameters.
  107. Only one key is currently defined: 
  108. - #channels : int > 0 : the number of channels allocated by the
  109. synthesizer. If omitted, the default number of channels is set to 64.
  110. Version 2.0.1 : This is not implemented yet : the number of channels is always 64.
  111. To destroy the synthesizer, simply set its variable to VOID.
  112. Returns an error code (unable to create, hardware error, bad arguments).
  113. getChannelsCount(object me)
  114. -----------------
  115. ex : nbchan = getChannelsCount(iiwuObj)
  116. Returns the number of channels of the synthesizer. By default, there are 64 channels.
  117. Returns an error code (no synth).
  118. getMasterGain(object me)
  119. -----------------
  120. ex : gain = getMasterGain(iiwuObj)
  121. Returns the master gain of the synthesizer. By default the gain is 1.0 (full volume).
  122. The gain is between 0.0 and 2.0.
  123. Returns an error code (no synth).
  124. setMasterGain(object me, float gain)
  125. -----------------
  126. ex : setMasterGain(iiwuObj, 0.5)
  127. Sets the master gain of the synthesizer. By default the gain is 1.0.
  128. The gain should between 0.0 and 2.0. 
  129. Gains superior to 1.0 (full volume, no attenuation) should be handled
  130. carefully, as distortion may happen.
  131. Returns an error code (no synth).
  132. -----------------
  133. -- Reverb/Chorus
  134. -----------------
  135. setReverb(object me)
  136. setReverb(object me, int onOrOff)
  137. -----------------
  138. ex : setReverb(iiwuObj)
  139. ex : setReverb(iiwuObj, FALSE)
  140. Sets the reverb module of the synthesizer on or off.
  141. Returns an error code (no synth, bad arguments).
  142. getReverb(object me)
  143. -----------------
  144. ex : revOn = getReverb(iiwuObj)
  145. Return 1 of the reverb module is on (default), 0 if it is off.
  146. Returns an error code (no synth, bad arguments).
  147. setReverbProp(object me, symbol prop, float value)
  148. -----------------
  149. ex : setReverbProp(iiwuObj, #roomsize, 0.9)
  150. ex : setReverbProp(iiwuObj, #level, 0.2)
  151. Sets the value of a property of the reverb module.
  152. Accepted properties are:
  153. - #level : the level of the reverb (0.0 = no reverb, 1.0 = full reverb).
  154. - #roomsize : the size of the room. 0.0 means a very small room, 1.0 means outerspace.
  155. - #width : the spatial width of the reverb. 0.0 means a very narrow reverb, 1.0 a wide one.
  156. - #damping : how much power is lost at each reverberation. 1.0 : mostly lost, 0.0 : full reverberation.
  157. All values are between 0.0 and 1.0.
  158. Returns an error code (no synth, bad arguments).
  159. getReverbProp(object me, symbol prop)
  160. -----------------
  161. ex : roomsiz = getReverbProp(iiwuObj, #roomsize)
  162. ex : damping = getReverbProp(iiwuObj, #damping)
  163. Returns the float value of the given property of the reverb module. Accepted properties are listed above.
  164. Returns an error code (no synth, bad arguments).
  165. setChorus(object me)
  166. setChorus(object me, int onOrOff)
  167. -----------------
  168. ex : setChorus(iiwuObj)
  169. ex : setChorus(iiwuObj, FALSE)
  170. Sets the chorus module of the synthesizer on or off.
  171. Returns an error code (no synth, bad arguments).
  172. getChorus(object me)
  173. -----------------
  174. ex : chorusOn = getChorus(iiwuObj)
  175. Return 1 of the chorus module is on (default), 0 if it is off.
  176. Returns an error code (no synth, bad arguments).
  177. setChorusProp(object me, symbol prop, float value)
  178. -----------------
  179. ex : setChorusProp(iiwuObj, #number, 3)
  180. ex : setChorusProp(iiwuObj, #level, 0.2)
  181. Sets the value of a property of the chorus module.
  182. Accepted properties are:
  183. - #level : the level of the chorus. Min is 0.0, maximum accepted is 10.0.
  184. - #number : the number of secondary voices. Maximum is 99.
  185. - #modulation : the amplitude of the frequency modulation, in Hz. Min is 0.29, max is 5.0.
  186. - #delay : the maximum delay between secondary voices, in ms. Min is 0, maximum is 100.0.
  187. Returns an error code (no synth, bad arguments).
  188. getChorusProp(object me, symbol prop)
  189. -----------------
  190. ex : number = getChorusProp(iiwuObj, #number)
  191. ex : modulation = getChorusProp(iiwuObj, #modulation)
  192. Returns the float value of the given property of the chorus module. Accepted properties are listed above.
  193. Returns an error code (no synth, bad arguments).
  194. -----------------
  195. -- Sound Data
  196. -----------------
  197. loadSoundFont(object me, string filePath)
  198. -----------------
  199. ex : soundFontID = loadSoundFont(iiwuObj, the moviePath & "MySoundFonts.sf2")
  200. Loads a SoundFonts file in the synthesizer and places it at the top of
  201. the SoundFont stack : it will be the first searched when looking for a
  202. preset.
  203. The path is absolute, and should be expressed with the local file
  204. system conventions.
  205. The loaded soundFont will be of type #file.
  206. Returns an ID, an interger uniquely idenfiying the SoundFont in the stack, or an error
  207. code (no synth, no file, bad file format, not enough
  208. memory).
  209. createSoundFont(object me)
  210. createSoundFont(object me, string name)
  211. -----------------
  212. ex : soundFontID = createSoundFont(iiwuObj)
  213. ex : soundFontID = createSoundFont(iiwuObj, "mysoundfont in memory")
  214. Creates an empty SoundFont in memory (type #ram) and places it at the top of
  215. the SoundFont stack : it will be the first searched when looking for a
  216. preset.
  217. The returned soundFontID can be used in the #soundFont property of the loadSampleFile or
  218. loadSampleMember functions.
  219. The created soundFont can be removed from memory, using the unloadSoundFont function.
  220. The 'name' argument is optional and defaults to EMPTY (the empty string).
  221. Returns an ID, an interger uniquely idenfiying the SoundFont in the stack, or an error
  222. code (no synth, no file, bad file format, not enough
  223. memory).
  224. unloadSoundFont(object me)
  225. unloadSoundFont(object me, int soundFontID)
  226. -----------------
  227. ex : unloadSoundFont(iiwuObj, 1)
  228. ex : unloadSoundFont(iiwuObj)
  229. Unloads the SoundFont of the given ID of the SoundFont stack.
  230. The soundFontID argument is optional, and defaults to the first searched
  231. SoundFont (the last loaded).
  232. All types of soundFonts can be unloaded from memory.
  233. Returns an error code (no synth, bad ID).
  234. reloadSoundFont(object me)
  235. reloadSoundFont(object me, int soundFontID)
  236. -----------------
  237. ex : reloadSoundFont(iiwuObj, 1)
  238. ex : reloadSoundFont(iiwuObj)
  239. Version 2.0.1 : Not Yet Implemented.
  240. Reloads the SoundFont of the given ID of the SoundFont stack.
  241. The soundFontID argument is optional, and defaults to the first searched
  242. SoundFont (the last loaded).
  243. This is useful when a soundFont is known to have changed outside
  244. the synthesizer.
  245. Only SoundFonts of type #file can be reloaded.
  246. Returns an error code (no synth, bad ID).
  247. getSoundFontsStack(object me)
  248. -----------------
  249. ex : aList = getSoundFontsStack(iiwuObj)
  250. Returns a lingo list containing all the IDs of the SoundFonts in the stack, sorted from first searched to last searched (last loded to first loaded).
  251. May return an error code (no synth).
  252. getSoundFontInfo(object me)
  253. getSoundFontInfo(object me, int soundFontID)
  254. -----------------
  255. ex : nam = getSoundFontInfo(iiwuObj)
  256. Returns information about the SoundFont of the given soundFontID of the SoundFont stack.
  257. The soundFontID argument is optional, and defaults to the first searched
  258. SoundFont (the last loaded).
  259. The information is returned in the form of a lingo property-list,
  260. containing key-value pairs describing the SoundFont: its name, and
  261. info about its presets (name, preset number and bank number):
  262. [
  263.     #name:"SoundFontName",
  264.     #type:#file or #ram,
  265.     #presets:
  266.     [
  267.         [#name:"preset1Name", #bank:preset1bankNb, #number:preset1Number],
  268.         [#name:"preset2Name", #bank:preset2bankNb, #number:preset2Number],
  269.         ...
  270.     ]
  271. ]
  272. (More information may be added in future versions of the Xtra)
  273. Can return an error code (no synth, bad soundFontID).
  274. loadSampleFile(object me, string filePath, plist presetInfo)
  275. loadSampleFile(object me, string filePath, int number)
  276. -----------------
  277. Version 2.0.1 : Not Yet Implemented.
  278. ex : loadSampleFile(iiwuObj, the moviePath&"MidPiano.aiff",
  279. [#name:"piano", #bank:0, #number:1, #rootKey:60, #keyrange:[50, 70]])
  280. ex : loadSampleFile(iiwuObj, the moviePath&"Piano.aiff", [#number:2])
  281. ex : loadSampleFile(iiwuObj, the moviePath&"Piano.aiff", 2)
  282. Loads a sample file from filePath and creates a preset from it. This
  283. is a simple way of creating a preset from a specific sample.
  284. The 'filePath' is absolute, and should be expressed with the local
  285. file system conventions. Accepted sample formats are : wav, and aiff.
  286. The preset is added to a ram (memory) SoundFont (type #ram).
  287. This SoundFont is either specified using the #soundFont property (see below),
  288. either the highest soundfont in the stack is used if it is a ram soundfont,
  289. either it is created on the fly in memory, in which case it is placed at the top
  290. of the SoundFont stack of the synthesizer.
  291. The preset is created according to the 'presetInfo'
  292. lingo property-list. This plist is a combination of key-value pairs
  293. describing the preset. The following keys are taken into account:
  294. - #number : integer, mandatory. Between 0 and 127 : the preset number in the bank
  295.   If this preset number (and bank if set) was already in use, the sample is added
  296.   to the already preset samples of this preset. This is a handy way to define
  297.   a keyRange for a preset.
  298. - #bank : integer, optional (default = 0). Between 0 and 16383: the number
  299.   of the MIDI bank that will be assigned to the preset.
  300. - #soundFont : integer, optional. Specifies the soundFontID of the SoundFont
  301.    in which the preset will be created. If specified, it should be a
  302.    soundFont of type #ram. If not specified, the first soundfont on the stack
  303.    will be used if it is of type #ram. If not, a new SoundFont 
  304.    is created on the fly. 
  305. - #name : string : the name of the preset - optional
  306. - #rootKey : int between 0 and 127 : the key at which the sample will
  307.    be played 'as is' - optional : if omitted, 60 (middle-C) is used.
  308. - #keyRangeStart : integer, optional (default = 0).
  309.    Defines the first of two keys between which the sample should be
  310.    played (the comparison is inclusive).
  311.    If a noteon asks for a key outside this range, the sample is not
  312.    played. If omitted, the whole range [0, 127] is used.
  313. - #keyRangeEnd : integer, optional (default = 127). See keyRangeStart.
  314. - #loop : boolean, optional. Specifies that the sample should be played
  315. as a loop. Default is FALSE.
  316. - #attack : float, optional (default = 0.0). Duration, in milliseconds of
  317. the attack phase of the sound, i.e. the time for the sample to reach peak volume
  318. after a noteon is issued.
  319. - #decay : float, optional (default = 0.0). Duration, in milliseconds of
  320. the decay phase of the sound, i.e. the time for the sample to reach sustain volume
  321. after the attack.
  322. - #sustainlevel : float, optional (default = 0.0). Level, in dB relative to the
  323. peak level, of the sustain level. A sustainlevel of 0 means the same level than
  324. the peak level. A sustainlevel of 10 mean peak-10dB, which is very low.
  325. A sustainlevel of 100dB conventionnaly means full attenuation.
  326. - #release : float, optional (default = 0.0). Duration, in milliseconds of
  327. the release phase of the sound, i.e. the time for the sample to reach silence
  328. after a noteoff.
  329. Note that in one preset, two different samples may be used for two
  330. different key ranges.
  331. example :
  332. loadSampleFile(iiwuObj, the moviePath&"PianoLo.aiff", [#name:"piano",
  333. #bank:0, #number:1, #rootKey:30, #keyrange:[0, 60]])
  334. loadSampleFile(iiwuObj, the moviePath&"PianoHi.aiff", [#name:"piano",
  335. #bank:0, #number:1, #rootKey:90, #keyrange:[61, 127]])
  336. This example defines two samples for two ranges of the same preset.
  337. A preset may not be unloaded ; only the whole user SoundFont may be
  338. unloaded from the SoundFont stack, using the 'unloadSoundFont'
  339. function.
  340. Returns the soundFontID of the SoundFont to which the sample has been added,
  341. or an error code (no synth, no file, bad file format, not enough
  342. memory, bad bank number, bad preset number, bad key).
  343. loadSampleMember(object me, obj member, plist presetInfo)
  344. -----------------
  345. ex : loadSampleMember(iiwuObj, member(3), [#name:"piano", #bank:0, #number:1])
  346. Version 2.0.1 : Not Yet Implemented.
  347. Loads a sample from the given Director sound cast member and creates a
  348. preset from it.
  349. The preset is created according to the 'presetInfo' lingo
  350. property-list. (see above for details on the presetInfo format).
  351. Returns the soundFontID of the SoundFont to which the sample has been added,
  352. or an error code (no synth, no member, bad member format, not enough memory,
  353. bad bank number, bad preset number, bad key, not a user soundFont).
  354. -----------------
  355. -- Event sequencer
  356. -----------------
  357. Introduction
  358. -----------------
  359. - Sequencer
  360. The API functions for playing music is derived from the MIDI
  361. protocol. This protocol defines the use of a number of presets for
  362. every synthesizer object. Application communicate with a preset in a
  363. synthesizer over a channel. The communication is event based (MIDI
  364. events). The API of the music functions (discussed below) can be
  365. thought of as sending an event over a channel to a preset. 
  366. The music API functions includes the optional use of a sequencer. A
  367. sequencer is an object that assures the delivery of an event at a
  368. future time. To use the sequencer object, the events have to specify a
  369. time property. Two property key values can be used:
  370. - #date: specifies the time on an absolute time axis (the creation
  371.    time of the synthesizer is used as time zero),
  372. - #delay: specifies the time relative to the sequencer's current time.
  373. The time is measured in 'ticks'. A 'tick' is an arbitrary unit that
  374. can be set by the application. See the sequencer API below.
  375. - Event destinations
  376. The API includes the use of several synthesizer objects. The property
  377. key '#dest' indicates the destination of the event. The destination
  378. value is the name of the synthesizer object. If no destination is
  379. specified, the event will be sent to the first known destination which
  380. is the default synthesizer.
  381. - Event sources
  382. Events can also specify an event source. This is useful when the
  383. sender of an event wants to cancel some time the event later. To use
  384. this feature, the event simply contains the key '#source' with a string
  385. as value.
  386. - Callbacks
  387. Lingo objects can ask the sequencer to schedule a callback function at
  388. a precise time. The callback is the name of a Lingo handler. The movie
  389. will have to call the poll function of the xtra regularly to receive
  390. the callbacks.
  391. - Sequencer API
  392. The following functions address the sequencer directly.
  393. setTimeUnit(object me, float ticksPerSecond)
  394. -----------------
  395. ex. setTimeUnit(iiwuObj, 10.0) -- 1 tick equals 100 millisecond
  396. Sets the tick unit of the sequencer.
  397. ticksPerSecond is a float > 0.
  398. Returns a error indication (bad initialization).
  399. getTimeUnit(object me)
  400. -----------------
  401. ex. getTimeUnit(iiwuObj)
  402. Returns the tick unit of the sequencer or an error indication (bad
  403. initialization).
  404. By default, the tick value is 1000.0 (1 tick = 1 millisecond).
  405. getTime(object me)
  406. -----------------
  407. ex. getTime(iiwuObj)
  408. Returns the time in tick from the start of the synthesizer, in tick units
  409. of the sequencer or an error indication (bad initialization).
  410. getDestinations(object me)
  411. -----------------
  412. ex. getDestinations(iiwuObj)
  413. Returns a list with all the names of possible event destinations.
  414. removeEvents(object me, plist filter)
  415. -----------------
  416. ex. removeEvents(iiwuObj, [#dest: "iiwusynth", #source: "DrumMachine"])
  417. ex. removeEvents(iiwuObj, [#source: "DrumMachine", #type: #note])
  418. Removes events that are queued for sending in the sequencer. The
  419. function takes property list as argument. The property list defines
  420. the events that should be filtered. Currently, any of the three
  421. following keys can be used:
  422. - #source: remove the events for the specified source (if not specified,
  423. removes all source)
  424. - #dest: remove the events sent by the specified destination (if not
  425. specified, removes all destination)
  426. - #type: remove the events according to this event type (if not
  427. specified, removes all events)
  428. Possible event types are:
  429. - #note
  430. - #noteon
  431. - #noteoff
  432. - #allsoundsoff
  433. - #allnotesoff
  434. - #programchange
  435. - #controlchange: includes all controlChange events (pitchbend, modulation,
  436.   sustain, pan, volume, reverbsend, chorussend)
  437. - #pitchbend
  438. - #modulation
  439. - #sustain
  440. - #pan
  441. - #volume
  442. - #reverbsend
  443. - #chorussend
  444. - #callback
  445. Returns an error code (no sequencer, invalid argument).
  446. scheduleCallback(object me, plist callbackInfo)
  447. -----------------
  448. ex. scheduleCallback(iiwuObj, [#delay: 1200, #handler:"updateDrumMachine", #args: [1,2,3]])
  449. ex. scheduleCallback(iiwuObj, [#delay: 1200, #source:"drumMachine", #handler:"updateDrumMachine"])
  450. Schedules a callback event. When the event is reached, the lingo handler defined in
  451. the 'callbackInfo' propertylist is called back. Note that the callback happens during
  452. idle time.
  453. The 'callbackInfo' propertylist has the following possible properties:
  454. - #handler, string, mandatory. It is the lingo handler that will be called.
  455. - #args, a lingo list, optional. This list contains the arguments of the handler.
  456. The scheduleCallback function retains a pointer to this list but does not copy it,
  457. according to the lingo tradition. The lingo eventually executed is equivalent
  458. to "handler(args[1], args[2], ...)". If the first argument is a child object,
  459. the corresponding handler will be called on that object.
  460. - #delay/#date : integer, optional. Specifies the time of the callback. Defaults to #delay:0
  461. - #source : optional. Specifies the source. Useful for removing callbacks.
  462. - #dest : optional. Specifies the destination.
  463. To remove a scheduled callback, use removeEvents:
  464. ex : removeEvents(iiwuObj, [#source: "drumMachine", #type: #callback])
  465. ex : removeEvents(iiwuObj, [#type: #callback])
  466. Returns an error code (no sequencer, invalid argument).
  467. -----------------
  468. -- Playing music
  469. -----------------
  470. Most event functions accept an optional property list that describes
  471. the sequencing of the event. This is indicated by the 'seq' argument
  472. in the functions below. The following properties are recognized:
  473. - #date: the absolute time of the event
  474. - #delay: the time of the event relative to current time
  475. - #source: the event source
  476. - #dest: the event destination
  477. #date and #delay should not be specified together.
  478. programChange(object me, int channel, plist presetInfo, plist seq)
  479. programChange(object me, int channel, int presetNumber, plist seq)
  480. -----------------
  481. ex : programChange(iiwuObj, 1, [#bank:1, #number:3])
  482. ex : programChange(iiwuObj, 1, 3)
  483. Assigns the given preset of the SoundFont stack to the given channel
  484. of the synthethizer.
  485. The preset may be defined using a property-list defining its MIDI bank
  486. number and its preset number, using specific keys:
  487. - #bank : int between 0 and 16383: the number of the MIDI bank of the
  488.    preset - optional : if #bank is not present, 0 is the default.
  489. - #number : int between 0 and 127 : the preset number in the bank -
  490.   mandatory.
  491. The preset may also be defined by a unique int, wich is treated as
  492. the preset number, assuming that the MIDI bank is 0 (zero).
  493. In all cases, the preset is looked up in the SoundFont stack, starting
  494. from the first SoundFont up the stack, until a corresponding preset is
  495. found. The found preset is assigned to the channel.  The maximum
  496. number of channels are defined using the 'new' method.
  497. If a preset was previoulsy assigned to that channel, it is forgotten,
  498. but all noteon finish normally.
  499. Returns an error code (no synth, no SoundFonts, bad
  500. channel, bad preset definition).
  501. getProgram(object me, int channel)
  502. -----------------
  503. ex : getProgram(iiwuObj, 0)
  504. Returns information about the preset assigned to the channel.  The
  505. information is of the form : [#name:"presetName", #bank:presetBankNb,
  506. #number:presetNumber] The maximum number of channels are defined using
  507. the 'new' method.
  508. May return an error code (no synth, no preset
  509. assigned, bad channel number)
  510. note(object me, int channel, int key, float vel, int dur, plist seq)
  511. -----------------
  512. ex : note(iiwuObj, 1, 38, 1.0, 1000) 
  513. Plays a note, using the specified 'channel' and 'key', with the
  514. specified velocity (strength). The duration 'dur' of the note is
  515. specified in ticks.
  516. 0.0 <= vel <= 1.0 (automatically limited if smaller or greater)
  517. 0 <= key <= 127
  518. The maximum number of channels are defined using the 'new' method.
  519. Returns an error code (no synth, no SoundFonts, bad
  520. channel, no preset assigned, bad key, bad vel).
  521. noteon(object me, int channel, int key, float vel, plist seq)
  522. -----------------
  523. ex : noteon(iiwuObj, 1, 38, 1.0)
  524. Starts a note, using the specified 'channel' and 'key', with the
  525. specified velocity (strength).
  526. 0.0 <= vel <= 1.0 (automatically limited if smaller or greater)
  527. 0 <= key <= 127
  528. The maximum number of channels are defined using the 'new' method.
  529. Returns an error code (no synth, no SoundFonts, bad
  530. channel, no preset assigned, bad key, bad vel).
  531. noteoff(object me, int channel, int key, plist seq)
  532. -----------------
  533. ex : noteoff(iiwuObj, 1)
  534. Stops all playing notes on the given 'channel' and the given 'key'.
  535. The maximum number of channels are defined using the 'new' method.
  536. Returns an error code (no synth, no SoundFonts, bad
  537. channel, no preset assigned).
  538. controlChange(object me, int channel, plist controlParams, plist seq)
  539. -----------------
  540. ex:
  541. controlChange(obj, 1, [#pitchbend: 1.0, #sustain:1])
  542. controlChange(obj, 1, [#pan: -0.2, #sustain:1, #volume:0.5, #reverbsend:1.0]) 
  543. This function allow to change some control parameters of the given
  544. channel. The effect is immediate and allows for continuous
  545. modification of a sound.
  546. The 'controlParams' is a lingo property-list of key-value pairs, with
  547. the key describing the control parameter to affect, and the value
  548. specifying the amount of the change. For some keys, the value is not
  549. taken into account. The list of currently implemented keys is the
  550. following :
  551. - #pitchbend: float between -1.0 an 1.0: sets the pitchbend level
  552.   0.0 means no pitchbend.
  553.   The pitchrange may be configured in the preset (for
  554.   loaded SoundFonts), but the default range corresponds to 4 steps
  555.   (one step = one semi-tone), so a value of -1.0 means two steps down,
  556.   and a value of 1.0 means two steps up.
  557. - #pan: float between -1.0 an 1.0: sets the pan level.
  558.    -1.0 is all sound on left channel, 1.0 is all sound on right channel
  559.    0.0 is sound in center.
  560. - #volume: float between 0.0 an 1.0: sets the volume level.
  561.    0.0 is silence, 1.0 is full volume.
  562. - #reverbsend: float between 0.0 an 1.0. Sets the volume of the auxiliary
  563.    output send to the reverb module. 0.0 is no signal, 1.0 is full
  564.    volume.
  565. - #chorussend: float between 0.0 an 1.0. Sets the volume of the auxiliary
  566.    output send to the chorus module. 0.0 is no signal, 1.0 is full
  567.    volume.
  568. - #sustain: int = 0 or 1: sets or removes the sustain from the
  569.    channel.
  570. - #modulation: float between 0.0 an 1.0. Amplitude modulation.
  571.    Vibrato.
  572. Returns an error code (no synth, no SoundFonts, bad
  573. channel, no preset assigned, unknown controlKey, bad controlValue).
  574. getControl(object me, int channel, symbol ctrl)
  575. -----------------
  576. ex. getControl(iiwuObj, 1, #volume)
  577. Returns the value of a controller.
  578. getControls(object me, int channel)
  579. -----------------
  580. ex. getControls(iiwuObj, 1)
  581. Returns a property list with the values of all controllers in the
  582. form: [#pan: 0.4, #sustain:1, #volume:0.8, #reverbsend:1.0, ...]
  583. allsoundsoff(object me, int channel, plist seq)
  584. -----------------
  585. Instantly stops all sound on the channel. The optional argument is
  586. the sequencer information. Returns an error code (no sequencer).
  587. allnotesoff(object me, int channel, plist seq)
  588. -----------------
  589. Sends a noteoff to all currently playing notes on the channel.  The
  590. optional argument is the sequencer information. Returns an error code
  591. (no sequencer).
  592. ---------------------------
  593. -- Debug and maintenance
  594. ---------------------------
  595. debug(object me, string logFile)
  596. -----------------
  597. ex : debug(iiwuObj, the moviePath&"logfile")
  598. Sets the debug mode of the Xtra.
  599. If a logFile is provided, debug is set.
  600. If VOID is provided, debug is turned off.
  601. If debug is on, a log of all actions and errors is written in the logFile.
  602. Returns an error code (cannot open/create log file).
  603. getError(object me)
  604. -----------------
  605. ex : lastError = getError(iiwuObj)
  606. returns a human readable string describing the last error that occured
  607. in the Xtra.
  608. getCPUUsage(object me)
  609. -----------------
  610. ex : aPercent = getCPUusage(iiwuObj)
  611. returns a float representing the estimation of the percentage of CPU
  612. used by the synthesizer, or an error code (no synth).
  613. -------------------------------
  614. -------------------------------
  615. -------------------------------