Mercurial > hg > mauch-mirex-2010
view _writetools/write_song2.m @ 9:4ea6619cb3f5 tip
removed log files
author | matthiasm |
---|---|
date | Fri, 11 Apr 2014 15:55:11 +0100 |
parents | b5b38998ef3b |
children |
line wrap: on
line source
function write_song2(song, bnet, param, outfilename, filetype, verbose) prelabels = {'C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','N'}; chordindex = bnet.names('chord'); metposindex = bnet.names('metpos'); if param.dbn.nKey > 0 keyindex = bnet.names('key'); end switch filetype case 'chordlab' chordsequence = [song.mpe{chordindex,:}]; oldchord = 0; oldlabel ='N'; outfile = fopen(outfilename,'w'); if verbose fprintf(1, '0.0 '); end fprintf(outfile, '0.0 '); for iChord= 1:length(chordsequence) newchord = song.mpe{chordindex, iChord}; if newchord ~= oldchord if param.dbn.nKey > 0 keylabel = param.dbn.keynames{song.mpe{keyindex,iChord}}; else keylabel = 'C'; end if ischar(param.dbn.chordnames{newchord}) prelabel = ['C',param.dbn.chordnames{newchord}]; [c.rootnote, c.shorthand, c.degreelist, c.bassdegree, success, error] =... getchordinfo(prelabel); c.string = addshort2list(c.shorthand, c.degreelist); label = [chordroot_spelling(keylabel, param.dbn.chordrootnotes(newchord)-1 ,strsplit(',',c.string)),param.dbn.chordnames{newchord}]; else label = 'N'; end if verbose fprintf(1,'%0.3f %s\n%0.3f ', song.beattimes(iChord,1), oldlabel,song.beattimes(iChord,1)); end fprintf(outfile,'%0.3f %s\n%0.3f ', song.beattimes(iChord,1), oldlabel,song.beattimes(iChord,1)); oldlabel = label; end oldchord = newchord; end if verbose fprintf(1,'%0.3f %s', song.beattimes(iChord,2), oldlabel); end fprintf(outfile,'%0.3f %s', song.beattimes(iChord,2), oldlabel); fclose(outfile); case 'keylab' keysequence = [song.mpe{keyindex,:}]; oldkey = 0; oldlabel ='N'; outfile = fopen(outfilename,'w'); if verbose fprintf(1, '0.0 '); end fprintf(outfile, '0.0 '); for iKey = 1:length(keysequence) newkey = song.mpe{keyindex, iKey}; if newkey ~= oldkey keylabel = param.dbn.keynames{song.mpe{keyindex,iKey}}; if verbose fprintf(1,'%0.3f %s\n%0.3f ', song.beattimes(iKey,1), oldlabel,song.beattimes(iKey,1)); end fprintf(outfile,'%0.3f %s\n%0.3f ', song.beattimes(iKey,1), oldlabel,song.beattimes(iKey,1)); oldlabel = keylabel; end oldkey = newkey; end if verbose fprintf(1,'%0.3f %s', song.beattimes(iKey,2), oldlabel); end fprintf(outfile,'%0.3f %s', song.beattimes(iKey,2), oldlabel); fclose(outfile); case 'lilypond' bassindex = bnet.names('bass'); lilychordnames = repmat(param.dbn.lilytypechordnames,[1,12]); lilychordnames{numel(lilychordnames)+1} = ''; chordsequence = [song.mpe{chordindex,:}]; nBeat = length(chordsequence); keysequence = [song.mpe{keyindex,:}]; % label = cell(nBeat,1); % keylabel = cell(nBeat,1); metpossequence = [song.mpe{metposindex,:}]; oldchord = 0; oldkey = 0; oldbass = 0; chordcount = 0; basscount = 0; chordduration = 1; bassduration = 1; % time signature stuff partial = find(metpossequence == 1,1)-1; if partial > 0 partial = ['\partial ' lilylength(partial)]; else partial = ''; end barlines = find(metpossequence == 1); timesig = diff(barlines); % for barlines, not beats ind = min(length(timesig),union(find(timesig~=4),find(timesig~=4)+1)); non4timesig = barlines(ind); % in beats timesig = timesig(ind); % chord and bass loop for iBeat= 1:length(chordsequence) newchord = song.mpe{chordindex, iBeat}; newkey = song.mpe{keyindex, iBeat}; newbass = song.mpe{bassindex, iBeat}; newmetpos = song.mpe{metposindex, iBeat}; if param.dbn.nKey > 0 prekeylabel = param.dbn.keynames{song.mpe{keyindex,iBeat}}; else prekeylabel = 'C'; end if newchord ~= oldchord || newmetpos == 1 || chordduration == 4 % get the chord name chordcount = chordcount + 1; if iBeat > 1 chordlabelduration(chordcount-1) = chordduration; end if ischar(param.dbn.chordnames{newchord}) preroot = spellnote(newkey, param.dbn.chordrootnotes(newchord),'lily'); root{chordcount} = preroot; if isempty(strfind(param.dbn.chordnames{newchord},'/')) label{chordcount} = lilychordnames{newchord}; else bass = spellnote(newkey, param.dbn.chordbassnotes(newchord),'lily'); label{chordcount} = [strrep(lilychordnames{newchord},' ',''),'/',bass]; end else root{chordcount} = 'r'; label{chordcount} = ''; end chordbeat(chordcount) = iBeat; % oldlabel = label{iBeat}; chordduration = 1; else chordduration = chordduration + 1; end if oldkey ~= newkey keylabel{iBeat} = param.dbn.lilykeynames{song.mpe{keyindex,iBeat}}; % keylabel{iBeat} = strrep(keylabel{iBeat},'#','is'); % keylabel{iBeat} = strrep(keylabel{iBeat},'b','es'); % keylabel{iBeat} = lower(keylabel{iBeat}); % oldkeylabel = keylabel{iBeat}; end if oldbass ~= newbass || newmetpos == 1 || bassduration == 4 basscount = basscount + 1; if iBeat > 1 basslabelduration(basscount-1) = bassduration; end basslabel{basscount} = spellnote(newkey, param.dbn.chordbassnotes(newbass),'lily'); bassbeat(basscount) = iBeat; bassduration = 1; else bassduration = bassduration + 1; end oldbass = newbass; oldkey = newkey; oldchord = newchord; end % finish off the durations etc basslabelduration(basscount) = bassduration; chordlabelduration(chordcount) = chordduration; chord_string = 'chordsymb = { \chordmode { '; bass_string = 'bassnotes = { \override TextScript #''box-padding = #.7 \override TextScript #''font-size = #-3 \override TextScript #''thickness = #.03 \clef bass'; for iBeat = 1:nBeat chordind = find(chordbeat == iBeat); bassind = find(bassbeat == iBeat); timesigind = find(non4timesig == iBeat); if ~(iBeat > numel(keylabel) || isempty(keylabel{iBeat})) chord_string = [chord_string sprintf(' } \\key %s \\chordmode { ', keylabel{iBeat})]; bass_string = [bass_string sprintf(' \\key %s', keylabel{iBeat})]; end if ~isempty(chordind) if ~isempty(timesigind) chord_string = [chord_string sprintf(' \\time %0.0f/4',timesig(timesigind))]; end chord_string = [chord_string sprintf(' %s%s%s',root{chordind}, lilylength(chordlabelduration(chordind)), label{chordind})]; end if ~isempty(bassind) bass_string = [bass_string sprintf(' %s%s',basslabel{bassind},lilylength(basslabelduration(bassind)))]; end end fid = fopen(outfilename); fprintf(fid,'\\header{title = "%s"}\n%s}}\n%s\n}\n<<\n\\new ChordNames {\n\\set chordChanges = ##t\n%s\n\\chordsymb\n\n}\n\\new Voice {\n\\chordsymb\n}\n\\new Voice {\n\\bassnotes\n}\n>>\n\\version "2.10.33"\n',... song.filenametrunk, chord_string, bass_string, partial); fclose(fid); if verbose fprintf(1,'\\header{title = "%s"}\n%s}}\n%s\n}\n<<\n\\new ChordNames {\n\\set chordChanges = ##t\n%s\n\\chordsymb\n\n}\n\\new Voice {\n\\chordsymb\n}\n\\new Voice {\n\\bassnotes\n}\n>>\n\\version "2.10.33"\n',... song.filenametrunk, chord_string, bass_string, partial); end end function L = lilylength(beats) switch beats case 1 L = '4'; case 2 L = '2'; case 3 L = '2.'; case 4 L = '1'; end