Advertisement
UME14

CS50/PSET3/helpers.c

Jan 10th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. // Helper functions for music
  2.  
  3. #include <cs50.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #include "helpers.h"
  9.  
  10. // Converts a fraction formatted as X/Y to eighths
  11. int duration(string fraction)
  12. {
  13. // TODO
  14. if (fraction[0] == '1')
  15. {
  16. if (fraction[2] == '1')
  17. {
  18. return 8;
  19. }
  20. if (fraction[2] == '2')
  21. {
  22. return 4;
  23. }
  24. if (fraction[2] == '4')
  25. {
  26. return 2;
  27. }
  28. if (fraction[2] == '8')
  29. {
  30. return 1;
  31. }
  32. }
  33. else if (fraction[0] == '3' || fraction[0] == '8')
  34. {
  35. return 3;
  36. }
  37. else
  38. {
  39. return 0;
  40. }
  41. return 0;
  42. }
  43.  
  44. // Calculates frequency (in Hz) of a note
  45. int frequency(string note)
  46. {
  47. //calculate
  48. double freq = 440.00; //hz
  49. int res;
  50.  
  51.  
  52.  
  53. //which Octave
  54. int octave = note[strlen(note) - 1];
  55. octave -= 48;
  56.  
  57.  
  58. //Octave
  59. if (octave == 4)
  60. {
  61. freq *= 1;
  62. }
  63. else if (octave > 4)
  64. {
  65. double temp = octave - 4;
  66. freq = pow(2.00, temp) * 440.00; // or, (2^(temp) * 440);
  67. }
  68. else if (octave < 4)
  69. {
  70. double temp = 4 - octave;
  71. freq = pow(2.00, temp) / 440.00; //or, (2^(temp) / 440);
  72. }
  73.  
  74. //Note
  75. if (note[0] == 'A')
  76. {
  77. freq *= 1;
  78. }
  79. else if (note[0] == 'B')
  80. {
  81. freq *= pow(2.00, (2.00/12));
  82. }
  83. else if (note[0] == 'C')
  84. {
  85. freq /= pow(2.00, (9.00/12));
  86. }
  87. else if (note[0] == 'D')
  88. {
  89. freq /= pow(2.00, (7.00/12));
  90. }
  91. else if (note[0] == 'E')
  92. {
  93. freq /= pow(2.00, (5.00/12));
  94. }
  95. else if (note[0] == 'F')
  96. {
  97. freq /= pow(2.00, (4.00/12));
  98. }
  99. else if (note[0] == 'G')
  100. {
  101. freq /= pow(2.00, (2.00/12));
  102. }
  103.  
  104.  
  105. //Accidentals
  106. if (note[1] == '#')
  107. {
  108. freq *= (pow(2.0, (1.0 / 12.0)));
  109. }
  110. else if (note[1] == 'b')
  111. {
  112. freq /= (pow(2.0, (1.0 / 12.0)));
  113. }
  114.  
  115. res = round(freq);
  116.  
  117. return res;
  118. }
  119.  
  120. // Determines whether a string represents a rest
  121. bool is_rest(string s)
  122. {
  123. // check if rest
  124. if (s == NULL)
  125. {
  126. return true;
  127. }
  128. else
  129. {
  130. return false;
  131. }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement