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