The Museum of HP Calculators

# 564 Chords for the HP-41

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?
331  9
332  -
333  X=Y?
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.