You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

730 lines
27KB

  1. /***************************************************/
  2. /*! \class Shakers
  3. \brief PhISEM and PhOLIES class.
  4. PhISEM (Physically Informed Stochastic Event Modeling) is an
  5. algorithmic approach for simulating collisions of multiple
  6. independent sound producing objects. This class is a meta-model
  7. that can simulate a Maraca, Sekere, Cabasa, Bamboo Wind Chimes,
  8. Water Drops, Tambourine, Sleighbells, and a Guiro.
  9. PhOLIES (Physically-Oriented Library of Imitated Environmental
  10. Sounds) is a similar approach for the synthesis of environmental
  11. sounds. This class implements simulations of breaking sticks,
  12. crunchy snow (or not), a wrench, sandpaper, and more.
  13. Control Change Numbers:
  14. - Shake Energy = 2
  15. - System Decay = 4
  16. - Number Of Objects = 11
  17. - Resonance Frequency = 1
  18. - Shake Energy = 128
  19. - Instrument Selection = 1071
  20. - Maraca = 0
  21. - Cabasa = 1
  22. - Sekere = 2
  23. - Tambourine = 3
  24. - Sleigh Bells = 4
  25. - Bamboo Chimes = 5
  26. - Sand Paper = 6
  27. - Coke Can = 7
  28. - Sticks = 8
  29. - Crunch = 9
  30. - Big Rocks = 10
  31. - Little Rocks = 11
  32. - Next Mug = 12
  33. - Penny + Mug = 13
  34. - Nickle + Mug = 14
  35. - Dime + Mug = 15
  36. - Quarter + Mug = 16
  37. - Franc + Mug = 17
  38. - Peso + Mug = 18
  39. - Guiro = 19
  40. - Wrench = 20
  41. - Water Drops = 21
  42. - Tuned Bamboo Chimes = 22
  43. by Perry R. Cook with updates by Gary Scavone, 1995--2017.
  44. */
  45. /***************************************************/
  46. #include "Shakers.h"
  47. #include "SKINImsg.h"
  48. namespace stk {
  49. // Maraca
  50. const StkFloat MARACA_SOUND_DECAY = 0.95;
  51. const StkFloat MARACA_SYSTEM_DECAY = 0.999;
  52. const StkFloat MARACA_GAIN = 4.0;
  53. const StkFloat MARACA_NUM_BEANS = 25;
  54. const int MARACA_RESONANCES = 1;
  55. const StkFloat MARACA_FREQUENCIES[MARACA_RESONANCES] = { 3200 };
  56. const StkFloat MARACA_RADII[MARACA_RESONANCES] = { 0.96 };
  57. const StkFloat MARACA_GAINS[MARACA_RESONANCES] = { 1.0 };
  58. // Cabasa
  59. const StkFloat CABASA_SOUND_DECAY = 0.96;
  60. const StkFloat CABASA_SYSTEM_DECAY = 0.997;
  61. const StkFloat CABASA_GAIN = 8.0;
  62. const StkFloat CABASA_NUM_BEADS = 512;
  63. const int CABASA_RESONANCES = 1;
  64. const StkFloat CABASA_FREQUENCIES[CABASA_RESONANCES] = { 3000 };
  65. const StkFloat CABASA_RADII[CABASA_RESONANCES] = { 0.7 };
  66. const StkFloat CABASA_GAINS[CABASA_RESONANCES] = { 1.0 };
  67. // Sekere
  68. const StkFloat SEKERE_SOUND_DECAY = 0.96;
  69. const StkFloat SEKERE_SYSTEM_DECAY = 0.999;
  70. const StkFloat SEKERE_GAIN = 4.0;
  71. const StkFloat SEKERE_NUM_BEANS = 64;
  72. const int SEKERE_RESONANCES = 1;
  73. const StkFloat SEKERE_FREQUENCIES[SEKERE_RESONANCES] = { 5500 };
  74. const StkFloat SEKERE_RADII[SEKERE_RESONANCES] = { 0.6 };
  75. const StkFloat SEKERE_GAINS[SEKERE_RESONANCES] = { 1.0 };
  76. // Bamboo Wind Chimes
  77. const StkFloat BAMBOO_SOUND_DECAY = 0.9;
  78. const StkFloat BAMBOO_SYSTEM_DECAY = 0.9999;
  79. const StkFloat BAMBOO_GAIN = 0.4;
  80. const StkFloat BAMBOO_NUM_TUBES = 1.2;
  81. const int BAMBOO_RESONANCES = 3;
  82. const StkFloat BAMBOO_FREQUENCIES[BAMBOO_RESONANCES] = { 2800, 0.8 * 2800.0, 1.2 * 2800.0 };
  83. const StkFloat BAMBOO_RADII[BAMBOO_RESONANCES] = { 0.995, 0.995, 0.995 };
  84. const StkFloat BAMBOO_GAINS[BAMBOO_RESONANCES] = { 1.0, 1.0, 1.0 };
  85. // Tambourine
  86. const StkFloat TAMBOURINE_SOUND_DECAY = 0.95;
  87. const StkFloat TAMBOURINE_SYSTEM_DECAY = 0.9985;
  88. const StkFloat TAMBOURINE_GAIN = 1.0;
  89. const StkFloat TAMBOURINE_NUM_TIMBRELS = 32;
  90. const int TAMBOURINE_RESONANCES = 3; // Fixed shell + 2 moving cymbal resonances
  91. const StkFloat TAMBOURINE_FREQUENCIES[TAMBOURINE_RESONANCES] = { 2300, 5600, 8100 };
  92. const StkFloat TAMBOURINE_RADII[TAMBOURINE_RESONANCES] = { 0.96, 0.99, 0.99 };
  93. const StkFloat TAMBOURINE_GAINS[TAMBOURINE_RESONANCES] = { 0.1, 0.8, 1.0 };
  94. // Sleighbells
  95. const StkFloat SLEIGH_SOUND_DECAY = 0.97;
  96. const StkFloat SLEIGH_SYSTEM_DECAY = 0.9994;
  97. const StkFloat SLEIGH_GAIN = 1.0;
  98. const StkFloat SLEIGH_NUM_BELLS = 32;
  99. const int SLEIGH_RESONANCES = 5;
  100. const StkFloat SLEIGH_FREQUENCIES[SLEIGH_RESONANCES] = { 2500, 5300, 6500, 8300, 9800 };
  101. const StkFloat SLEIGH_RADII[SLEIGH_RESONANCES] = { 0.99, 0.99, 0.99, 0.99, 0.99 };
  102. const StkFloat SLEIGH_GAINS[SLEIGH_RESONANCES] = { 1.0, 1.0, 1.0, 0.5, 0.3 };
  103. // Sandpaper
  104. const StkFloat SANDPAPER_SOUND_DECAY = 0.999;
  105. const StkFloat SANDPAPER_SYSTEM_DECAY = 0.999;
  106. const StkFloat SANDPAPER_GAIN = 0.5;
  107. const StkFloat SANDPAPER_NUM_GRAINS = 128;
  108. const int SANDPAPER_RESONANCES = 1;
  109. const StkFloat SANDPAPER_FREQUENCIES[SANDPAPER_RESONANCES] = { 4500 };
  110. const StkFloat SANDPAPER_RADII[SANDPAPER_RESONANCES] = { 0.6 };
  111. const StkFloat SANDPAPER_GAINS[SANDPAPER_RESONANCES] = { 1.0 };
  112. // Cokecan
  113. const StkFloat COKECAN_SOUND_DECAY = 0.97;
  114. const StkFloat COKECAN_SYSTEM_DECAY = 0.999;
  115. const StkFloat COKECAN_GAIN = 0.5;
  116. const StkFloat COKECAN_NUM_PARTS = 48;
  117. const int COKECAN_RESONANCES = 5; // Helmholtz + 4 metal resonances
  118. const StkFloat COKECAN_FREQUENCIES[COKECAN_RESONANCES] = { 370, 1025, 1424, 2149, 3596 };
  119. const StkFloat COKECAN_RADII[COKECAN_RESONANCES] = { 0.99, 0.992, 0.992, 0.992, 0.992 };
  120. const StkFloat COKECAN_GAINS[COKECAN_RESONANCES] = { 1.0, 1.8, 1.8, 1.8, 1.8 };
  121. // Tuned Bamboo Wind Chimes (Angklung)
  122. const StkFloat ANGKLUNG_SOUND_DECAY = 0.95;
  123. const StkFloat ANGKLUNG_SYSTEM_DECAY = 0.9999;
  124. const StkFloat ANGKLUNG_GAIN = 0.5;
  125. const StkFloat ANGKLUNG_NUM_TUBES = 1.2;
  126. const int ANGKLUNG_RESONANCES = 7;
  127. const StkFloat ANGKLUNG_FREQUENCIES[ANGKLUNG_RESONANCES] = { 1046.6, 1174.8, 1397.0, 1568, 1760, 2093.3, 2350 };
  128. const StkFloat ANGKLUNG_RADII[ANGKLUNG_RESONANCES] = { 0.996, 0.996, 0.996, 0.996, 0.996, 0.996, 0.996 };
  129. const StkFloat ANGKLUNG_GAINS[ANGKLUNG_RESONANCES] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
  130. // Guiro
  131. const StkFloat GUIRO_SOUND_DECAY = 0.95;
  132. const StkFloat GUIRO_GAIN = 0.4;
  133. const StkFloat GUIRO_NUM_PARTS = 128;
  134. const int GUIRO_RESONANCES = 2;
  135. const StkFloat GUIRO_FREQUENCIES[GUIRO_RESONANCES] = { 2500, 4000 };
  136. const StkFloat GUIRO_RADII[GUIRO_RESONANCES] = { 0.97, 0.97 };
  137. const StkFloat GUIRO_GAINS[GUIRO_RESONANCES] = { 1.0, 1.0 };
  138. // Wrench
  139. const StkFloat WRENCH_SOUND_DECAY = 0.95;
  140. const StkFloat WRENCH_GAIN = 0.4;
  141. const StkFloat WRENCH_NUM_PARTS = 128;
  142. const int WRENCH_RESONANCES = 2;
  143. const StkFloat WRENCH_FREQUENCIES[WRENCH_RESONANCES] = { 3200, 8000 };
  144. const StkFloat WRENCH_RADII[WRENCH_RESONANCES] = { 0.99, 0.992 };
  145. const StkFloat WRENCH_GAINS[WRENCH_RESONANCES] = { 1.0, 1.0 };
  146. // Water Drops
  147. const StkFloat WATER_SOUND_DECAY = 0.95;
  148. const StkFloat WATER_SYSTEM_DECAY = 0.996;
  149. const StkFloat WATER_GAIN = 1.0;
  150. const StkFloat WATER_NUM_SOURCES = 10;
  151. const int WATER_RESONANCES = 3;
  152. const StkFloat WATER_FREQUENCIES[WATER_RESONANCES] = { 450, 600, 750 };
  153. const StkFloat WATER_RADII[WATER_RESONANCES] = { 0.9985, 0.9985, 0.9985 };
  154. const StkFloat WATER_GAINS[WATER_RESONANCES] = { 1.0, 1.0, 1.0 };
  155. // PhOLIES (Physically-Oriented Library of Imitated Environmental
  156. // Sounds), Perry Cook, 1997-8
  157. // Stix1
  158. const StkFloat STIX1_SOUND_DECAY = 0.96;
  159. const StkFloat STIX1_SYSTEM_DECAY = 0.998;
  160. const StkFloat STIX1_GAIN = 6.0;
  161. const StkFloat STIX1_NUM_BEANS = 2;
  162. const int STIX1_RESONANCES = 1;
  163. const StkFloat STIX1_FREQUENCIES[STIX1_RESONANCES] = { 5500 };
  164. const StkFloat STIX1_RADII[STIX1_RESONANCES] = { 0.6 };
  165. const StkFloat STIX1_GAINS[STIX1_RESONANCES] = { 1.0 };
  166. // Crunch1
  167. const StkFloat CRUNCH1_SOUND_DECAY = 0.95;
  168. const StkFloat CRUNCH1_SYSTEM_DECAY = 0.99806;
  169. const StkFloat CRUNCH1_GAIN = 4.0;
  170. const StkFloat CRUNCH1_NUM_BEADS = 7;
  171. const int CRUNCH1_RESONANCES = 1;
  172. const StkFloat CRUNCH1_FREQUENCIES[CRUNCH1_RESONANCES] = { 800 };
  173. const StkFloat CRUNCH1_RADII[CRUNCH1_RESONANCES] = { 0.95 };
  174. const StkFloat CRUNCH1_GAINS[CRUNCH1_RESONANCES] = { 1.0 };
  175. // Nextmug + Coins
  176. const StkFloat NEXTMUG_SOUND_DECAY = 0.97;
  177. const StkFloat NEXTMUG_SYSTEM_DECAY = 0.9995;
  178. const StkFloat NEXTMUG_GAIN = 0.8;
  179. const StkFloat NEXTMUG_NUM_PARTS = 3;
  180. const int NEXTMUG_RESONANCES = 4;
  181. const StkFloat NEXTMUG_FREQUENCIES[NEXTMUG_RESONANCES] = { 2123, 4518, 8856, 10753 };
  182. const StkFloat NEXTMUG_RADII[NEXTMUG_RESONANCES] = { 0.997, 0.997, 0.997, 0.997 };
  183. const StkFloat NEXTMUG_GAINS[NEXTMUG_RESONANCES] = { 1.0, 0.8, 0.6, 0.4 };
  184. const int COIN_RESONANCES = 3;
  185. const StkFloat PENNY_FREQUENCIES[COIN_RESONANCES] = { 11000, 5200, 3835 };
  186. const StkFloat PENNY_RADII[COIN_RESONANCES] = { 0.999, 0.999, 0.999 };
  187. const StkFloat PENNY_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 };
  188. const StkFloat NICKEL_FREQUENCIES[COIN_RESONANCES] = { 5583, 9255, 9805 };
  189. const StkFloat NICKEL_RADII[COIN_RESONANCES] = { 0.9992, 0.9992, 0.9992 };
  190. const StkFloat NICKEL_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 };
  191. const StkFloat DIME_FREQUENCIES[COIN_RESONANCES] = { 4450, 4974, 9945 };
  192. const StkFloat DIME_RADII[COIN_RESONANCES] = { 0.9993, 0.9993, 0.9993 };
  193. const StkFloat DIME_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 };
  194. const StkFloat QUARTER_FREQUENCIES[COIN_RESONANCES] = { 1708, 8863, 9045 };
  195. const StkFloat QUARTER_RADII[COIN_RESONANCES] = { 0.9995, 0.9995, 0.9995 };
  196. const StkFloat QUARTER_GAINS[COIN_RESONANCES] = { 1.0, 0.8, 0.5 };
  197. const StkFloat FRANC_FREQUENCIES[COIN_RESONANCES] = { 5583, 11010, 1917 };
  198. const StkFloat FRANC_RADII[COIN_RESONANCES] = { 0.9995, 0.9995, 0.9995 };
  199. const StkFloat FRANC_GAINS[COIN_RESONANCES] = { 0.7, 0.4, 0.3 };
  200. const StkFloat PESO_FREQUENCIES[COIN_RESONANCES] = { 7250, 8150, 10060 };
  201. const StkFloat PESO_RADII[COIN_RESONANCES] = { 0.9996, 0.9996, 0.9996 };
  202. const StkFloat PESO_GAINS[COIN_RESONANCES] = { 1.0, 1.2, 0.7 };
  203. // Big Gravel
  204. const StkFloat BIGROCKS_SOUND_DECAY = 0.98;
  205. const StkFloat BIGROCKS_SYSTEM_DECAY = 0.9965;
  206. const StkFloat BIGROCKS_GAIN = 4.0;
  207. const StkFloat BIGROCKS_NUM_PARTS = 23;
  208. const int BIGROCKS_RESONANCES = 1;
  209. const StkFloat BIGROCKS_FREQUENCIES[BIGROCKS_RESONANCES] = { 6460 };
  210. const StkFloat BIGROCKS_RADII[BIGROCKS_RESONANCES] = { 0.932 };
  211. const StkFloat BIGROCKS_GAINS[BIGROCKS_RESONANCES] = { 1.0 };
  212. // Little Gravel
  213. const StkFloat LITTLEROCKS_SOUND_DECAY = 0.98;
  214. const StkFloat LITTLEROCKS_SYSTEM_DECAY = 0.99586;
  215. const StkFloat LITTLEROCKS_GAIN = 4.0;
  216. const StkFloat LITTLEROCKS_NUM_PARTS = 1600;
  217. const int LITTLEROCKS_RESONANCES = 1;
  218. const StkFloat LITTLEROCKS_FREQUENCIES[LITTLEROCKS_RESONANCES] = { 9000 };
  219. const StkFloat LITTLEROCKS_RADII[LITTLEROCKS_RESONANCES] = { 0.843 };
  220. const StkFloat LITTLEROCKS_GAINS[LITTLEROCKS_RESONANCES] = { 1.0 };
  221. Shakers :: Shakers( int type )
  222. {
  223. shakerType_ = -1;
  224. this->setType( type );
  225. }
  226. void Shakers :: setType( int type )
  227. {
  228. if ( shakerType_ == type ) return;
  229. varyFactor_ = 0.0;
  230. shakerType_ = type;
  231. if ( type == 1 ) { // Cabasa
  232. nResonances_ = CABASA_RESONANCES;
  233. filters_.resize( nResonances_ );
  234. baseFrequencies_.resize( nResonances_ );
  235. baseRadii_.resize( nResonances_ );
  236. doVaryFrequency_.resize( nResonances_ );
  237. baseObjects_ = CABASA_NUM_BEADS;
  238. for ( unsigned int i=0; i<nResonances_; i++ ) {
  239. baseRadii_[i] = CABASA_RADII[i];
  240. baseFrequencies_[i] = CABASA_FREQUENCIES[i];
  241. filters_[i].gain = CABASA_GAINS[i];
  242. doVaryFrequency_[i] = false;
  243. }
  244. baseDecay_ = CABASA_SYSTEM_DECAY;
  245. baseGain_ = CABASA_GAIN;
  246. soundDecay_ = CABASA_SOUND_DECAY;
  247. decayScale_ = 0.97;
  248. setEqualization( 1.0, -1.0, 0.0 );
  249. }
  250. else if ( type == 2 ) { // Sekere
  251. nResonances_ = SEKERE_RESONANCES;
  252. filters_.resize( nResonances_ );
  253. baseFrequencies_.resize( nResonances_ );
  254. baseRadii_.resize( nResonances_ );
  255. doVaryFrequency_.resize( nResonances_ );
  256. baseObjects_ = SEKERE_NUM_BEANS;
  257. for ( unsigned int i=0; i<nResonances_; i++ ) {
  258. baseRadii_[i] = SEKERE_RADII[i];
  259. baseFrequencies_[i] = SEKERE_FREQUENCIES[i];
  260. filters_[i].gain = SEKERE_GAINS[i];
  261. doVaryFrequency_[i] = false;
  262. }
  263. baseDecay_ = SEKERE_SYSTEM_DECAY;
  264. baseGain_ = SEKERE_GAIN;
  265. soundDecay_ = SEKERE_SOUND_DECAY;
  266. decayScale_ = 0.94;
  267. setEqualization( 1.0, 0.0, -1.0 );
  268. }
  269. else if ( type == 3 ) { // Tambourine
  270. nResonances_ = TAMBOURINE_RESONANCES;
  271. filters_.resize( nResonances_ );
  272. baseFrequencies_.resize( nResonances_ );
  273. baseRadii_.resize( nResonances_ );
  274. doVaryFrequency_.resize( nResonances_ );
  275. baseObjects_ = TAMBOURINE_NUM_TIMBRELS;
  276. for ( unsigned int i=0; i<nResonances_; i++ ) {
  277. baseRadii_[i] = TAMBOURINE_RADII[i];
  278. baseFrequencies_[i] = TAMBOURINE_FREQUENCIES[i];
  279. filters_[i].gain = TAMBOURINE_GAINS[i];
  280. doVaryFrequency_[i] = true;
  281. }
  282. doVaryFrequency_[0] = false;
  283. baseDecay_ = TAMBOURINE_SYSTEM_DECAY;
  284. baseGain_ = TAMBOURINE_GAIN;
  285. soundDecay_ = TAMBOURINE_SOUND_DECAY;
  286. decayScale_ = 0.95;
  287. varyFactor_ = 0.05;
  288. setEqualization( 1.0, 0.0, -1.0 );
  289. }
  290. else if ( type == 4 ) { // Sleighbells
  291. nResonances_ = SLEIGH_RESONANCES;
  292. filters_.resize( nResonances_ );
  293. baseFrequencies_.resize( nResonances_ );
  294. baseRadii_.resize( nResonances_ );
  295. doVaryFrequency_.resize( nResonances_ );
  296. baseObjects_ = SLEIGH_NUM_BELLS;
  297. for ( unsigned int i=0; i<nResonances_; i++ ) {
  298. baseRadii_[i] = SLEIGH_RADII[i];
  299. baseFrequencies_[i] = SLEIGH_FREQUENCIES[i];
  300. filters_[i].gain = SLEIGH_GAINS[i];
  301. doVaryFrequency_[i] = true;
  302. }
  303. baseDecay_ = SLEIGH_SYSTEM_DECAY;
  304. baseGain_ = SLEIGH_GAIN;
  305. soundDecay_ = SLEIGH_SOUND_DECAY;
  306. decayScale_ = 0.9;
  307. varyFactor_ = 0.03;
  308. setEqualization( 1.0, 0.0, -1.0 );
  309. }
  310. else if ( type == 5 ) { // Bamboo chimes
  311. nResonances_ = BAMBOO_RESONANCES;
  312. filters_.resize( nResonances_ );
  313. baseFrequencies_.resize( nResonances_ );
  314. baseRadii_.resize( nResonances_ );
  315. doVaryFrequency_.resize( nResonances_ );
  316. baseObjects_ = BAMBOO_NUM_TUBES;
  317. for ( unsigned int i=0; i<nResonances_; i++ ) {
  318. baseRadii_[i] = BAMBOO_RADII[i];
  319. baseFrequencies_[i] = BAMBOO_FREQUENCIES[i];
  320. filters_[i].gain = BAMBOO_GAINS[i];
  321. doVaryFrequency_[i] = true;
  322. }
  323. baseDecay_ = BAMBOO_SYSTEM_DECAY;
  324. baseGain_ = BAMBOO_GAIN;
  325. soundDecay_ = BAMBOO_SOUND_DECAY;
  326. decayScale_ = 0.7;
  327. varyFactor_ = 0.2;
  328. setEqualization( 1.0, 0.0, 0.0 );
  329. }
  330. else if ( type == 6 ) { // Sandpaper
  331. nResonances_ = SANDPAPER_RESONANCES;
  332. filters_.resize( nResonances_ );
  333. baseFrequencies_.resize( nResonances_ );
  334. baseRadii_.resize( nResonances_ );
  335. doVaryFrequency_.resize( nResonances_ );
  336. baseObjects_ = SANDPAPER_NUM_GRAINS;
  337. for ( unsigned int i=0; i<nResonances_; i++ ) {
  338. baseRadii_[i] = SANDPAPER_RADII[i];
  339. baseFrequencies_[i] = SANDPAPER_FREQUENCIES[i];
  340. filters_[i].gain = SANDPAPER_GAINS[i];
  341. doVaryFrequency_[i] = false;
  342. }
  343. baseDecay_ = SANDPAPER_SYSTEM_DECAY;
  344. baseGain_ = SANDPAPER_GAIN;
  345. soundDecay_ = SANDPAPER_SOUND_DECAY;
  346. decayScale_ = 0.97;
  347. setEqualization( 1.0, 0.0, -1.0 );
  348. }
  349. else if ( type == 7 ) { // Cokecan
  350. nResonances_ = COKECAN_RESONANCES;
  351. filters_.resize( nResonances_ );
  352. baseFrequencies_.resize( nResonances_ );
  353. baseRadii_.resize( nResonances_ );
  354. doVaryFrequency_.resize( nResonances_ );
  355. baseObjects_ = COKECAN_NUM_PARTS;
  356. for ( unsigned int i=0; i<nResonances_; i++ ) {
  357. baseRadii_[i] = COKECAN_RADII[i];
  358. baseFrequencies_[i] = COKECAN_FREQUENCIES[i];
  359. filters_[i].gain = COKECAN_GAINS[i];
  360. doVaryFrequency_[i] = false;
  361. }
  362. baseDecay_ = COKECAN_SYSTEM_DECAY;
  363. baseGain_ = COKECAN_GAIN;
  364. soundDecay_ = COKECAN_SOUND_DECAY;
  365. decayScale_ = 0.95;
  366. setEqualization( 1.0, 0.0, -1.0 );
  367. }
  368. else if ( type == 8 ) { // Stix1
  369. nResonances_ = STIX1_RESONANCES;
  370. filters_.resize( nResonances_ );
  371. baseFrequencies_.resize( nResonances_ );
  372. baseRadii_.resize( nResonances_ );
  373. doVaryFrequency_.resize( nResonances_ );
  374. baseObjects_ = STIX1_NUM_BEANS;
  375. for ( unsigned int i=0; i<nResonances_; i++ ) {
  376. baseRadii_[i] = STIX1_RADII[i];
  377. baseFrequencies_[i] = STIX1_FREQUENCIES[i];
  378. filters_[i].gain = STIX1_GAINS[i];
  379. doVaryFrequency_[i] = false;
  380. }
  381. baseDecay_ = STIX1_SYSTEM_DECAY;
  382. baseGain_ = STIX1_GAIN;
  383. soundDecay_ = STIX1_SOUND_DECAY;
  384. decayScale_ = 0.96;
  385. setEqualization( 1.0, 0.0, -1.0 );
  386. }
  387. else if ( type == 9 ) { // Crunch1
  388. nResonances_ = CRUNCH1_RESONANCES;
  389. filters_.resize( nResonances_ );
  390. baseFrequencies_.resize( nResonances_ );
  391. baseRadii_.resize( nResonances_ );
  392. doVaryFrequency_.resize( nResonances_ );
  393. baseObjects_ = CRUNCH1_NUM_BEADS;
  394. for ( unsigned int i=0; i<nResonances_; i++ ) {
  395. baseRadii_[i] = CRUNCH1_RADII[i];
  396. baseFrequencies_[i] = CRUNCH1_FREQUENCIES[i];
  397. filters_[i].gain = CRUNCH1_GAINS[i];
  398. doVaryFrequency_[i] = false;
  399. }
  400. baseDecay_ = CRUNCH1_SYSTEM_DECAY;
  401. baseGain_ = CRUNCH1_GAIN;
  402. soundDecay_ = CRUNCH1_SOUND_DECAY;
  403. decayScale_ = 0.96;
  404. setEqualization( 1.0, -1.0, 0.0 );
  405. }
  406. else if ( type == 10 ) { // Big Rocks
  407. nResonances_ = BIGROCKS_RESONANCES;
  408. filters_.resize( nResonances_ );
  409. baseFrequencies_.resize( nResonances_ );
  410. baseRadii_.resize( nResonances_ );
  411. doVaryFrequency_.resize( nResonances_ );
  412. baseObjects_ = BIGROCKS_NUM_PARTS;
  413. for ( unsigned int i=0; i<nResonances_; i++ ) {
  414. baseRadii_[i] = BIGROCKS_RADII[i];
  415. baseFrequencies_[i] = BIGROCKS_FREQUENCIES[i];
  416. filters_[i].gain = BIGROCKS_GAINS[i];
  417. doVaryFrequency_[i] = true;
  418. }
  419. baseDecay_ = BIGROCKS_SYSTEM_DECAY;
  420. baseGain_ = BIGROCKS_GAIN;
  421. soundDecay_ = BIGROCKS_SOUND_DECAY;
  422. decayScale_ = 0.95;
  423. varyFactor_ = 0.11;
  424. setEqualization( 1.0, 0.0, -1.0 );
  425. }
  426. else if ( type == 11 ) { // Little Rocks
  427. nResonances_ = LITTLEROCKS_RESONANCES;
  428. filters_.resize( nResonances_ );
  429. baseFrequencies_.resize( nResonances_ );
  430. baseRadii_.resize( nResonances_ );
  431. doVaryFrequency_.resize( nResonances_ );
  432. baseObjects_ = LITTLEROCKS_NUM_PARTS;
  433. for ( unsigned int i=0; i<nResonances_; i++ ) {
  434. baseRadii_[i] = LITTLEROCKS_RADII[i];
  435. baseFrequencies_[i] = LITTLEROCKS_FREQUENCIES[i];
  436. filters_[i].gain = LITTLEROCKS_GAINS[i];
  437. doVaryFrequency_[i] = true;
  438. }
  439. baseDecay_ = LITTLEROCKS_SYSTEM_DECAY;
  440. baseGain_ = LITTLEROCKS_GAIN;
  441. soundDecay_ = LITTLEROCKS_SOUND_DECAY;
  442. decayScale_ = 0.95;
  443. varyFactor_ = 0.18;
  444. setEqualization( 1.0, 0.0, -1.0 );
  445. }
  446. else if ( type > 11 && type < 19 ) { // Nextmug
  447. nResonances_ = NEXTMUG_RESONANCES;
  448. if ( type > 12 ) // mug + coin
  449. nResonances_ += COIN_RESONANCES;
  450. filters_.resize( nResonances_ );
  451. baseFrequencies_.resize( nResonances_ );
  452. baseRadii_.resize( nResonances_ );
  453. doVaryFrequency_.resize( nResonances_ );
  454. baseObjects_ = NEXTMUG_NUM_PARTS;
  455. for ( int i=0; i<NEXTMUG_RESONANCES; i++ ) {
  456. baseRadii_[i] = NEXTMUG_RADII[i];
  457. baseFrequencies_[i] = NEXTMUG_FREQUENCIES[i];
  458. filters_[i].gain = NEXTMUG_GAINS[i];
  459. doVaryFrequency_[i] = false;
  460. }
  461. baseDecay_ = NEXTMUG_SYSTEM_DECAY;
  462. baseGain_ = NEXTMUG_GAIN;
  463. soundDecay_ = NEXTMUG_SOUND_DECAY;
  464. decayScale_ = 0.95;
  465. setEqualization( 1.0, 0.0, -1.0 );
  466. // Add coins
  467. if ( type == 13 ) { // Mug + Penny
  468. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  469. baseRadii_[i+NEXTMUG_RESONANCES] = PENNY_RADII[i];
  470. baseFrequencies_[i+NEXTMUG_RESONANCES] = PENNY_FREQUENCIES[i];
  471. filters_[i+NEXTMUG_RESONANCES].gain = PENNY_GAINS[i];
  472. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  473. }
  474. }
  475. else if ( type == 14 ) { // Mug + Nickel
  476. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  477. baseRadii_[i+NEXTMUG_RESONANCES] = NICKEL_RADII[i];
  478. baseFrequencies_[i+NEXTMUG_RESONANCES] = NICKEL_FREQUENCIES[i];
  479. filters_[i+NEXTMUG_RESONANCES].gain = NICKEL_GAINS[i];
  480. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  481. }
  482. }
  483. else if ( type == 15 ) { // Mug + Dime
  484. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  485. baseRadii_[i+NEXTMUG_RESONANCES] = DIME_RADII[i];
  486. baseFrequencies_[i+NEXTMUG_RESONANCES] = DIME_FREQUENCIES[i];
  487. filters_[i+NEXTMUG_RESONANCES].gain = DIME_GAINS[i];
  488. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  489. }
  490. }
  491. else if ( type == 16 ) { // Mug + Quarter
  492. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  493. baseRadii_[i+NEXTMUG_RESONANCES] = QUARTER_RADII[i];
  494. baseFrequencies_[i+NEXTMUG_RESONANCES] = QUARTER_FREQUENCIES[i];
  495. filters_[i+NEXTMUG_RESONANCES].gain = QUARTER_GAINS[i];
  496. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  497. }
  498. }
  499. else if ( type == 17 ) { // Mug + Franc
  500. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  501. baseRadii_[i+NEXTMUG_RESONANCES] = FRANC_RADII[i];
  502. baseFrequencies_[i+NEXTMUG_RESONANCES] = FRANC_FREQUENCIES[i];
  503. filters_[i+NEXTMUG_RESONANCES].gain = FRANC_GAINS[i];
  504. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  505. }
  506. }
  507. else if ( type == 18 ) { // Mug + Peso
  508. for ( int i=0; i<COIN_RESONANCES; i++ ) {
  509. baseRadii_[i+NEXTMUG_RESONANCES] = PESO_RADII[i];
  510. baseFrequencies_[i+NEXTMUG_RESONANCES] = PESO_FREQUENCIES[i];
  511. filters_[i+NEXTMUG_RESONANCES].gain = PESO_GAINS[i];
  512. doVaryFrequency_[i+NEXTMUG_RESONANCES] = false;
  513. }
  514. }
  515. }
  516. else if ( type == 19 ) { // Guiro
  517. nResonances_ = GUIRO_RESONANCES;
  518. filters_.resize( nResonances_ );
  519. baseFrequencies_.resize( nResonances_ );
  520. baseRadii_.resize( nResonances_ );
  521. doVaryFrequency_.resize( nResonances_ );
  522. baseObjects_ = GUIRO_NUM_PARTS;
  523. for ( unsigned int i=0; i<nResonances_; i++ ) {
  524. baseRadii_[i] = GUIRO_RADII[i];
  525. baseFrequencies_[i] = GUIRO_FREQUENCIES[i];
  526. filters_[i].gain = GUIRO_GAINS[i];
  527. doVaryFrequency_[i] = false;
  528. }
  529. baseGain_ = GUIRO_GAIN;
  530. soundDecay_ = GUIRO_SOUND_DECAY;
  531. ratchetCount_ = 0;
  532. baseRatchetDelta_ = 0.0001;
  533. ratchetDelta_ = baseRatchetDelta_;
  534. lastRatchetValue_ = -1;
  535. setEqualization( 1.0, 0.0, -1.0 );
  536. }
  537. else if ( type == 20 ) { // Wrench
  538. nResonances_ = WRENCH_RESONANCES;
  539. filters_.resize( nResonances_ );
  540. baseFrequencies_.resize( nResonances_ );
  541. baseRadii_.resize( nResonances_ );
  542. doVaryFrequency_.resize( nResonances_ );
  543. baseObjects_ = WRENCH_NUM_PARTS;
  544. for ( unsigned int i=0; i<nResonances_; i++ ) {
  545. baseRadii_[i] = WRENCH_RADII[i];
  546. baseFrequencies_[i] = WRENCH_FREQUENCIES[i];
  547. filters_[i].gain = WRENCH_GAINS[i];
  548. doVaryFrequency_[i] = false;
  549. }
  550. baseGain_ = WRENCH_GAIN;
  551. soundDecay_ = WRENCH_SOUND_DECAY;
  552. ratchetCount_ = 0;
  553. baseRatchetDelta_ = 0.00015;
  554. ratchetDelta_ = baseRatchetDelta_;
  555. lastRatchetValue_ = -1;
  556. setEqualization( 1.0, 0.0, -1.0 );
  557. }
  558. else if ( type == 21 ) { // Water Drops
  559. nResonances_ = WATER_RESONANCES;
  560. filters_.resize( nResonances_ );
  561. baseFrequencies_.resize( nResonances_ );
  562. tempFrequencies_.resize( nResonances_ );
  563. baseRadii_.resize( nResonances_ );
  564. doVaryFrequency_.resize( nResonances_ );
  565. baseObjects_ = WATER_NUM_SOURCES;
  566. for ( unsigned int i=0; i<nResonances_; i++ ) {
  567. baseRadii_[i] = WATER_RADII[i];
  568. baseFrequencies_[i] = WATER_FREQUENCIES[i];
  569. tempFrequencies_[i] = WATER_FREQUENCIES[i];
  570. filters_[i].gain = WATER_GAINS[i];
  571. doVaryFrequency_[i] = false;
  572. }
  573. baseDecay_ = WATER_SYSTEM_DECAY;
  574. baseGain_ = WATER_GAIN;
  575. soundDecay_ = WATER_SOUND_DECAY;
  576. decayScale_ = 0.8;
  577. setEqualization( -1.0, 0.0, 1.0 );
  578. }
  579. else if ( type == 22 ) { // Tuned Bamboo Chimes (Angklung)
  580. nResonances_ = ANGKLUNG_RESONANCES;
  581. filters_.resize( nResonances_ );
  582. baseFrequencies_.resize( nResonances_ );
  583. baseRadii_.resize( nResonances_ );
  584. doVaryFrequency_.resize( nResonances_ );
  585. baseObjects_ = ANGKLUNG_NUM_TUBES;
  586. for ( unsigned int i=0; i<nResonances_; i++ ) {
  587. baseRadii_[i] = ANGKLUNG_RADII[i];
  588. baseFrequencies_[i] = ANGKLUNG_FREQUENCIES[i];
  589. filters_[i].gain = ANGKLUNG_GAINS[i];
  590. doVaryFrequency_[i] = false;
  591. }
  592. baseDecay_ = ANGKLUNG_SYSTEM_DECAY;
  593. baseGain_ = ANGKLUNG_GAIN;
  594. soundDecay_ = ANGKLUNG_SOUND_DECAY;
  595. decayScale_ = 0.7;
  596. setEqualization( 1.0, 0.0, -1.0 );
  597. }
  598. else { // Maraca (default)
  599. shakerType_ = 0;
  600. nResonances_ = MARACA_RESONANCES;
  601. filters_.resize( nResonances_ );
  602. baseFrequencies_.resize( nResonances_ );
  603. baseRadii_.resize( nResonances_ );
  604. doVaryFrequency_.resize( nResonances_ );
  605. baseObjects_ = MARACA_NUM_BEANS;
  606. for ( unsigned int i=0; i<nResonances_; i++ ) {
  607. baseRadii_[i] = MARACA_RADII[i];
  608. baseFrequencies_[i] = MARACA_FREQUENCIES[i];
  609. filters_[i].gain = MARACA_GAINS[i];
  610. doVaryFrequency_[i] = false;
  611. }
  612. baseDecay_ = MARACA_SYSTEM_DECAY;
  613. baseGain_ = MARACA_GAIN;
  614. soundDecay_ = MARACA_SOUND_DECAY;
  615. decayScale_ = 0.97;
  616. setEqualization( 1.0, -1.0, 0.0 );
  617. }
  618. // Set common algorithm variables.
  619. shakeEnergy_ = 0.0;
  620. sndLevel_ = 0.0;
  621. nObjects_ = baseObjects_;
  622. systemDecay_ = baseDecay_;
  623. currentGain_ = log( nObjects_ ) * baseGain_ / nObjects_;
  624. for ( unsigned int i=0; i<nResonances_; i++ )
  625. setResonance( filters_[i], baseFrequencies_[i], baseRadii_[i] );
  626. }
  627. const StkFloat MAX_SHAKE = 1.0;
  628. void Shakers :: noteOn( StkFloat frequency, StkFloat amplitude )
  629. {
  630. // Yep ... pretty kludgey, but it works!
  631. int noteNumber = (int) ((12 * log(frequency/220.0)/log(2.0)) + 57.01) % 32;
  632. if ( shakerType_ != noteNumber ) this->setType( noteNumber );
  633. shakeEnergy_ += amplitude * MAX_SHAKE * 0.1;
  634. if ( shakeEnergy_ > MAX_SHAKE ) shakeEnergy_ = MAX_SHAKE;
  635. if ( shakerType_==19 || shakerType_==20 ) ratchetCount_ += 1;
  636. }
  637. void Shakers :: noteOff( StkFloat amplitude )
  638. {
  639. shakeEnergy_ = 0.0;
  640. if ( shakerType_==19 || shakerType_==20 ) ratchetCount_ = 0;
  641. }
  642. void Shakers :: controlChange( int number, StkFloat value )
  643. {
  644. #if defined(_STK_DEBUG_)
  645. if ( Stk::inRange( value, 0.0, 128.0 ) == false ) {
  646. oStream_ << "Shakers::controlChange: value (" << value << ") is out of range!";
  647. handleError( StkError::WARNING ); return;
  648. }
  649. #endif
  650. StkFloat normalizedValue = value * ONE_OVER_128;
  651. if ( number == __SK_Breath_ || number == __SK_AfterTouch_Cont_ ) { // 2 or 128 ... energy
  652. if ( shakerType_ == 19 || shakerType_ == 20 ) {
  653. if ( lastRatchetValue_ < 0.0 ) ratchetCount_++;
  654. else ratchetCount_ = (int) fabs(value - lastRatchetValue_);
  655. ratchetDelta_ = baseRatchetDelta_ * ratchetCount_;
  656. lastRatchetValue_ = (int) value;
  657. }
  658. else {
  659. shakeEnergy_ += normalizedValue * MAX_SHAKE * 0.1;
  660. if ( shakeEnergy_ > MAX_SHAKE ) shakeEnergy_ = MAX_SHAKE;
  661. }
  662. }
  663. else if ( number == __SK_ModFrequency_ ) { // 4 ... decay
  664. systemDecay_ = baseDecay_ + ( 2.0 * (normalizedValue - 0.5) * decayScale_ * (1.0 - baseDecay_) );
  665. }
  666. else if ( number == __SK_FootControl_ ) { // 11 ... number of objects
  667. nObjects_ = (StkFloat) ( 2.0 * normalizedValue * baseObjects_ ) + 1.1;
  668. currentGain_ = log( nObjects_ ) * baseGain_ / nObjects_;
  669. }
  670. else if ( number == __SK_ModWheel_ ) { // 1 ... resonance frequency
  671. for ( unsigned int i=0; i<nResonances_; i++ ) {
  672. StkFloat temp = baseFrequencies_[i] * pow( 4.0, normalizedValue-0.5 );
  673. setResonance( filters_[i], temp, baseRadii_[i] );
  674. }
  675. }
  676. else if (number == __SK_ShakerInst_) { // 1071
  677. unsigned int type = (unsigned int) (value + 0.5); // Just to be safe
  678. this->setType( type );
  679. }
  680. #if defined(_STK_DEBUG_)
  681. else {
  682. oStream_ << "Shakers::controlChange: undefined control number (" << number << ")!";
  683. handleError( StkError::WARNING );
  684. }
  685. #endif
  686. }
  687. } // stk namespace