Guest User

Untitled

a guest
Mar 14th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. // Helper functions for music
  2.  
  3. #include <cs50.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #include <math.h>
  9. #include "helpers.h"
  10.  
  11. int duration(string fraction)
  12. {
  13. int nom;
  14. int denom;
  15. int eights;
  16. switch(fraction[0]){
  17. case '1':
  18. nom = 1;
  19. // printf("non reassinged: %i\n", nom);
  20. break;
  21. case '2':
  22. nom = 2;
  23. // printf("non reassinged: %i\n", nom);
  24. break;
  25. case '3':
  26. nom = 3;
  27. // printf("non reassinged: %i\n", nom);
  28. break;
  29. case '4':
  30. nom = 4;
  31. // printf("non reassinged: %i\n", nom);
  32. break;
  33. case '5':
  34. nom = 5;
  35. // printf("non reassinged: %i\n", nom);
  36. break;
  37. case '6':
  38. nom = 6;
  39. // printf("non reassinged: %i\n", nom);
  40. break;
  41. case '7':
  42. nom = 7;
  43. // printf("non reassinged: %i\n", nom);
  44. break;
  45. case '8':
  46. nom = 8;
  47. // printf("non reassinged: %i\n", nom);
  48. break;
  49.  
  50. }
  51.  
  52. switch(fraction[2]){
  53. case '1':
  54. denom = 1;
  55. // printf("whole");
  56. // return 8;
  57. break;
  58. case '2':
  59. denom = 2;
  60. // printf("half");
  61. // return 4;
  62. break;
  63. case '4':
  64. denom = 4;
  65. // printf("denom quarter %i\n", denom);
  66. // return 2;
  67. break;
  68. case '8':
  69. denom = 8;
  70. // printf("denom eighth %i\n", denom);
  71. // return 1;
  72. break;
  73.  
  74. }
  75. switch(denom){
  76. case 1:
  77. eights = 8;
  78. // printf("eights: %i\n", eights);
  79. break;
  80. case 2:
  81. eights = nom * 4;
  82. // printf("eights: %i\n", eights);
  83. break;
  84. case 4:
  85. eights = nom * 2;
  86. // printf("eights: %i\n", eights);
  87. break;
  88. case 8:
  89. eights = nom * 1;
  90. // printf("eights: %i\n", eights);
  91. break;
  92. }
  93.  
  94. // printf("nom/denom %i\n ", (nom +denom) );
  95. return eights;
  96. }
  97.  
  98. // // Calculates frequency (in Hz) of a note
  99. int frequency(string note)
  100. {
  101. int letter;
  102. int octave = 0;
  103. float semitone = 0;
  104. int initfreq = 440.0;
  105. float freq = 0;
  106. // bool double_sharp = false;
  107. // bool double_flat = false;
  108. bool sharp = false;
  109. bool flat = false;
  110.  
  111. for(int i = 0;i < strlen(note); i++){
  112. if(note[i] == 'b'){
  113. flat = true;
  114. } else if((isalpha(note[i])) && (note[i] != 'b')){
  115. letter = note[i];
  116. } else if(note[i] == '#'){
  117. sharp = true;
  118. } else if(isdigit(note[i])){
  119. octave = note[i];
  120. } else {
  121. printf("%c is not valid", note[i]);
  122. return 1;
  123. }
  124. }
  125.  
  126. // printf("%c\n%c\n", letter, octave);
  127. // // printf("sharp: %s", sharp ? "true" : "false");
  128. // printf("flat: %s", flat ? "true" : "false");
  129.  
  130. // attempt to use function
  131. // getter(letter,sharp, flat,initfreq,semitone,freq);
  132. // int getter(int letter bool sharp bool flat int initfreq int semitone){
  133.  
  134.  
  135. switch(letter){
  136. case 'A':
  137. if(flat == true){
  138. semitone = -1.0;
  139. } else if(sharp){
  140. semitone = 1.0;
  141. } else {
  142. semitone = 0;
  143. }
  144. break;
  145. case 'B':
  146. if(flat == true){
  147. semitone = 1.0;
  148. } else if(sharp){
  149. semitone = 3.0;
  150. } else {
  151. semitone = 2.0;
  152. }
  153. break;
  154. case 'C':
  155. if(flat == true){
  156. semitone = -10.0;
  157. } else if(sharp){
  158. semitone = -8.0;
  159. } else {
  160. semitone = -9.0;
  161. }
  162. break;
  163. case 'D':
  164. if(flat == true){
  165. semitone = -8.0;
  166. } else if(sharp){
  167. semitone = -6.0;
  168. } else {
  169. semitone = -7.0;
  170. }
  171. break;
  172. case 'E':
  173. if(flat == true){
  174. semitone = -6.0;
  175. } else if(sharp){
  176. semitone = -4.0;
  177. } else {
  178. semitone = -5.0;
  179. }
  180. break;
  181. case 'F':
  182. if(flat == true){
  183. semitone = -5.0;
  184. } else if(sharp){
  185. semitone = -3.0;
  186. } else {
  187. semitone = -4.0;
  188. }
  189. break;
  190. case 'G':
  191. if(flat == true){
  192. semitone = -3.0;
  193. } else if(sharp){
  194. semitone = -1.0;
  195. } else {
  196. semitone = -2.0;
  197. }
  198. break;
  199. }
  200. // print semitone
  201. // printf("semitones: %f\n", semitone);
  202. // printf("octave: %c\n", octave);
  203.  
  204.  
  205. // get frequency
  206. // printf("no octave:%i\n", freq);
  207.  
  208. // if(letter == 'A'){
  209. // ///440
  210. // if(sharp == true){
  211. // freq = round(initfreq * pow(2.0, 1.0/12));
  212. // } else if(flat == true){
  213. // freq = round(initfreq / pow(2.0, 1.0/12));
  214. // } else{
  215. // freq = initfreq;
  216. // }
  217. // } else if(letter != 'A') {
  218. // // B
  219. // }
  220. freq = initfreq * pow(2.0, semitone/12.0);
  221.  
  222. switch(octave){
  223.  
  224. case '1':
  225. freq = ((freq / 2.0) / 2.0) / 2.0;
  226. break;
  227. case '2':
  228. freq = (freq / 2.0) / 2.0;
  229. break;
  230. case '3':
  231. freq = freq / 2.0;
  232. break;
  233. case '4':
  234. freq = freq * 1;
  235. break;
  236. case '5':
  237. freq = freq * 2.0;
  238. break;
  239. case '6':
  240. freq = (freq * 2.0) * 2.0;
  241. break;
  242. case '7':
  243. freq = ((freq * 2.0) * 2.0) * 2.0;
  244. break;
  245. }
  246. // printf("%i", freq);
  247. freq = round(freq);
  248. return freq;
  249.  
  250. }
  251.  
  252. // Determines whether a string represents a rest
  253. bool is_rest(string s)
  254. {
  255. // s = get_string("Input: ");
  256. // not a rest
  257. if(s[0] != '\0'){
  258. // printf("false");
  259. return false;
  260. } else {
  261. // a rest
  262. // printf("true");
  263. return true;
  264. }
  265. return false;
  266. }
Add Comment
Please, Sign In to add comment