idamnjanovic@10: function data = generateAMT_Learning_Problem(nfft, windowSize, overlap)
idamnjanovic@10: %%% Generate Automatic Music Transcription Problem
idamnjanovic@21: %   
idamnjanovic@21: %   Centre for Digital Music, Queen Mary, University of London.
idamnjanovic@21: %   This file copyright 2009 Ivan Damnjanovic.
idamnjanovic@21: %
idamnjanovic@21: %   This program is free software; you can redistribute it and/or
idamnjanovic@21: %   modify it under the terms of the GNU General Public License as
idamnjanovic@21: %   published by the Free Software Foundation; either version 2 of the
idamnjanovic@21: %   License, or (at your option) any later version.  See the file
idamnjanovic@21: %   COPYING included with this distribution for more information.
idamnjanovic@10: %   
idamnjanovic@10: %
idamnjanovic@10: %   generateAMT_Learning_Problem is a part of the SMALLbox and generates
idamnjanovic@10: %   a problem that can be used for comparison of Dictionary Learning/Sparse
idamnjanovic@10: %   Representation techniques in automatic music transcription scenario.
idamnjanovic@10: %   The function prompts a user for an audio file (mid, wav, mat) reads it
idamnjanovic@10: %   and generates a spectrogram given fft size (default nfft=4096), analysis
idamnjanovic@10: %   window size (windowSize=2822), and analysis window overlap (overlap =
idamnjanovic@10: %   0.5).
idamnjanovic@10: %   
idamnjanovic@10: %   The output of the function is stucture with following fields:
idamnjanovic@10: %       b - matrix with magnitudes of the spectrogram
idamnjanovic@10: %       f - vector of frequencies at wihch spectrogram is computed
idamnjanovic@10: %       windowSize - analysis window size
idamnjanovic@10: %       overlap - analysis window overlap
idamnjanovic@10: %       fs - sampling frequency
idamnjanovic@10: %       m - number of frequenciy points in spectrogram
idamnjanovic@10: %       n - number of time points in the spectrogram
idamnjanovic@10: %       p - number of dictionary elements to be learned (eg 88 for piano)
idamnjanovic@10: %       notesOriginal - notes of the original audio to be used for
idamnjanovic@10: %                       comparison (if midi of the original exists)
idamnjanovic@10: %       name - name of the audio file to transcribe
idamnjanovic@10:     
idamnjanovic@10: %%
idamnjanovic@10: FS=filesep;
idamnjanovic@10: if ~ exist( 'nfft', 'var' ) || isempty(nfft), nfft = 4096; end
idamnjanovic@10: if ~ exist( 'windowSize', 'var' ) || isempty(windowSize), windowSize = 2822; end
idamnjanovic@10: if ~ exist( 'overlap', 'var' ) || isempty(overlap), overlap = 0.5; end
idamnjanovic@10: 
idamnjanovic@10: %%
idamnjanovic@10: %ask for file name
idamnjanovic@10: TMPpath=pwd;
idamnjanovic@10: [pathstr1, name, ext, versn] = fileparts(which('SMALLboxSetup.m'));
idamnjanovic@10: cd([pathstr1,FS,'data',FS,'audio']);
idamnjanovic@10: [filename,pathname] = uigetfile({'*.mat; *.mid; *.wav'},'Select a file to transcribe');
idamnjanovic@10: [pathstr, name, ext, versn] = fileparts(filename);
idamnjanovic@10: data.name=name;
idamnjanovic@10: 
idamnjanovic@10: data.notesOriginal=[];
idamnjanovic@10: 
idamnjanovic@10: if strcmp(ext,'.mid')
idamnjanovic@10:     midi=readmidi(filename);
idamnjanovic@10:     data.notesOriginal=midiInfo(midi);
idamnjanovic@10:     y=midi2audio(midi);
idamnjanovic@10:     wavwrite(y, 44100, 16, 'temp.wav');
idamnjanovic@10:     [x.signal, x.fs, x.nbits]=wavread('temp.wav');
idamnjanovic@10:     delete('temp.wav');
idamnjanovic@10: elseif strcmp(ext,'.wav')
idamnjanovic@10:     cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']);
idamnjanovic@10:     filename1=[name, '.mid'];
idamnjanovic@10:     if exist(filename1, 'file')
idamnjanovic@10:         midi=readmidi(filename1);
idamnjanovic@10:         data.notesOriginal=midiInfo(midi);
idamnjanovic@10:     end
idamnjanovic@10:     cd([pathstr1,FS, 'data', FS, 'audio', FS, 'wav']);
idamnjanovic@10:     [x.signal, x.fs, x.nbits]=wavread(filename);
idamnjanovic@10: else
idamnjanovic@10:     cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']);
idamnjanovic@10:     filename1=[name, '.mid'];
idamnjanovic@10:     if exist(filename1, 'file')
idamnjanovic@10:         midi=readmidi(filename1);
idamnjanovic@10:         data.notesOriginal=midiInfo(midi);
idamnjanovic@10:     end
idamnjanovic@10:     cd([pathstr1,FS, 'data', FS, 'audio', FS, 'mat']);
idamnjanovic@10:     x=load([pathname,filename]);
idamnjanovic@10: end
idamnjanovic@10: %%
idamnjanovic@10: [X, frX]=spectrogram(x.signal, hanning(windowSize), overlap*windowSize, nfft, x.fs);
idamnjanovic@10: %%
idamnjanovic@10: data.b=abs(X);
idamnjanovic@10: data.f=frX;
idamnjanovic@10: data.windowSize=windowSize;
idamnjanovic@10: data.overlap=overlap;
idamnjanovic@10: data.fs=x.fs;
idamnjanovic@10: data.m=size(X,1);
idamnjanovic@10: data.n=size(X,2);
idamnjanovic@10: 
idamnjanovic@10: data.p=88; %number of dictionary elements (ie notes to recover)
idamnjanovic@10: cd(TMPpath);
idamnjanovic@10: 
idamnjanovic@10: end