Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Helper functions for music
- #include <cs50.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- #include "helpers.h"
- // Converts a fraction formatted as X/Y to eighths
- int duration(string fraction)
- {
- // TODO
- if (fraction[0] == '1')
- {
- if (fraction[2] == '1')
- {
- return 8;
- }
- if (fraction[2] == '2')
- {
- return 4;
- }
- if (fraction[2] == '4')
- {
- return 2;
- }
- if (fraction[2] == '8')
- {
- return 1;
- }
- }
- else if (fraction[0] == '3' || fraction[0] == '8')
- {
- return 3;
- }
- else
- {
- return 0;
- }
- return 0;
- }
- // Calculates frequency (in Hz) of a note
- int frequency(string note)
- {
- //calculate
- double freq = 440.00; //hz
- int res;
- //which Octave
- int octave = note[strlen(note) - 1];
- octave -= 48;
- //Octave
- if (octave == 4)
- {
- freq *= 1;
- }
- else if (octave > 4)
- {
- double temp = octave - 4;
- freq = pow(2.00, temp) * 440.00; // or, (2^(temp) * 440);
- }
- else if (octave < 4)
- {
- double temp = 4 - octave;
- freq = pow(2.00, temp) / 440.00; //or, (2^(temp) / 440);
- }
- //Note
- if (note[0] == 'A')
- {
- freq *= 1;
- }
- else if (note[0] == 'B')
- {
- freq *= pow(2.00, (2.00/12));
- }
- else if (note[0] == 'C')
- {
- freq /= pow(2.00, (9.00/12));
- }
- else if (note[0] == 'D')
- {
- freq /= pow(2.00, (7.00/12));
- }
- else if (note[0] == 'E')
- {
- freq /= pow(2.00, (5.00/12));
- }
- else if (note[0] == 'F')
- {
- freq /= pow(2.00, (4.00/12));
- }
- else if (note[0] == 'G')
- {
- freq /= pow(2.00, (2.00/12));
- }
- //Accidentals
- if (note[1] == '#')
- {
- freq *= (pow(2.0, (1.0 / 12.0)));
- }
- else if (note[1] == 'b')
- {
- freq /= (pow(2.0, (1.0 / 12.0)));
- }
- res = round(freq);
- return res;
- }
- // Determines whether a string represents a rest
- bool is_rest(string s)
- {
- // check if rest
- if (s == NULL)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement