Mercurial > hg > c4dm-chord-transcriptions
comparison chordtools/chord2midinotes.m @ 1:8973548174c1 tip
adding tools to repo
author | christopherh |
---|---|
date | Mon, 06 May 2013 14:43:47 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:0a4ad3e72e75 | 1:8973548174c1 |
---|---|
1 % | |
2 %CHORD2MIDINOTES Generate MIDI note values for a given chord symbol | |
3 % | |
4 % [midinotes, success, errormessage] = chord2midinotes(chordsymbol, {verbose}) | |
5 % | |
6 % Obtains a set of midi note values for notes present in chord "chordsymbol". | |
7 % The voicing is built on the rootnote with all other intervals occuring | |
8 % above in number order unless a bass interval is specified. | |
9 % | |
10 % In the case of the 'no chord' symbol 'N' function returns midinote -1 | |
11 % | |
12 % Success = 1 if chord is converted correctly else 0. | |
13 % | |
14 % If optional argument 'verbose' is 1, function prints any errormessage to | |
15 % the screen. | |
16 % | |
17 % Returns: midinotes (array of integers) | |
18 % success (boolean) | |
19 % errormessage (string) | |
20 % | |
21 % | |
22 % % Author: Christopher Harte, March 2009 | |
23 % | |
24 % Copyright: Centre for Digital Music, Queen Mary University of London 2005 | |
25 % | |
26 % This file is part of the C4DM Chord Toolkit V2.0 | |
27 % | |
28 % The C4DM Chord Toolkit is free software; you can redistribute it and/or | |
29 % modify it under the terms of the GNU General Public License as published | |
30 % by the Free Software Foundation; either version 2 of the License, or | |
31 % (at your option) any later version. | |
32 % | |
33 % The C4DM Chord Toolkit is distributed in the hope that it will be useful, | |
34 % but WITHOUT ANY WARRANTY; without even the implied warranty of | |
35 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
36 % GNU General Public License for more details. | |
37 % | |
38 % You should have received a copy of the GNU General Public License | |
39 % along with the C4DM Toolkit; if not, write to the Free Software | |
40 % Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
41 | |
42 % | |
43 function [midinotes, success,errormessage] = chord2midinotes(chordsymbol, verbose) | |
44 | |
45 % set verbose default to 0 | |
46 if nargin < 2 | |
47 verbose = 0; | |
48 end | |
49 | |
50 errormessage = ''; | |
51 mainlist = ''; | |
52 success = 1; | |
53 midinotes = 0; | |
54 | |
55 % parse the chordsymbol | |
56 [rootnote,shorthand,interval_list,bass, success, errormessage] = getchordinfo(chordsymbol); | |
57 | |
58 if success | |
59 | |
60 | |
61 %if 'no chord' then return -1 | |
62 if rootnote == 'N' | |
63 | |
64 midinotes = -1; | |
65 else | |
66 | |
67 % get root's pitchclass with respect to middle C and calculate absolute | |
68 % pitch of root in that octave | |
69 if success | |
70 | |
71 [rootpitchclass, success, errormessage] = note2pitchclass(rootnote); | |
72 | |
73 % midinote C4 = 60 so add pitchclass to calculate rootpitch | |
74 rootpitch = 60 + rootpitchclass; | |
75 | |
76 end | |
77 | |
78 | |
79 % combine shorthand and interval_list and obtain semitone values for each | |
80 % interval | |
81 if success | |
82 | |
83 [mainlist, success, errormessage] = addshort2list(shorthand, interval_list); | |
84 | |
85 if success | |
86 | |
87 [semitones,success,errormessage] = intervals2semitones(mainlist); | |
88 | |
89 % add rootpitch to obtain midinotes | |
90 chordpitches = semitones + rootpitch; | |
91 | |
92 end | |
93 | |
94 end | |
95 | |
96 % Now find the bass note | |
97 | |
98 if success | |
99 | |
100 % if we haven't got a bass interval then play the rootnote as the | |
101 % bassnote | |
102 if isempty(bass) | |
103 basspitchclass = rootpitchclass; | |
104 else | |
105 % otherwise convert the bassinterval to a note | |
106 [bassnote,success,errormessage] = interval2note(bass, rootnote); | |
107 | |
108 if success | |
109 | |
110 [basspitchclass, success, errormessage] = note2pitchclass(char(bassnote)); | |
111 | |
112 end | |
113 end | |
114 | |
115 if success | |
116 % calculate bass note so that it is in the octave below the | |
117 % rest of the chord i.e. add to C3 midinote 48 | |
118 basspitch = basspitchclass + 48; | |
119 | |
120 % Put midinote list together | |
121 midinotes = [basspitch, rootpitch]; | |
122 | |
123 for index = 1:length(chordpitches) | |
124 if chordpitches(index) ~= rootpitch | |
125 midinotes = [midinotes, chordpitches(index)]; | |
126 end | |
127 end | |
128 end | |
129 | |
130 end | |
131 end | |
132 | |
133 %alter pitches for chords with high roots | |
134 if rootpitchclass > 6 | |
135 midinotes = midinotes-12; | |
136 end | |
137 | |
138 end | |
139 | |
140 if success == 0 | |
141 errormessage = [errormessage sprintf(['Error in chord2midinotes: Couldn''t convert chord"' chordsymbol '"\n'])]; | |
142 if verbose ==1 | |
143 fprintf(1,errormessage); | |
144 end | |
145 end | |
146 | |
147 | |
148 |