diff --git a/src/.DS_Store b/src/.DS_Store index a262e39..385d2ba 100644 Binary files a/src/.DS_Store and b/src/.DS_Store differ diff --git a/src/Generators/generate_lullaby.m b/src/Generators/generate_lullaby.m new file mode 100644 index 0000000..83df45d --- /dev/null +++ b/src/Generators/generate_lullaby.m @@ -0,0 +1,66 @@ +function x = generate_lullaby(amplitude, frequency, phase, fs, duration, duty) + % Generates sine waves that play 'twinkle twinkle little star' + % by using the frequency parameter as the root note for the melody. + % Currently the duty and duration parameters are not used within the + % function as there is no need for the former and it is currently + % difficult to constrain the melody duration based on user input. + % A function such as this one could be useful as a demo for what a + % melody sounds like on a synthesizer, and could even find use + % in toys designed to help small children sleep. + + % CONTRIBUTORS: + % generate_lullaby created by Gabriel Diaz + + % DOCUMENTATION: + % phase shift is in number of periods + % fs is the sampling frequency: how many sample points per second + % duration is time in seconds + % duty is a number between 0 and 1 + + %NOTE: whatever's passed as the duration parameter doesn't get used at + %the moment, since it's currently difficult to sync every note in the + %melody to play in shorter duartions such that the entire song lasts about + %as long as 'duration' + duration = 0; + duty = 0; %duty also isn't used in this function + + %current durations that the song will work with + note_duration = 0.4; + song_duration = note_duration * 48; + + %frequency multiples for all notes in melody, assuming that frequency is + %the root note of this chord: + maj_second_freq = frequency * 1.125; + maj_third_freq = frequency * 1.25; + fourth_freq = frequency * 1.33; + fifth_freq = frequency * 1.5; + maj_sixth_freq = frequency * 1.7; + + % initialize local variables from input arguments + n = fs * note_duration; % number of samples (length of matrix) + dt = 1 / fs; % sampling period: time between two sample points + t = [1:n].*dt - phase; %initialize time scale template + + %sine waves for every note in 'frequency's' respective major scale: + first = amplitude * sin(2 * pi * frequency * t - phase); + second = amplitude * sin(2 * pi * maj_second_freq * t - phase); + third = amplitude * sin(2 * pi * maj_third_freq * t - phase); + fourth = amplitude * sin(2 * pi * fourth_freq * t - phase); + fifth = amplitude * sin(2 * pi * fifth_freq * t - phase); + sixth = amplitude * sin(2 * pi * maj_sixth_freq * t - phase); + + %each one of the three melodies making up the song: + melody1 = [first,first,fifth,fifth,sixth,sixth,fifth,fifth]; %size 8 notes + melody2 = [fourth,fourth,third,third,second,second,first,first]; %size 8 notes + melody3 = [fifth,fifth,fourth,fourth,third,third,second,second]; %size 8 notes + + % populate the matrix(total size is 44 notes wide, which means the song's + % duration must fit within the specified duration parameter + x = [melody1,melody2,melody3,melody3,melody1,melody2]; + + %For testing + %t = 0:dt:song_duration; + %t(n) = []; + %plot(t, x); + %sound(x, fs); +end \ No newline at end of file