Signal processing

Basic Music Synthesis Project

Basic Music Synthesis Project

Introduction

The project is an Instrument Recognition Program with Matlab, featuring Time-Frequency Analysis method, Gabor Transform algorithm, Signal Feature Extraction, LBG Vector Quantization and K-means algorithm to achieve up to 80% recognition in musical instruments including Piano, Guitar, and Cello.

function note = KeyGenerate(KeyNumber,tempo,beat,fs)

% Set the t-axis of a note and the sampling interval 1/fs
t = [0 : 1/fs : (60/tempo)*beat];

% The equation gives the frequency f of the nth key number 
f = 440 * 2^( (KeyNumber-49)/12 );

% Simulate the tone quality by "triangle decreasing"
middle = ( t(1)+t(end) )/2;
triangle = middle - abs(t-middle);
triangle = triangle ./ max(triangle);

% Using sin(2*pi*f*t) to be the basis of tone quality
note = (sin(2*pi*f*t)).*triangle;
end




function MusicSynthesis()

name = input('Music Name: ',"s");
fs = input('Sampling Rate fs: ');

% Tempo: Lento 60, Adagio 80, Moderato 100, Allegro 120 
tempo = input('Tempo(60, 80, 100, 120): ');

% Generate all the paino notes with 1 and 2 beat 
La0_1  = KeyGenerate( 1, tempo, 1, fs);  La0_2  = KeyGenerate( 1, tempo, 2, fs); % A0
La_0_1 = KeyGenerate( 2, tempo, 1, fs);  La_0_2 = KeyGenerate( 2, tempo, 2, fs); % A#0
Si0_1  = KeyGenerate( 3, tempo, 1, fs);  Si0_2  = KeyGenerate( 3, tempo, 2, fs); % B0
Do0_1  = KeyGenerate( 4, tempo, 1, fs);  Do0_2  = KeyGenerate( 4, tempo, 2, fs); % C0
Do_0_1 = KeyGenerate( 5, tempo, 1, fs);  Do_0_2 = KeyGenerate( 5, tempo, 2, fs); % C#0
Re0_1  = KeyGenerate( 6, tempo, 1, fs);  Re0_2  = KeyGenerate( 6, tempo, 2, fs); % D0
Re_0_1 = KeyGenerate( 7, tempo, 1, fs);  Re_0_2 = KeyGenerate( 7, tempo, 2, fs); % D#0
Mi0_1  = KeyGenerate( 8, tempo, 1, fs);  Mi0_2  = KeyGenerate( 8, tempo, 2, fs); % E0
Fa0_1  = KeyGenerate( 9, tempo, 1, fs);  Fa0_2  = KeyGenerate( 9, tempo, 2, fs); % F0
Fa_0_1 = KeyGenerate(10, tempo, 1, fs);  Fa_0_2 = KeyGenerate(10, tempo, 2, fs); % F#0
So0_1  = KeyGenerate(11, tempo, 1, fs);  So0_2  = KeyGenerate(11, tempo, 2, fs); % G0
So_0_1 = KeyGenerate(12, tempo, 1, fs);  So_0_2 = KeyGenerate(12, tempo, 2, fs); % G#0

La1_1  = KeyGenerate(13, tempo, 1, fs);  La1_2  = KeyGenerate(13, tempo, 2, fs); % A1
La_1_1 = KeyGenerate(14, tempo, 1, fs);  La_1_2 = KeyGenerate(14, tempo, 2, fs); % A#1
Si1_1  = KeyGenerate(15, tempo, 1, fs);  Si1_2  = KeyGenerate(15, tempo, 2, fs); % B1
Do1_1  = KeyGenerate(16, tempo, 1, fs);  Do1_2  = KeyGenerate(16, tempo, 2, fs); % C1
Do_1_1 = KeyGenerate(17, tempo, 1, fs);  Do_1_2 = KeyGenerate(17, tempo, 2, fs); % C#1
Re1_1  = KeyGenerate(18, tempo, 1, fs);  Re1_2  = KeyGenerate(18, tempo, 2, fs); % D1
Re_1_1 = KeyGenerate(19, tempo, 1, fs);  Re_1_2 = KeyGenerate(19, tempo, 2, fs); % D#1
Mi1_1  = KeyGenerate(20, tempo, 1, fs);  Mi1_2  = KeyGenerate(20, tempo, 2, fs); % E1
Fa1_1  = KeyGenerate(21, tempo, 1, fs);  Fa1_2  = KeyGenerate(21, tempo, 2, fs); % F1
Fa_1_1 = KeyGenerate(22, tempo, 1, fs);  Fa_1_2 = KeyGenerate(22, tempo, 2, fs); % F#1
So1_1  = KeyGenerate(23, tempo, 1, fs);  So1_2  = KeyGenerate(23, tempo, 2, fs); % G1
So_1_1 = KeyGenerate(24, tempo, 1, fs);  So_1_2 = KeyGenerate(24, tempo, 2, fs); % G#1
 
La2_1  = KeyGenerate(25, tempo, 1, fs);  La2_2  = KeyGenerate(25, tempo, 2, fs); % A2
La_2_1 = KeyGenerate(26, tempo, 1, fs);  La_2_2 = KeyGenerate(26, tempo, 2, fs); % A#2
Si2_1  = KeyGenerate(27, tempo, 1, fs);  Si2_2  = KeyGenerate(27, tempo, 2, fs); % B2
Do2_1  = KeyGenerate(28, tempo, 1, fs);  Do2_2  = KeyGenerate(28, tempo, 2, fs); % C2
Do_2_1 = KeyGenerate(29, tempo, 1, fs);  Do_2_2 = KeyGenerate(29, tempo, 2, fs); % C#2
Re2_1  = KeyGenerate(30, tempo, 1, fs);  Re2_2  = KeyGenerate(30, tempo, 2, fs); % D2
Re_2_1 = KeyGenerate(31, tempo, 1, fs);  Re_2_2 = KeyGenerate(31, tempo, 2, fs); % D#2
Mi2_1  = KeyGenerate(32, tempo, 1, fs);  Mi2_2  = KeyGenerate(32, tempo, 2, fs); % E2
Fa2_1  = KeyGenerate(33, tempo, 1, fs);  Fa2_2  = KeyGenerate(33, tempo, 2, fs); % F2
Fa_2_1 = KeyGenerate(34, tempo, 1, fs);  Fa_2_2 = KeyGenerate(34, tempo, 2, fs); % F#2
So2_1  = KeyGenerate(35, tempo, 1, fs);  So2_2  = KeyGenerate(35, tempo, 2, fs); % G2
So_2_1 = KeyGenerate(36, tempo, 1, fs);  So_2_2 = KeyGenerate(36, tempo, 2, fs); % G#2

La3_1  = KeyGenerate(37, tempo, 1, fs);  La3_2  = KeyGenerate(37, tempo, 2, fs); % A3
La_3_1 = KeyGenerate(38, tempo, 1, fs);  La_3_2 = KeyGenerate(38, tempo, 2, fs); % A#3
Si3_1  = KeyGenerate(39, tempo, 1, fs);  Si3_2  = KeyGenerate(39, tempo, 2, fs); % B3
Do3_1  = KeyGenerate(40, tempo, 1, fs);  Do3_2  = KeyGenerate(40, tempo, 2, fs); % C3
Do_3_1 = KeyGenerate(41, tempo, 1, fs);  Do_3_2 = KeyGenerate(41, tempo, 2, fs); % C#3
Re3_1  = KeyGenerate(42, tempo, 1, fs);  Re3_2  = KeyGenerate(42, tempo, 2, fs); % D3
Re_3_1 = KeyGenerate(43, tempo, 1, fs);  Re_3_2 = KeyGenerate(43, tempo, 2, fs); % D#3
Mi3_1  = KeyGenerate(44, tempo, 1, fs);  Mi3_2  = KeyGenerate(44, tempo, 2, fs); % E3
Fa3_1  = KeyGenerate(45, tempo, 1, fs);  Fa3_2  = KeyGenerate(45, tempo, 2, fs); % F3
Fa_3_1 = KeyGenerate(46, tempo, 1, fs);  Fa_3_2 = KeyGenerate(46, tempo, 2, fs); % F#3
So3_1  = KeyGenerate(47, tempo, 1, fs);  So3_2  = KeyGenerate(47, tempo, 2, fs); % G3
So_3_1 = KeyGenerate(48, tempo, 1, fs);  So_3_2 = KeyGenerate(48, tempo, 2, fs); % G#3

La4_1  = KeyGenerate(49, tempo, 1, fs);  La4_2  = KeyGenerate(49, tempo, 2, fs); % A4
La_4_1 = KeyGenerate(50, tempo, 1, fs);  La_4_2 = KeyGenerate(50, tempo, 2, fs); % A#4
Si4_1  = KeyGenerate(51, tempo, 1, fs);  Si4_2  = KeyGenerate(51, tempo, 2, fs); % B4
Do4_1  = KeyGenerate(52, tempo, 1, fs);  Do4_2  = KeyGenerate(52, tempo, 2, fs); % C4 # middle C
Do_4_1 = KeyGenerate(53, tempo, 1, fs);  Do_4_2 = KeyGenerate(53, tempo, 2, fs); % C#4
Re4_1  = KeyGenerate(54, tempo, 1, fs);  Re4_2  = KeyGenerate(54, tempo, 2, fs); % D4
Re_4_1 = KeyGenerate(55, tempo, 1, fs);  Re_4_2 = KeyGenerate(55, tempo, 2, fs); % D#4
Mi4_1  = KeyGenerate(56, tempo, 1, fs);  Mi4_2  = KeyGenerate(56, tempo, 2, fs); % E4
Fa4_1  = KeyGenerate(57, tempo, 1, fs);  Fa4_2  = KeyGenerate(57, tempo, 2, fs); % F4
Fa_4_1 = KeyGenerate(58, tempo, 1, fs);  Fa_4_2 = KeyGenerate(58, tempo, 2, fs); % F#4
So4_1  = KeyGenerate(59, tempo, 1, fs);  So4_2  = KeyGenerate(59, tempo, 2, fs); % G4
So_4_1 = KeyGenerate(60, tempo, 1, fs);  So_4_2 = KeyGenerate(60, tempo, 2, fs); % G#4

La5_1  = KeyGenerate(61, tempo, 1, fs);  La5_2  = KeyGenerate(61, tempo, 2, fs); % A5
La_5_1 = KeyGenerate(62, tempo, 1, fs);  La_5_2 = KeyGenerate(62, tempo, 2, fs); % A#5
Si5_1  = KeyGenerate(63, tempo, 1, fs);  Si5_2  = KeyGenerate(63, tempo, 2, fs); % B5
Do5_1  = KeyGenerate(64, tempo, 1, fs);  Do5_2  = KeyGenerate(64, tempo, 2, fs); % C5
Do_5_1 = KeyGenerate(65, tempo, 1, fs);  Do_5_2 = KeyGenerate(65, tempo, 2, fs); % C#5
Re5_1  = KeyGenerate(66, tempo, 1, fs);  Re5_2  = KeyGenerate(66, tempo, 2, fs); % D5
Re_5_1 = KeyGenerate(67, tempo, 1, fs);  Re_5_2 = KeyGenerate(67, tempo, 2, fs); % D#5
Mi5_1  = KeyGenerate(68, tempo, 1, fs);  Mi5_2  = KeyGenerate(68, tempo, 2, fs); % E5
Fa5_1  = KeyGenerate(69, tempo, 1, fs);  Fa5_2  = KeyGenerate(69, tempo, 2, fs); % F5
Fa_5_1 = KeyGenerate(70, tempo, 1, fs);  Fa_5_2 = KeyGenerate(70, tempo, 2, fs); % F#5
So5_1  = KeyGenerate(71, tempo, 1, fs);  So5_2  = KeyGenerate(71, tempo, 2, fs); % G5
So_5_1 = KeyGenerate(72, tempo, 1, fs);  So_5_2 = KeyGenerate(72, tempo, 2, fs); % G#5

La6_1  = KeyGenerate(73, tempo, 1, fs);  La6_2  = KeyGenerate(73, tempo, 2, fs); % A6
La_6_1 = KeyGenerate(74, tempo, 1, fs);  La_6_2 = KeyGenerate(74, tempo, 2, fs); % A#6
Si6_1  = KeyGenerate(75, tempo, 1, fs);  Si6_2  = KeyGenerate(75, tempo, 2, fs); % B6
Do6_1  = KeyGenerate(76, tempo, 1, fs);  Do6_2  = KeyGenerate(76, tempo, 2, fs); % C6
Do_6_1 = KeyGenerate(77, tempo, 1, fs);  Do_6_2 = KeyGenerate(77, tempo, 2, fs); % C#6
Re6_1  = KeyGenerate(78, tempo, 1, fs);  Re6_2  = KeyGenerate(78, tempo, 2, fs); % D6
Re_6_1 = KeyGenerate(79, tempo, 1, fs);  Re_6_2 = KeyGenerate(79, tempo, 2, fs); % D#6
Mi6_1  = KeyGenerate(80, tempo, 1, fs);  Mi6_2  = KeyGenerate(80, tempo, 2, fs); % E6
Fa6_1  = KeyGenerate(81, tempo, 1, fs);  Fa6_2  = KeyGenerate(81, tempo, 2, fs); % F6
Fa_6_1 = KeyGenerate(82, tempo, 1, fs);  Fa_6_2 = KeyGenerate(82, tempo, 2, fs); % F#6
So6_1  = KeyGenerate(83, tempo, 1, fs);  So6_2  = KeyGenerate(83, tempo, 2, fs); % G6
So_6_1 = KeyGenerate(84, tempo, 1, fs);  So_6_2 = KeyGenerate(84, tempo, 2, fs); % G#6

La7_1  = KeyGenerate(85, tempo, 1, fs);  La7_2  = KeyGenerate(85, tempo, 2, fs); % A7
La_7_1 = KeyGenerate(86, tempo, 1, fs);  La_7_2 = KeyGenerate(86, tempo, 2, fs); % A#7
Si7_1  = KeyGenerate(87, tempo, 1, fs);  Si7_2  = KeyGenerate(87, tempo, 2, fs); % B7
Do7_1  = KeyGenerate(88, tempo, 1, fs);  Do7_2  = KeyGenerate(88, tempo, 2, fs); % C7
Do_7_1 = KeyGenerate(89, tempo, 1, fs);  Do_7_2 = KeyGenerate(89, tempo, 2, fs); % C#7
Re7_1  = KeyGenerate(90, tempo, 1, fs);  Re7_2  = KeyGenerate(90, tempo, 2, fs); % D7
Re_7_1 = KeyGenerate(91, tempo, 1, fs);  Re_7_2 = KeyGenerate(91, tempo, 2, fs); % D#7
Mi7_1  = KeyGenerate(92, tempo, 1, fs);  Mi7_2  = KeyGenerate(92, tempo, 2, fs); % E7
Fa7_1  = KeyGenerate(93, tempo, 1, fs);  Fa7_2  = KeyGenerate(93, tempo, 2, fs); % F7
Fa_7_1 = KeyGenerate(94, tempo, 1, fs);  Fa_7_2 = KeyGenerate(94, tempo, 2, fs); % F#7
So7_1  = KeyGenerate(95, tempo, 1, fs);  So7_2  = KeyGenerate(95, tempo, 2, fs); % G7
So_7_1 = KeyGenerate(96, tempo, 1, fs);  So_7_2 = KeyGenerate(96, tempo, 2, fs); % G#7

La8_1  = KeyGenerate( 97, tempo, 1, fs);  La8_2  = KeyGenerate( 97, tempo, 2, fs); % A8
La_8_1 = KeyGenerate( 98, tempo, 1, fs);  La_8_2 = KeyGenerate( 98, tempo, 2, fs); % A#8
Si8_1  = KeyGenerate( 99, tempo, 1, fs);  Si8_2  = KeyGenerate( 99, tempo, 2, fs); % B8
Do8_1  = KeyGenerate(100, tempo, 1, fs);  Do8_2  = KeyGenerate(100, tempo, 2, fs); % C8
Do_8_1 = KeyGenerate(101, tempo, 1, fs);  Do_8_2 = KeyGenerate(101, tempo, 2, fs); % C#8
Re8_1  = KeyGenerate(102, tempo, 1, fs);  Re8_2  = KeyGenerate(102, tempo, 2, fs); % D8
Re_8_1 = KeyGenerate(103, tempo, 1, fs);  Re_8_2 = KeyGenerate(103, tempo, 2, fs); % D#8
Mi8_1  = KeyGenerate(104, tempo, 1, fs);  Mi8_2  = KeyGenerate(104, tempo, 2, fs); % E8
Fa8_1  = KeyGenerate(105, tempo, 1, fs);  Fa8_2  = KeyGenerate(105, tempo, 2, fs); % F8
Fa_8_1 = KeyGenerate(106, tempo, 1, fs);  Fa_8_2 = KeyGenerate(106, tempo, 2, fs); % F#8
So8_1  = KeyGenerate(107, tempo, 1, fs);  So8_2  = KeyGenerate(107, tempo, 2, fs); % G8
So_8_1 = KeyGenerate(108, tempo, 1, fs);  So_8_2 = KeyGenerate(108, tempo, 2, fs); % G#8

La4_0  = KeyGenerate(49, tempo, 1/2, fs);  La4_2  = KeyGenerate(49, tempo, 2, fs); % A4
La_4_0 = KeyGenerate(50, tempo, 1/2, fs);  La_4_2 = KeyGenerate(50, tempo, 2, fs); % A#4
Si4_0  = KeyGenerate(51, tempo, 1/2, fs);  Si4_2  = KeyGenerate(51, tempo, 2, fs); % B4
Do4_0  = KeyGenerate(52, tempo, 1/2, fs);  Do4_2  = KeyGenerate(52, tempo, 2, fs); % C4 # middle C
Do_4_0 = KeyGenerate(53, tempo, 1/2, fs);  Do_4_2 = KeyGenerate(53, tempo, 2, fs); % C#4
Re4_0  = KeyGenerate(54, tempo, 1/2, fs);  Re4_2  = KeyGenerate(54, tempo, 2, fs); % D4
Re_4_0 = KeyGenerate(55, tempo, 1/2, fs);  Re_4_2 = KeyGenerate(55, tempo, 2, fs); % D#4
Mi4_0  = KeyGenerate(56, tempo, 1/2, fs);  Mi4_2  = KeyGenerate(56, tempo, 2, fs); % E4
Fa4_0  = KeyGenerate(57, tempo, 1/2, fs);  Fa4_2  = KeyGenerate(57, tempo, 2, fs); % F4
Fa_4_0 = KeyGenerate(58, tempo, 1/2, fs);  Fa_4_2 = KeyGenerate(58, tempo, 2, fs); % F#4
So4_0  = KeyGenerate(59, tempo, 1/2, fs);  So4_2  = KeyGenerate(59, tempo, 2, fs); % G4
So_4_0 = KeyGenerate(60, tempo, 1/2, fs);  So_4_2 = KeyGenerate(60, tempo, 2, fs); % G#4

La5_0  = KeyGenerate(61, tempo, 1/2, fs);  La5_2  = KeyGenerate(61, tempo, 2, fs); % A5
La_5_0 = KeyGenerate(62, tempo, 1/2, fs);  La_5_2 = KeyGenerate(62, tempo, 2, fs); % A#5
Si5_0  = KeyGenerate(63, tempo, 1/2, fs);  Si5_2  = KeyGenerate(63, tempo, 2, fs); % B5
Do5_0  = KeyGenerate(64, tempo, 1/2, fs);  Do5_2  = KeyGenerate(64, tempo, 2, fs); % C5
Do_5_0 = KeyGenerate(65, tempo, 1/2, fs);  Do_5_2 = KeyGenerate(65, tempo, 2, fs); % C#5
Re5_0  = KeyGenerate(66, tempo, 1/2, fs);  Re5_2  = KeyGenerate(66, tempo, 2, fs); % D5
Re_5_0 = KeyGenerate(67, tempo, 1/2, fs);  Re_5_2 = KeyGenerate(67, tempo, 2, fs); % D#5
Mi5_0  = KeyGenerate(68, tempo, 1/2, fs);  Mi5_2  = KeyGenerate(68, tempo, 2, fs); % E5
Fa5_0  = KeyGenerate(69, tempo, 1/2, fs);  Fa5_2  = KeyGenerate(69, tempo, 2, fs); % F5
Fa_5_0 = KeyGenerate(70, tempo, 1/2, fs);  Fa_5_2 = KeyGenerate(70, tempo, 2, fs); % F#5
So5_0  = KeyGenerate(71, tempo, 1/2, fs);  So5_2  = KeyGenerate(71, tempo, 2, fs); % G5
So_5_0 = KeyGenerate(72, tempo, 1/2, fs);  So_5_2 = KeyGenerate(72, tempo, 2, fs); % G#5

Fa4_01  = KeyGenerate(57, tempo, 3/4, fs);
Re_4_01  = KeyGenerate(55, tempo, 1/4, fs);
So4_4  = KeyGenerate(59, tempo, 4, fs);
Re_4_4 = KeyGenerate(55, tempo, 4, fs);
Fa4_4  = KeyGenerate(57, tempo, 4, fs);

% Attack on titan: The Rumbling
song = [ Re_4_0,  Fa4_0, So_4_1,  So4_0, So4_2, So_4_0, La_5_1,  Fa4_2, ...
          Fa4_0, Re_4_0,  Fa4_0, Re_4_0, Fa4_0,  So4_0,  So4_4 ...
         Re_4_0,  Fa4_0, So_4_1,  So4_0, So4_2, So_4_1,  So4_0,  So4_2, Fa4_1, Re_4_0, Re_4_4, ...
         Re_4_0,  Fa4_0, So_4_1,  So4_0, So4_2, So_4_0, La_5_1,  Fa4_2, ...
          Fa4_0, Re_4_0,  Fa4_0, Re_4_0, Fa4_0,  So4_0,  So4_4, ...
          Fa4_0, Re_4_0,  Fa4_0, Re_4_0, Fa4_1, Re_4_0,  Fa4_1, Re_4_0, Fa4_1, Fa_4_1,  Fa4_4, ...
          So4_1,  Do4_2,  So4_1,  Do4_2, Do4_0, La_5_1, So_4_1,  So4_1, Do4_2,  So4_1,  Do4_0,  So4_0,  So4_1];

 
sound(song, fs);
audiowrite(strcat(name, '.wav'), song, fs);
end