Created
March 4, 2018 17:32
-
-
Save chrisdel101/dff1973c3f27cbaf1cb695ccfaf5cc6b to your computer and use it in GitHub Desktop.
Messy, as it's not the final draft
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Helper functions for music | |
#include <cs50.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <ctype.h> | |
#include <math.h> | |
#include "helpers.h" | |
int duration(string fraction) | |
{ | |
int nom; | |
int denom; | |
int eights; | |
switch(fraction[0]){ | |
case '1': | |
nom = 1; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '2': | |
nom = 2; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '3': | |
nom = 3; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '4': | |
nom = 4; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '5': | |
nom = 5; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '6': | |
nom = 6; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '7': | |
nom = 7; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
case '8': | |
nom = 8; | |
// printf("non reassinged: %i\n", nom); | |
break; | |
} | |
switch(fraction[2]){ | |
case '1': | |
denom = 1; | |
// printf("whole"); | |
// return 8; | |
break; | |
case '2': | |
denom = 2; | |
// printf("half"); | |
// return 4; | |
break; | |
case '4': | |
denom = 4; | |
// printf("denom quarter %i\n", denom); | |
// return 2; | |
break; | |
case '8': | |
denom = 8; | |
// printf("denom eighth %i\n", denom); | |
// return 1; | |
break; | |
} | |
switch(denom){ | |
case 1: | |
eights = 8; | |
// printf("eights: %i\n", eights); | |
break; | |
case 2: | |
eights = nom * 4; | |
// printf("eights: %i\n", eights); | |
break; | |
case 4: | |
eights = nom * 2; | |
// printf("eights: %i\n", eights); | |
break; | |
case 8: | |
eights = nom * 1; | |
// printf("eights: %i\n", eights); | |
break; | |
} | |
// printf("nom/denom %i\n ", (nom +denom) ); | |
return eights; | |
} | |
// // Calculates frequency (in Hz) of a note | |
int frequency(string note) | |
{ | |
int letter; | |
int octave = 0; | |
float semitone = 0; | |
int initfreq = 440.0; | |
float freq = 0; | |
// bool double_sharp = false; | |
// bool double_flat = false; | |
bool sharp = false; | |
bool flat = false; | |
for(int i = 0;i < strlen(note); i++){ | |
if(note[i] == 'b'){ | |
flat = true; | |
} else if((isalpha(note[i])) && (note[i] != 'b')){ | |
letter = note[i]; | |
} else if(note[i] == '#'){ | |
sharp = true; | |
} else if(isdigit(note[i])){ | |
octave = note[i]; | |
} else { | |
printf("%c is not valid", note[i]); | |
return 1; | |
} | |
} | |
// printf("%c\n%c\n", letter, octave); | |
// // printf("sharp: %s", sharp ? "true" : "false"); | |
// printf("flat: %s", flat ? "true" : "false"); | |
// attempt to use function | |
// getter(letter,sharp, flat,initfreq,semitone,freq); | |
// int getter(int letter bool sharp bool flat int initfreq int semitone){ | |
switch(letter){ | |
case 'A': | |
if(flat == true){ | |
semitone = -1.0; | |
} else if(sharp){ | |
semitone = 1.0; | |
} else { | |
semitone = 0; | |
} | |
break; | |
case 'B': | |
if(flat == true){ | |
semitone = 1.0; | |
} else if(sharp){ | |
semitone = 3.0; | |
} else { | |
semitone = 2.0; | |
} | |
break; | |
case 'C': | |
if(flat == true){ | |
semitone = -10.0; | |
} else if(sharp){ | |
semitone = -8.0; | |
} else { | |
semitone = -9.0; | |
} | |
break; | |
case 'D': | |
if(flat == true){ | |
semitone = -8.0; | |
} else if(sharp){ | |
semitone = -6.0; | |
} else { | |
semitone = -7.0; | |
} | |
break; | |
case 'E': | |
if(flat == true){ | |
semitone = -6.0; | |
} else if(sharp){ | |
semitone = -4.0; | |
} else { | |
semitone = -5.0; | |
} | |
break; | |
case 'F': | |
if(flat == true){ | |
semitone = -5.0; | |
} else if(sharp){ | |
semitone = -3.0; | |
} else { | |
semitone = -4.0; | |
} | |
break; | |
case 'G': | |
if(flat == true){ | |
semitone = -3.0; | |
} else if(sharp){ | |
semitone = -1.0; | |
} else { | |
semitone = -2.0; | |
} | |
break; | |
} | |
// print semitone | |
// printf("semitones: %f\n", semitone); | |
// printf("octave: %c\n", octave); | |
// get frequency | |
// printf("no octave:%i\n", freq); | |
// if(letter == 'A'){ | |
// ///440 | |
// if(sharp == true){ | |
// freq = round(initfreq * pow(2.0, 1.0/12)); | |
// } else if(flat == true){ | |
// freq = round(initfreq / pow(2.0, 1.0/12)); | |
// } else{ | |
// freq = initfreq; | |
// } | |
// } else if(letter != 'A') { | |
// // B | |
// } | |
freq = initfreq * pow(2.0, semitone/12.0); | |
switch(octave){ | |
case '1': | |
freq = ((freq / 2.0) / 2.0) / 2.0; | |
break; | |
case '2': | |
freq = (freq / 2.0) / 2.0; | |
break; | |
case '3': | |
freq = freq / 2.0; | |
break; | |
case '4': | |
freq = freq * 1; | |
break; | |
case '5': | |
freq = freq * 2.0; | |
break; | |
case '6': | |
freq = (freq * 2.0) * 2.0; | |
break; | |
case '7': | |
freq = ((freq * 2.0) * 2.0) * 2.0; | |
break; | |
} | |
// printf("%i", freq); | |
freq = round(freq); | |
return freq; | |
} | |
// Determines whether a string represents a rest | |
bool is_rest(string s) | |
{ | |
// s = get_string("Input: "); | |
// not a rest | |
if(s[0] != '\0'){ | |
// printf("false"); | |
return false; | |
} else { | |
// a rest | |
// printf("true"); | |
return true; | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment