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