Skip to content

Instantly share code, notes, and snippets.

@chrisdel101
Created March 4, 2018 17:32
Show Gist options
  • Save chrisdel101/dff1973c3f27cbaf1cb695ccfaf5cc6b to your computer and use it in GitHub Desktop.
Save chrisdel101/dff1973c3f27cbaf1cb695ccfaf5cc6b to your computer and use it in GitHub Desktop.
Messy, as it's not the final draft
// 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