This program is Copyright © 2005 by Jean-Marc Baillard and is used here by permission.
This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.
Overview
-The following program ( actually 2 routines ) performs the Chords
<> Notes conversion:
-"C-N" displays the notes of a given chord.
-"N-C" searches the chord(s) corresponding to ( 3 to 6 ) given notes
without
regard of order.
-"N-C" identifies 47 types of chords, namely ( for example in C ):
CMaj , CMin , C- , C/4 , C5+ , C5+ 9 , C5+ 9- , C5- , C6 , CMin6
, C7 , C7- , C7 5+ , C7 5- , CMin7 , CMin7+ , CMin7 5- , CMaj7 , CMaj7
5+
CMaj7 5- , C7/4 , CMin7/4 , C7/6 , CMin7/6 , CMaj7/6 , Cadd9 , CMinadd9
, C9 , CMin9 , C9 5+ , C9 5- , CMaj9 , CMin9 7+ , C9+ , C9- , C9- 5+
C9/6 , CMin9/6 , C11 , CMin11 , C11+ , CMaj11 , C13 , CMin13 , CMaj13
, C13 9- , C13 5-9-
-Other notations are sometimes used, for instance, C13 (b5 b9) = C13 5-9- = thirteenth chord with diminished fifth and diminished ninth ...
-These chords are coded as follows: we use the relations
A = 0 , Bb = 1 , B = 2 , ....... , Ab = 11 , A = 12 , .....
Let's take for example A11 ( eleventh chord )
A11 = A Db E G B D = 0 4 7 10 14 17 whence, modulo 12:
0 4 7 10 2 5 rearranged in increasing order: 0 2 4 5 7 10
then we take the difference between 2 consecutive integers:
2-0 = 2 , 4-2 = 2 , 5-4 = 1 , 7-5 = 2 , 10-7 = 3
which finally yields 22123 for eleventh
chords ( the dominant doesn't change the final result )
22123 is the content of X-register at line 467 and similarly
for the other chords.
-"C-N" finds the same chords, plus a few extra ones ...
"C-N" will work if the left part of the alpha string ( after
the dominant and a possible MAJ or MIN ) is one of the following symbols:
13 11 11+ 9 9+ 9- 7
7+ 7- - /4 5+ 5- and if the rest
of the string only contains one ( or several ) of the characters:
6 4 5+ 5- 7+ 7- 9
9+ 9- 11+
Program Listing
Data Registers: C-N: R00 = dominant
; R01 = 11th or 13th ; R02 = 9th ; R03 = 7th ; R04 =
6th ; R05 = 5th ; R06 = 4th ; R07 = 3rd ; R08 = 1
N-C: R00 = -------- ; R01 to Rnn = the n notes
of the chord ( n < 7 )
R09-R10-R11: temp
Flags: /
Subroutines: /
01 LBL "C-N"
Chord >>>> Notes
02 CLX
03 STO 04
04 STO 06
05 SIGN
06 STO 08
07 11
08 STO 03
09 ST+ X
10 STO 01
11 15
12 STO 02
13 8
14 STO 05
15 5
16 STO 07
17 LBL 00
lines 17 to 21 eliminate the possible spaces ( ASCII code = 32 ) at the
left of the string
18 32
19 ATOX
20 X=Y?
21 GTO 00
22 XEQ 05
23 STO 00
24 CLX
25 LBL 01
26 X#0?
27 SIGN
28 ST+ 00
29 29
29 = the ASCII code of "#" ( [alpha] shift SIN )
which indicates sharp notes.
30 ATOX
Actually, the true ASCII code of "#" is 35 but it's not easily
accessible on the keyboard.
31 X=Y?
32 GTO 01
33 98
98 = the ASCII code of "b" ( [alpha] shift B )
which symbolizes flat notes.
34 X=Y?
35 CHS
36 X<0?
37 GTO 01
38 X<>Y
39 XTOA
40 SIGN
41 CHS
42 AROT
43 ASTO 09
44 ASHF
45 ASTO 10
46 "MIN"
47 XEQ 08
48 X#0?
49 GTO 02
50 3
51 AROT
52 ASTO 09
53 ASHF
54 ASTO 10
55 DSE 07
56 LBL 02
57 "MAJ"
58 XEQ 08
59 X#0?
60 GTO 02
61 3
62 AROT
63 ASTO 09
64 ASHF
65 ASTO 10
66 ISG 03
67 LBL 02
68 "13"
69 XEQ 08
70 X=0?
71 GTO 02
72 18
73 STO 01
74 "11"
75 XEQ 08
76 X=0?
77 GTO 02
78 CLX
79 STO 01
80 57
ASCII code of "9" ( lines 80-81 could be replaced
by "9" XEQ 08 but it would be wasteful )
81 POSA
82 X=0?
83 GTO 02
84 CLX
85 STO 02
86 55
ASCII code of "7"
87 POSA
88 0
89 X#Y?
90 STO 03
91 LBL 02
92 4
93 "6"
94 10
95 XEQ 07
96 "7-"
97 XEQ 08
98 45
ASCII code of "-" for diminished chords
99 POSA
100 *
101 X=0?
102 DSE 05
103 X=0?
104 DSE 07
105 52
ASCII code of "4"
106 POSA
107 X<0?
108 GTO 02
109 6
110 STO 06
111 LBL 02
112 5
113 "5+"
114 9
115 XEQ 07
116 5
117 "5-"
118 7
119 XEQ 07
120 3
121 "7+"
122 12
123 XEQ 07
124 3
125 "7-"
126 10
127 XEQ 07
128 57
129 POSA
130 X<0?
131 GTO 02
132 15
133 STO 02
134 LBL 02
135 2
136 "9+"
137 16
138 XEQ 07
139 2
140 "9-"
141 14
142 XEQ 07
143 1
144 "11+"
145 19
146 XEQ 07
147 RCL 06
148 RCL 07
149 -
150 1
151 -
152 X=0?
153 STO 07
154 "7/6"
155 XEQ 08
156 X=0?
157 GTO 02
158 RCL 03
159 RCL 04
160 -
161 1
162 -
163 X=0?
164 STO 03
165 LBL 02
166 " "
( one space )
167 8
168 STO 09
169 LBL 03
170 RCL IND 09
171 X#0?
172 XEQ 06
173 DSE 09
174 GTO 03
175 TONE 9
176 PROMPT
177 LBL "N-C"
Notes >>>> Chord(s)
178 CLX
179 STO 07
180 LBL 04
181 ATOX
182 X=0?
183 GTO 02
184 98
( flat notes )
185 X=Y?
186 DSE IND 07
187 CLX
188 29
( sharp notes )
189 X=Y?
190 ISG IND 07
191 ENTER^
192 68
193 RCL Z
194 -
195 X^2
196 9
197 X<Y?
198 GTO 04
( characters different from A B C D E F G # b are simply ignored
)
199 R^
200 XEQ 05
201 ISG 07
202 CLX
203 STO IND 07
204 GTO 04
205 LBL 05
206 .61
207 /
208 106
209 -
210 INT
211 RTN
212 LBL 06
213 RCL 00
214 +
215 12
216 MOD
217 STO 11
you can avoid the use of register R11 if you replace this line with STO
Y and line 223 with X<>Y ( one more byte )
218 .59
219 *
220 65.1
221 +
222 XTOA
223 RCL 11
224 X=0?
225 "~b"
( append b )
226 6
227 -
228 ABS
229 4
230 X=Y?
231 "~b"
( append b )
232 SIGN
233 X=Y?
234 "~b"
( append b )
235 RTN
236 LBL 07
237 XEQ 08
238 X<0?
239 RTN
240 X<>Y
241 STO IND Z
242 RTN
243 LBL 08
244 ENTER^
245 ASTOX
246 CLA
247 ARCL 09
248 ARCL 10
249 POSA
250 RTN
251 LBL 02
252 RCL 07
253 STO 00
254 STO 08
255 LBL 09
lines 255 to 271 sort the content of registers R01 thru Rnn in increasing
order ( n = the number of notes )
256 RCL 00
257 RCL 00
258 RCL IND X
259 LBL 10
260 RCL IND Z
261 X>Y?
262 STO Z
263 X>Y?
264 +
265 RDN
266 DSE Z
267 GTO 10
268 X<> IND 00
269 STO IND Y
270 DSE 00
271 GTO 09
272 LBL 11
273 RCL 07
274 RCL 01
275 ST+ 00
276 LBL 12
277 ST- IND Y
278 DSE Y
279 GTO 12
280 RCL 07
281 .1
282 %
283 2
284 +
285 0
286 STO 09
287 LBL 13
288 10
289 *
290 RCL IND Y
291 ST+ Y
292 X<> 09
293 -
294 ISG Y
295 GTO 13
296 33
297 X=Y?
298 "-"
299 1
300 +
301 X=Y?
302 "MIN"
303 8
304 +
305 X=Y?
306 "5-"
307 1
308 +
309 X=Y?
310 "MAJ"
or " " ( 1
space )
311 LASTX
312 +
313 X=Y?
314 "5+"
315 8
316 +
317 X=Y?
318 "/4"
319 82
320 +
321 X=Y?
322 "5+ 9-"
323 90
324 STO 09
325 +
326 X=Y?
327 "5+ 9"
328 DSE X
329 X=Y?
330 "add9"
331 9
332 -
333 X=Y?
334 "MINadd9"
335 CLX
336 334
337 X=Y?
338 "MIN7 5-"
339 DSE X
340 X=Y?
341 "7-"
342 9
343 +
344 X=Y?
345 "MIN6"
346 1
347 +
348 X=Y?
349 "MIN7"
350 LASTX
351 +
352 X=Y?
353 "MIN7+"
354 80
355 +
356 X=Y?
357 "7 5-"
358 1
359 +
360 X=Y?
361 "MAJ7 5-" or
"7+ 5-"
362 7
363 +
364 X=Y?
365 "6"
366 1
367 +
368 X=Y?
369 "7"
370 LASTX
371 +
372 X=Y?
373 "MAJ7"
or "7+"
374 9
375 +
376 X=Y?
377 "MAJ7 5+" or
"7+ 5+"
378 DSE X
379 X=Y?
380 "7 5+"
381 81
382 +
383 X=Y?
384 "7/4"
385 810
386 +
387 X=Y?
388 "9-"
389 9
390 +
391 X=Y?
392 "9- 5+"
or "7 5+9-"
393 800
394 +
395 X=Y?
396 "MIN9/6"
397 1
398 +
399 X=Y?
400 "MIN9"
401 LASTX
402 +
403 X=Y?
404 "MIN9 7+"
405 80
406 +
407 X=Y?
408 "9 5-"
409 8
410 +
411 X=Y?
412 "9/6"
413 1
414 +
415 X=Y?
416 "9"
417 LASTX
418 +
419 X=Y?
420 "MAJ9"
or "9 7+"
421 8
422 +
423 X=Y?
424 "9 5+"
425 891
426 +
427 X=Y?
428 "9+"
429 RCL 09
430 +
431 X=Y?
432 "MIN7/4"
433 198
434 STO 10
435 +
436 X=Y?
437 "MIN7/6"
438 900
439 +
440 X=Y?
441 "7/6"
442 1
443 +
444 X=Y?
445 "MAJ7/6" or
"7+/6"
446 8909
447 +
448 X=Y?
449 "13 5-9-"
450 RCL 09
451 +
452 X=Y?
453 "13 9-"
454 7902
455 +
456 X=Y?
457 "MIN11"
458 RCL 10
459 +
460 X=Y?
461 "MIN13"
462 703
463 +
464 X=Y?
465 "MAJ11" or
"11 7+"
466 DSE X
467 X=Y?
468 "11"
469 RCL 09
470 +
471 X=Y?
472 "11+"
473 109
474 +
475 X=Y?
476 "MAJ13" or
"13 7+"
477 DSE X
478 X=Y?
479 "13"
480 ALENG
481 X=0?
482 GTO 02
483 ASTO 09
484 ASHF
485 ASTO 10
486 " "
( one space )
487 1
488 XEQ 06
489 ARCL 09
490 ARCL 10
491 TONE 9
492 PROMPT
493 LBL 02
494 CLA
495 RCL 07
496 12
497 LBL 14
498 X<> IND Y
499 DSE Y
500 GTO 14
501 DSE 08
502 GTO 11
a three-byte GTO ( or replace this line by GTO 15 and replace line
272 by LBL 15 )
503 BEEP
504 END
( 934 bytes / SIZE 012 )
"C-N" examples: Execution time = 20 to 50 seconds
"CMAJ"
( or simply "C" ) XEQ "C-N"
>>>> ( TONE 9 ) " CEG"
3 notes: C E G
"C-"
XEQ "C-N" >>>> ( TONE 9 ) " CEbGb"
3 notes: C Eb Gb
"D7-"
XEQ "C-N" >>>> ( TONE 9 ) " DFAbB"
4 notes: D F Ab B
"Bb5+ 9-"
XEQ "C-N" >>>> ( TONE 9 ) " BbDGbB"
4 notes: Bb D Gb B
"Aadd9" ( or "A 9" )
XEQ "C-N" >>>> ( TONE 9 ) " ADbEB"
4 notes: A Db E B
"A9"
XEQ "C-N" >>>> ( TONE 9 ) " ADbEGB"
5 notes: A Db E G B
"C#13 5-9-" ( or "Db13 5-9-" )
XEQ "C-N" >>>> ( TONE 9 ) " DbFGBDBb"
6 notes: Db F G B D Bb
-You can add space(s) at the left or the right of the alpha string or
between 2 groups of symbols,
for instance, you can key in: " CMAJ7 5+ "
or " CMAJ75+" , but not "C MAJ 7 5
+"
and "Bb5+ 9-" but neither "Bb
5 + 9-" nor "B b 5+9-"
"N-C" examples: Execution time = 17 to 80 seconds
"CEG"
XEQ "N-C" >>>> ( TONE 9 )
" CMAJ"
R/S >>>>
( BEEP )
0
( no other chord )
"DFAbB"
XEQ "N-C" >>>> ( TONE 9 )
" Ab7-"
R/S >>>> (
TONE 9 ) " B7-"
R/S >>>> (
TONE 9 ) " D7-"
R/S >>>> (
TONE 9 ) " F7-"
R/S >>>>
( BEEP )
0
( no other chord )
"ABCDbG#Ab" XEQ "N-C" >>>> ( BEEP ) 0 ( unknown chord )
"A#EbbF#B"
XEQ "N-C" >>>> ( TONE 9 )
" Bb5+ 9-"
R/S >>>>
( TONE 9 ) " BMIN7+"
R/S >>>>
( BEEP )
0
( no other chord )
-Strictly speaking, "Bb5+ 9-" = Bb D Gb B and "BMIN7+"
= B D Gb Bb are not quite identical.
-Practically, however, they are usually obtained by the same fingerings
on a guitar.
Notes: ( I mean "remarks" )
-Don't key in more than 6 notes before executing "N-C". All these notes
must be different.
-You can key in several b and several # ( for instance
Bbb instead of A , C## instead of D )
-The character "#" ( alpha shift SIN ) doesn't appear very clearly
on the HP-41 ( 35 XTOA would be better but not very easy to handle )
if you want to replace it by another one, replace lines 29 and
188 by the corresponding ASCII code ( for example 100 or E2 if you replace
"#" by "d" )
-If you use the notations "7+" , "9 7+" , "11 7+" , "13 7+" which are
equivalent to
"MAJ7" , "MAJ9" , "MAJ11" , "MAJ13" respectively, lines
57 to 67 may be deleted.
-Several bytes can be saved if you omit some spaces ( for example line
449 "135-9-" instead of "13 5-9-" ) but the display is less
legible.
-If you wish that "N-C" identifies another chord, say MIN/4 ,
insert CLX 322 X=Y? "MIN/4" after line 479
( the intervals between 2 consecutive notes of this chord are
3 2 2 )
-Similarly, if you want to delete one of the chords, say MAJ7+
5- , delete line 358 to 361 after replacing line 362 by 8 ( instead
of 7 )
so that the next content of X-register is unchanged.
-If you key in "Cadd11" XEQ "C-N" you'll get
" CEG" ( the "11" will not be taken into account )
-In order to identify this chord, add 1 "11"
18 XEQ 07 after line 146.
Go back to the HP-41 software library
Go back to the general software library
Go
back to the main exhibit hall