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.

502 lines
14KB

  1. // Copyright 2014 Olivier Gillet.
  2. //
  3. // Author: Olivier Gillet (ol.gillet@gmail.com)
  4. //
  5. // This program is free software: you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation, either version 3 of the License, or
  8. // (at your option) any later version.
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. #include <cmath>
  16. #include <cstdio>
  17. #include <cstring>
  18. #include <cstdlib>
  19. #include <xmmintrin.h>
  20. #include "elements/dsp/exciter.h"
  21. #include "elements/dsp/part.h"
  22. #include "elements/dsp/resonator.h"
  23. #include "elements/dsp/voice.h"
  24. using namespace elements;
  25. using namespace stmlib;
  26. const uint32_t kSampleRate = 32000;
  27. const uint16_t kAudioBlockSize = 32;
  28. void write_wav_header(FILE* fp, int num_samples, int num_channels) {
  29. uint32_t l;
  30. uint16_t s;
  31. fwrite("RIFF", 4, 1, fp);
  32. l = 36 + num_samples * 2 * num_channels;
  33. fwrite(&l, 4, 1, fp);
  34. fwrite("WAVE", 4, 1, fp);
  35. fwrite("fmt ", 4, 1, fp);
  36. l = 16;
  37. fwrite(&l, 4, 1, fp);
  38. s = 1;
  39. fwrite(&s, 2, 1, fp);
  40. s = num_channels;
  41. fwrite(&s, 2, 1, fp);
  42. l = ::kSampleRate;
  43. fwrite(&l, 4, 1, fp);
  44. l = static_cast<uint32_t>(::kSampleRate) * 2 * num_channels;
  45. fwrite(&l, 4, 1, fp);
  46. s = 2 * num_channels;
  47. fwrite(&s, 2, 1, fp);
  48. s = 16;
  49. fwrite(&s, 2, 1, fp);
  50. fwrite("data", 4, 1, fp);
  51. l = num_samples * 2 * num_channels;
  52. fwrite(&l, 4, 1, fp);
  53. }
  54. void TestResonator() {
  55. FILE* fp = fopen("elements_resonator.wav", "wb");
  56. write_wav_header(fp, ::kSampleRate * 40, 1);
  57. Resonator resonator;
  58. resonator.Init();
  59. resonator.set_frequency(110.0f / ::kSampleRate);
  60. resonator.set_geometry(0.2f);
  61. resonator.set_brightness(0.4f);
  62. resonator.set_damping(0.4f);
  63. resonator.set_position(0.5f);
  64. // resonator.set_resolution(1);
  65. float impulse = 1.0f;
  66. float noise_level = 0.0f;
  67. for (uint32_t i = 0; i < ::kSampleRate * 40; ++i) {
  68. uint16_t tri = (i / 2);
  69. tri = tri > 32767 ? 65535 - tri : tri;
  70. uint16_t tri2 = (i / 25);
  71. tri2 = tri2 > 32767 ? 65535 - tri2 : tri2;
  72. resonator.set_position(tri / 32768.0f);
  73. if (i % (::kSampleRate / 8) == 0 && (rand() % 8 > 2)) {
  74. float frequencies[5] = { 110.0f, 220.0f * powf(2, 3/12.0f), 220.0f, 880.0f, 55.0f };
  75. resonator.set_frequency(frequencies[rand() % 5] / ::kSampleRate);
  76. resonator.set_geometry((rand() % 32768) / 32768.0f);
  77. resonator.set_brightness((rand() % 32768) / 32768.0f);
  78. resonator.set_damping((rand() % 32768) / 32768.0f);
  79. noise_level = (rand() % 4) == 1 ? 1.0f : 0.0f;
  80. if (noise_level) {
  81. resonator.set_damping(0.7f);
  82. resonator.set_brightness((rand() % 32768) / 65535.0f);
  83. } else{
  84. impulse = 1.0f;
  85. }
  86. }
  87. impulse = impulse * 0.99f;
  88. float bow_strength = 0.0f;
  89. float output;
  90. float aux;
  91. float input = impulse;
  92. input += ((rand() % 32768) - 16384) / 65535.0f * noise_level;
  93. resonator.Process(&bow_strength, &input, &output, &aux, 1);
  94. output = output * 32768.0f;
  95. if (output > 32767) output = 32767;
  96. if (output < -32767) output = -32767;
  97. short output_sample = output;
  98. fwrite(&output_sample, sizeof(int16_t), 1, fp);
  99. }
  100. fclose(fp);
  101. }
  102. void TestExciter() {
  103. FILE* fp = fopen("elements_exciter.wav", "wb");
  104. write_wav_header(fp, ::kSampleRate * 10, 4);
  105. float diffuser_buffer[1024];
  106. Exciter exciter;
  107. exciter.Init();
  108. exciter.set_model(EXCITER_MODEL_PLECTRUM);
  109. exciter.set_parameter(0.7f);
  110. exciter.set_timbre(0.5f);
  111. exciter.set_signature(0.1f);
  112. Resonator resonator;
  113. resonator.Init();
  114. resonator.set_frequency(262.0f / ::kSampleRate / 2);
  115. resonator.set_geometry(0.3f);
  116. resonator.set_brightness(0.8f);
  117. resonator.set_damping(0.3f);
  118. resonator.set_position(0.1f);
  119. resonator.set_resolution(48);
  120. bool previous_gate = false;
  121. for (uint32_t i = 0; i < ::kSampleRate * 10; ++i) {
  122. uint16_t tri = (i / 8);
  123. tri = tri > 32767 ? 65535 - tri : tri;
  124. uint16_t tri2 = (i * 1.5);
  125. tri2 = tri2 > 32767 ? 65535 - tri2 : tri2;
  126. bool gate = (i % (::kSampleRate / 2)) < (::kSampleRate / 4);
  127. uint8_t flags = 0;
  128. if (gate) flags |= EXCITER_FLAG_GATE;
  129. if (gate && !previous_gate) flags |= EXCITER_FLAG_RISING_EDGE;
  130. if (!gate && previous_gate) flags |= EXCITER_FLAG_FALLING_EDGE;
  131. previous_gate = gate;
  132. exciter.set_parameter(tri / 32768.0f);
  133. // exciter.set_timbre(tri / 32768.0f);
  134. float bow_strength = 0.0f;
  135. float output[4];
  136. short output_sample[4];
  137. exciter.Process(flags, &output[0], 1);
  138. // output[0] *= 0.15;
  139. output[1] = exciter.damping();
  140. resonator.Process(&bow_strength, &output[0], &output[2], &output[3], 1);
  141. for (int j = 0; j < 4; ++j) {
  142. output[j] *= 32767.0f;
  143. if (output[j] > 32767) output[j] = 32767;
  144. if (output[j] < -32767) output[j] = -32767;
  145. output_sample[j] = output[j];
  146. }
  147. fwrite(output_sample, sizeof(int16_t), 4, fp);
  148. }
  149. fclose(fp);
  150. }
  151. void TestVoice() {
  152. FILE* fp = fopen("elements_voice.wav", "wb");
  153. write_wav_header(fp, ::kSampleRate * 20, 4);
  154. Voice voice;
  155. Patch p;
  156. p.exciter_envelope_shape = 0.95f;
  157. p.exciter_bow_level = 0.5f;
  158. p.exciter_bow_timbre = 0.6f;
  159. p.exciter_blow_level = 0.0f;
  160. p.exciter_blow_meta = 0.5f;
  161. p.exciter_blow_timbre = 0.2f;
  162. p.exciter_strike_level = 0.0f;
  163. p.exciter_strike_meta = 0.5f;
  164. p.exciter_strike_timbre = 0.5f;
  165. p.resonator_geometry = 0.2f;
  166. p.resonator_brightness = 0.9f;
  167. p.resonator_damping = 0.3f;
  168. p.resonator_position = 0.3f;
  169. voice.Init();
  170. for (uint32_t i = 0; i < ::kSampleRate * 20; ++i) {
  171. uint16_t tri = (i / 8);
  172. tri = tri > 32767 ? 65535 - tri : tri;
  173. p.resonator_damping = tri / 32768.0;
  174. bool gate = (i % (::kSampleRate * 4)) < (::kSampleRate * 2);
  175. float blow_in = 0.0f;
  176. float strike_in = 0.0f;
  177. float raw_out = 0.0f;
  178. float center = 0.0f;
  179. float sides = 0.0f;
  180. voice.Process(
  181. p,
  182. 262.0f / ::kSampleRate / 2.0f,
  183. 1.0f,
  184. gate,
  185. &blow_in,
  186. &strike_in,
  187. &raw_out,
  188. &center,
  189. &sides, 1);
  190. float output[4];
  191. short output_sample[4];
  192. output[0] = center + (sides) * 0.5f;
  193. output[1] = center - (sides) * 0.5f;
  194. output[2] = center;
  195. output[3] = raw_out;
  196. for (int j = 0; j < 4; ++j) {
  197. output[j] *= 32767.0f * (j != 3 ? 0.5f : 1.0f);
  198. if (output[j] > 32767) output[j] = 32767;
  199. if (output[j] < -32767) output[j] = -32767;
  200. output_sample[j] = output[j];
  201. }
  202. fwrite(output_sample, sizeof(int16_t), 4, fp);
  203. }
  204. fclose(fp);
  205. }
  206. void TestPart() {
  207. FILE* fp = fopen("elements_part.wav", "wb");
  208. write_wav_header(fp, ::kSampleRate * 20, 2);
  209. uint16_t reverb_buffer[32768];
  210. Part part;
  211. part.Init(reverb_buffer);
  212. Patch* p = part.mutable_patch();
  213. p->exciter_envelope_shape = 0.0f;
  214. p->exciter_bow_level = 0.0f;
  215. p->exciter_bow_timbre = 0.0f;
  216. p->exciter_blow_level = 0.0f;
  217. p->exciter_blow_meta = 0.0f;
  218. p->exciter_blow_timbre = 0.0f;
  219. p->exciter_strike_level = 0.5f;
  220. p->exciter_strike_meta = 0.5f;
  221. p->exciter_strike_timbre = 0.3f;
  222. p->resonator_geometry = 0.4f;
  223. p->resonator_brightness = 0.7f;
  224. p->resonator_damping = 0.8f;
  225. p->resonator_position = 0.3f;
  226. p->space = 0.1f;
  227. // p->exciter_envelope_shape = 0.99f;
  228. // p->exciter_bow_level = 0.0f;
  229. // p->exciter_bow_timbre = 0.6f;
  230. // p->exciter_blow_level = 0.0f;
  231. // p->exciter_blow_meta = 0.0f;
  232. // p->exciter_blow_timbre = 0.0f;
  233. // p->exciter_strike_level = 0.6f;
  234. // p->exciter_strike_meta = 0.5f;
  235. // p->exciter_strike_timbre = 0.5f;
  236. // p->resonator_geometry = 0.85f;
  237. // p->resonator_brightness = 1.0f;
  238. // p->resonator_damping = 0.6f;
  239. // p->resonator_position = 0.3f;
  240. // p->space = 0.1f;
  241. // p->exciter_envelope_shape = 0.0f;
  242. // p->exciter_bow_level = 0.0f;
  243. // p->exciter_bow_timbre = 0.5f;
  244. // p->exciter_blow_level = 0.0f;
  245. // p->exciter_blow_meta = 0.0f;
  246. // p->exciter_blow_timbre = 0.5f;
  247. // p->exciter_strike_level = 1.0f;
  248. // p->exciter_strike_meta = 0.2f;
  249. // p->exciter_strike_timbre = 0.6f;
  250. // p->resonator_geometry = 0.25f;
  251. // p->resonator_brightness = 0.3f;
  252. // p->resonator_damping = 0.5f;
  253. // p->resonator_position = 0.4f;
  254. // p->space = 1.0;
  255. // p->exciter_envelope_shape = 0.99f;
  256. // p->exciter_bow_level = 0.6f;
  257. // p->exciter_bow_timbre = 0.6f;
  258. // p->exciter_blow_level = 0.0f;
  259. // p->exciter_blow_meta = 0.0f;
  260. // p->exciter_blow_timbre = 0.0f;
  261. // p->exciter_strike_level = 0.0f;
  262. // p->exciter_strike_meta = 0.0f;
  263. // p->exciter_strike_timbre = 0.0f;
  264. // p->resonator_geometry = 0.25f;
  265. // p->resonator_brightness = 0.8f;
  266. // p->resonator_damping = 0.3f;
  267. // p->resonator_position = 0.3f;
  268. // p->space = 0.9f;
  269. float sequence[] = { 69.0f, 57.0f, 45.0f, 57.0f, 69.0f };
  270. // float sequence[] = { 19, 19, 19, 19, 19 };
  271. int sequence_counter = -1;
  272. float silence[16];
  273. std::fill(&silence[0], &silence[16], 0.0f);
  274. for (uint32_t i = 0; i < ::kSampleRate * 20; i += 16) {
  275. uint16_t tri = (i * 1);
  276. tri = tri > 32767 ? 65535 - tri : tri;
  277. uint16_t tri2 = (i / 6);
  278. tri2 = tri2 > 32767 ? 65535 - tri2 : tri2;
  279. float main[16];
  280. float aux[16];
  281. // p->resonator_position = int(256.0f * tri / 32768.0f) / 256.0f;
  282. // p->resonator_geometry = 0.5f + 0.5f * tri / 32768.0f;
  283. //p->exciter_strike_meta = 0.0f + 1.0f * tri / 32768.0f;
  284. if (i % (::kSampleRate * 2) == 0) {
  285. sequence_counter = (sequence_counter + 1) % 5;
  286. }
  287. PerformanceState performance;
  288. performance.note = sequence[sequence_counter] - 12.0f;
  289. performance.modulation = 0.0f; /*i & 16 ? 60.0f : -60.0f;
  290. if (i > ::kSampleRate * 5) {
  291. performance.modulation = 0;
  292. }*/
  293. performance.strength = 0.5f;
  294. performance.gate = (i % (::kSampleRate / 1)) < (::kSampleRate / 2);
  295. part.Process(performance, silence, silence, main, aux, 16);
  296. for (size_t j = 0; j < 16; ++j) {
  297. float output[2];
  298. short output_sample[2];
  299. output[0] = main[j];
  300. output[1] = aux[j];
  301. for (int k = 0; k < 2; ++k) {
  302. output[k] *= 32767.0f;
  303. if (output[k] > 32767) output[k] = 32767;
  304. if (output[k] < -32767) output[k] = -32767;
  305. output_sample[k] = output[k];
  306. }
  307. fwrite(output_sample, sizeof(int16_t), 2, fp);
  308. }
  309. }
  310. fclose(fp);
  311. }
  312. void TestEasterEgg() {
  313. FILE* fp = fopen("elements_easter_egg.wav", "wb");
  314. write_wav_header(fp, ::kSampleRate * 20, 2);
  315. uint16_t reverb_buffer[32768];
  316. Part part;
  317. part.Init(reverb_buffer);
  318. Patch* p = part.mutable_patch();
  319. part.set_easter_egg(true);
  320. // p->exciter_envelope_shape = 1.0f;
  321. // p->exciter_bow_level = 0.0f;
  322. // p->exciter_bow_timbre = 1.0f;
  323. // p->exciter_blow_level = 0.0f;
  324. // p->exciter_blow_meta = 0.27f;
  325. // p->exciter_blow_timbre = 0.3f;
  326. // p->exciter_strike_level = 1.0f;
  327. // p->exciter_strike_meta = 0.5f;
  328. // p->exciter_strike_timbre = 0.8f;
  329. // p->resonator_geometry = 0.3f;
  330. // p->resonator_brightness = 0.2f;
  331. // p->resonator_damping = 0.9f;
  332. // p->resonator_position = 0.0f;
  333. // p->space = 0.5f;
  334. p->exciter_envelope_shape = 0.2f;
  335. p->exciter_bow_level = 0.52f;
  336. p->exciter_bow_timbre = 0.8f;
  337. p->exciter_blow_level = 0.5f;
  338. p->exciter_blow_meta = 0.5f;
  339. p->exciter_blow_timbre = 0.0f;
  340. p->exciter_strike_level = 0.0f;
  341. p->exciter_strike_meta = 0.83f;
  342. p->exciter_strike_timbre = 0.5f;
  343. p->resonator_geometry = 0.0f;
  344. p->resonator_brightness = 1.0f;
  345. p->resonator_damping = 0.0f;
  346. p->resonator_position = 0.0f;
  347. p->space = 0.2f;
  348. float sequence[] = { 69.0f, 57.0f, 45.0f, 57.0f, 55.0f };
  349. int sequence_counter = -1;
  350. float silence[16];
  351. std::fill(&silence[0], &silence[16], 0.0f);
  352. for (uint32_t i = 0; i < ::kSampleRate * 20; i += 16) {
  353. uint16_t tri = (i / 2);
  354. tri = tri > 32767 ? 65535 - tri : tri;
  355. uint16_t tri2 = (i * 3);
  356. tri2 = tri2 > 32767 ? 65535 - tri2 : tri2;
  357. float main[16];
  358. float aux[16];
  359. // p->exciter_blow_meta = 0.5f + 0.5f * (tri / 32768.0f);
  360. // p->resonator_brightness = 0.0f + 1.0f * tri2 / 32768.0f;
  361. // p->resonator_position = 0.0f + 0.3f * tri / 32768.0f;
  362. // p->resonator_brightness = 0.0f + 1.0f * tri2 / 32768.0f;
  363. if (i % (::kSampleRate / 2) == 0) {
  364. sequence_counter = (sequence_counter + 1) % 5;
  365. }
  366. PerformanceState performance;
  367. //performance.note = sequence[sequence_counter] - 12;
  368. performance.note = 96.0f + (tri / 32768.0f) * 48.0;
  369. performance.modulation = 0.0f;
  370. performance.strength = 1.0f;
  371. performance.gate = true; // (i % (::kSampleRate / 2)) < (::kSampleRate / 4);
  372. part.Process(performance, silence, silence, main, aux, 16);
  373. for (size_t j = 0; j < 16; ++j) {
  374. float output[2];
  375. short output_sample[2];
  376. output[0] = main[j];
  377. output[1] = aux[j];
  378. for (int k = 0; k < 2; ++k) {
  379. output[k] *= 32767.0f;
  380. if (output[k] > 32767) output[k] = 32767;
  381. if (output[k] < -32767) output[k] = -32767;
  382. output_sample[k] = output[k];
  383. }
  384. fwrite(output_sample, sizeof(int16_t), 2, fp);
  385. }
  386. }
  387. fclose(fp);
  388. }
  389. void TestFilterAccuracy() {
  390. Svf f;
  391. for (int i = 0; i < 128; ++i) {
  392. float midi_note = i / 1.0f;
  393. float frequency = 440.0f * powf(2.0f, (midi_note - 69.0f) / 12.0f);
  394. frequency /= ::kSampleRate;
  395. float g[4];
  396. f.set_f_q<FREQUENCY_EXACT>(frequency, 0.5f);
  397. g[0] = f.g();
  398. f.set_f_q<FREQUENCY_ACCURATE>(frequency, 0.5f);
  399. g[1] = f.g();
  400. f.set_f_q<FREQUENCY_FAST>(frequency, 0.5f);
  401. g[2] = f.g();
  402. f.set_f_q<FREQUENCY_DIRTY>(frequency, 0.5f);
  403. g[3] = f.g();
  404. printf("Frequency: %f", frequency * ::kSampleRate);
  405. for (int j = 0; j < 4; ++j) {
  406. float error_cts = logf(atanf(g[j]) / M_PI / frequency) / logf(2) * 1200;
  407. printf("\t%.2f", error_cts);
  408. }
  409. printf("\n");
  410. }
  411. }
  412. int main(void) {
  413. _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
  414. // TestFilterAccuracy();
  415. TestPart();
  416. // TestExciter();
  417. // TestResonator();
  418. // TestEasterEgg();
  419. }