logo

bytemedia

Home to byte-level sounds, images, videos, … git clone https://hacktivis.me/git/bytemedia.git

kagome_kagome_clarinet.c (3890B)


  1. //#define _POSIX_C_SOURCE 200809L
  2. #define _XOPEN_SOURCE 700
  3. #include <stdio.h>
  4. #include <inttypes.h> // uint32_t
  5. #include <math.h> // sinf(), M_PI, pow()
  6. #include <stdlib.h> // abort()
  7. #include "au.h"
  8. // https://pages.mtu.edu/~suits/NoteFreqCalcs.html
  9. #define TWELTH_ROOT_2 1.059463094359
  10. double
  11. note_to_hertz(double ref_tune, int steps) {
  12. return ref_tune*pow(TWELTH_ROOT_2,steps);
  13. }
  14. void
  15. sin_note(int dur, struct au_header *header, int hertz, float volume, float delay) {
  16. char buf[4];
  17. for(int t = 0;t<dur;t++) {
  18. //putchar((uint8_t)(sinf((delay + t) * 2*M_PI*hertz/header->samplerate) * volume) % 210);
  19. float w1 = 2*M_PI*hertz/header->samplerate;
  20. // https://pages.mtu.edu/~suits/clarinet.html
  21. float tune = sin(w1*t) + 0.75*sin(3*w1*t) + 0.5*sin(5*w1*t) + 0.14*sin(7*w1*t) + 0.5*sin(9*w1*t) + 0.12*sin(11*w1*t) + 0.17*sin(13*w1*t);
  22. putchar((uint8_t)(tune * volume));
  23. }
  24. }
  25. #if 0
  26. void
  27. note(int dur, int pitch) {
  28. for(int t = 0;t<dur;t++) {
  29. putchar( t*pitch );
  30. }
  31. }
  32. #else
  33. #define REF_TUNE 440/4
  34. #define VOLUME 60
  35. #define note(dur,pitch) sin_note(dur, header, note_to_hertz(REF_TUNE, pitch-8), VOLUME, 0)
  36. #endif
  37. void
  38. silence(int dur) {
  39. for(int t = 0;t<dur;t++)putchar( 0x00 );
  40. }
  41. void
  42. kagome_kagome(struct au_header *header) {
  43. int tick = header->samplerate / 1.9;
  44. //int note = tick * 0.99;
  45. //int gap = tick * 0.01;
  46. int note = tick;
  47. int gap = 0;
  48. note(note*2, 8); silence(gap*2);
  49. note(note*1, 8); silence(gap);
  50. note(note*1, 9); silence(gap);
  51. // ----
  52. note(note*1, 8); silence(gap);
  53. note(note*1, 8); silence(gap);
  54. note(note*1, 8); silence(gap);
  55. silence(tick*1);
  56. // ----
  57. note(note*1, 8); silence(gap);
  58. note(note/2, 8); silence(gap/2);
  59. note(note/2, 8); silence(gap/2);
  60. note(note*1, 8); silence(gap);
  61. note(note/2, 7); silence(gap/2);
  62. note(note/2, 7); silence(gap/2);
  63. // ----
  64. note(note*1, 8); silence(gap);
  65. note(note/2, 8); silence(gap/2);
  66. note(note/2, 7); silence(gap/2);
  67. note(note*1, 5); silence(gap);
  68. silence(tick*1);
  69. // ----
  70. note(note, 8); silence(gap);
  71. note(note, 7); silence(gap);
  72. note(note, 8); silence(gap);
  73. note(note, 7); silence(gap);
  74. // ----
  75. note(note*1, 8); silence(gap);
  76. note(note/2, 8); silence(gap/2);
  77. note(note/2, 7); silence(gap/2);
  78. note(note*1, 5); silence(gap);
  79. silence(tick*1);
  80. // ----
  81. note(note*1, 8); silence(gap);
  82. note(note*1, 8); silence(gap);
  83. note(note*1, 8); silence(gap);
  84. note(note*1, 9); silence(gap);
  85. // ----
  86. note(note*1, 8); silence(gap);
  87. note(note*1, 8); silence(gap);
  88. note(note*1, 8); silence(gap);
  89. silence(tick*1);
  90. // ----
  91. note(note*1, 8); silence(gap);
  92. note(note/2, 7); silence(gap/2);
  93. note(note/2, 7); silence(gap/2);
  94. note(note*1, 8); silence(gap);
  95. note(note/2, 7); silence(gap/2);
  96. note(note/2, 7); silence(gap/2);
  97. // ----
  98. note(note*1, 8); silence(gap);
  99. note(note*1, 8); silence(gap);
  100. note(note*1, 5); silence(gap);
  101. silence(tick*1);
  102. // ----
  103. note(note/2, 8); silence(gap/2);
  104. note(note/2, 8); silence(gap/2);
  105. note(note/2, 8); silence(gap/2);
  106. note(note/2, 8); silence(gap/2);
  107. note(note*1, 8); silence(gap);
  108. note(note*1, 9); silence(gap);
  109. // ----
  110. note(tick*1, 8); // silence(gap);
  111. note(note*1, 7); silence(gap);
  112. note(note*1, 8); silence(gap);
  113. silence(tick*1);
  114. }
  115. int
  116. main(void)
  117. {
  118. // Use AU defaults
  119. struct au_header header = {
  120. .offset = 24, // no-annotation, in octets
  121. .length = 0xFFFFFFFF, // unknown data size
  122. //.encoding = AU_ENCODING_32B_FPCM,
  123. .encoding = 02,
  124. .samplerate = 48000, // Hz
  125. .channels = 1
  126. };
  127. // fd 1 is stdout
  128. write_au_header(1, &header);
  129. kagome_kagome(&header);
  130. // dur pt vol del
  131. //sin_note(header.samplerate, &header, 440, 150, 0);
  132. //sin_note(header.samplerate/2, &header, note_to_hertz(440, 0), 150, 0);
  133. //sin_note(header.samplerate/4, &header, note_to_hertz(440, 1), 150, 0);
  134. //sin_note(header.samplerate/4, &header, note_to_hertz(440, 1), 150, 0);
  135. return 0;
  136. }