Rivista: Commodore Computer Club (IT) – N.ro: 14 / ottobre 1984 – Trascrizione: David La Monaca
Ancora un estratto dal numero 14 di Commodore Computer Club che stiamo sfogliando e digitalizzando in questo periodo: questa volta recuperiamo alla forma digitale un programma musicale che sfrutta a dovere il SID, chip custom dedicato all’audio del C64.
Accordi musicali consente di utilizzare la tastiera del computer come una tastiera di un sintetizzatore e generare diversi tipi di accordi, cioè più note contemporaneamente. Con la pressione di un singolo tasto è possibile suonare 4 tipi di accordi: maggiore, minore, settima di dominante e settima diminuita. Con il joystick inserito in porta 2 si può selezionare il tipo di accordo (istruzioni a schermo), con il tasto Fire si può scegliere il gruppo di ottave (3 gravi e 3 acute), la barra spazio interrompe in qualsiasi momento il suono generato dal computer ed infine il tasto CTRL torna al menù iniziale di scelta del tipo di effetto tra i 4 disponibili. Alla partenza il programma calcola i parametri delle 94 note disponibili nel formato byte basso/byte alto, preparando tutti i valori da inserire al momento opportuno nei registri delle frequenze del SID in modo che generi i suoni richiesti.
Il programma mostra poi la selezione fra i 4 effetti disponibili e dopo la scelta dell’utente, mostra una tastiera virtuale sullo schermo simulando i tasti bianchi e neri di un sintetizzatore su due file di ottave (note basse nella parte superiore, più alte in quella inferiore). A quel punto siamo pronti a suonare e a provare melodie e accordi vari. La leva del joystick in porta 2 e il pulsante di fuoco cambieranno il tipo di accordi e le ottave disponibili.

Titolo: Accordi
Piattaforma: Commodore 64
Genere: Utility
Linguaggio: BASIC
Autore versione originale: Enrico Scelsa
Pubblicazione: Commodore Computer Club n. 14, ottobre 1984
Digitazione/Elaborazione: David La Monaca
Anno: 2026 (aprile)
Download: file .PRG
Note: un ringraziamento speciale ad AmigOS per il duro lavoro di controllo e fixing dei numerosi caratteri speciali PETSCII del listato


Qui di seguito trovate il codice in linguaggio BASIC da copiare sul vostro Commodore 64 originale oppure su un emulatore. Per PC Windows 10/11 suggeriamo VICE con il supporto dell’editor e compilatore CBM Prg Studio.
Di seguito le istruzioni per caricare il listato sull’emulatore VICE:
– Copiare il listato qui sotto e incollatelo in CBM Prg Studio.
– I codici dei caratteri speciali presenti nel listato saranno trattati da CBM Prg Studio e convertiti nei corrispondenti simboli del BASIC V2.
– Selezionare Generate .prg (current file) per ottenere il file programma con estensione .prg (ad es. accordi.prg)
– Lanciare l’emulatore VICE e dal menu File > Smart attach… > accordi.prg
– Digitare RUN e premere il tasto Return per far partire il gioco
Buon divertimento!
Download link: ccc14-accordi.prg
Attenzione – Nel listato i caratteri ‘>’ e ‘<‘ potrebbero essere stati sostituiti dai rispettivi codici di encoding HTML ‘>’ e ‘<’. Nel caso siano presenti, sostituite questi valori nel listato prima di caricarlo nell’editor CBM Prg Studio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 100 rem *** commodore 64 ***
110 rem *** accordi musicali ***
120 rem *** by enrico scelsa ***
130 rem *** via magenta 180 milano ***
140 rem *** tel. 02/2475129 ***
150 :
160 print"{clear}"
170 si=54272:vi=53248
180 rem
190 rem setta la frequenza
200 rem
210 dimf(95),g(95),k(255)
220 ff=63508:print"{down*5}{right*2}{down*3}{right*3}{down*3}{right*4}setta la frequenza"
230 forx=95to1step-1:print"{home}{space*4}{home}"x
240 f(x)=int(ff/256):g(x)=int(ff-(f(x)*256))
250 ff=ff/2^(1/12):nextx
260 rem
270 rem
280 rem
290 rem
300 rem*** presentazione ***
310 rem
320 forx=sitosi+24:pokex,0:next
330 poke53280,0:poke53281,4
340 print"{clear}{white}{down}{right*11}{reverse on} h a r m o n y{reverse off}"
350 rem***********************
360 rem*** scelta effetto ***
370 rem***********************
380 s1$="{right*10}":rem <cur-right> 10 volte
390 print"{space*6}UI{space*6}UI{space*6}UI{space*5}UI"
400 print"{space*6}JK{space*6}JK{space*6}JK{space*5}JK"
410 print"{down*4}{space*7}U"
420 print"{home}{down*8}{right*11}{reverse on} effetti "
430 prints1$"{down*2}effetto{space*2}#1{space*3}OP"
440 prints1$"{space*14}{cm h}{cm n}"
450 prints1$"effetto{space*2}#2{space*3}{cm h}{cm n}"
460 prints1$"{space*14}{cm h}{cm n}"
470 prints1$"effetto{space*2}#3{space*3}{cm h}{cm n}"
480 prints1$"{space*14}{cm h}{cm n}"
490 prints1$"effetto{space*2}#4{space*3}L{sh @}"
500 print"{down}{space*7}J"
510 input"quale{space*2}";ef:if ef=1thengosub620:goto560
520 if ef=2 then gosub 640: goto 560
530 if ef=3 then gosub 660: goto 560
540 if ef=4 then gosub 680: goto 560
550 goto510
560 fort=0to2
570 pokesi+3+7*t,qh:pokesi+2+7*t,ql
580 pokesi+5+7*t,ad:pokesi+6+7*t,sr
590 pokesi+4+7*t,fo
600 nextt
610 pokesi+24,15:goto700
620 ql=255:qh=0:ad=3:sr=252:fo=65
630 return
640 ql=0:qh=0:ad=0:sr=255:fo=17
650 return
660 ql=0:qh=0:ad=0:sr=240:fo=33
670 return
680 ql=0:qh=0:ad=31:sr=255:fo=33
690 return
700 rem
710 print"{clear}"
720 print
730 print"joy up{space*4}accordi maggiori"
740 print"joy right accordi minori"
750 print"joy left{space*2}settima dominante"
760 print"joy down{space*2}settima diminuita"
770 print"fire{space*6}selezione ottave "
780 print"ctrl{space*6}torna al menu'iniziale"
790 print"space-bar azzera la frequenza"
800 printchr$(154)"{yellow}{down*2}{space*8}UDDDDDDDDDDDDDDDDI{space*4}UDDI"
810 rem chr$(154)=<tasto commodore><7>
820 print"{space*8}{yellow}G{arrow left}1{reverse on}{black}23{reverse off}{yellow}4{reverse on}{black}567{reverse off}{yellow}8{reverse on}{black}90{reverse off}{yellow}+{reverse on}{black}-{pound}{yellow}St{reverse off}H{space*4}Gf1H{space*3}"
830 print"{space*8}G {reverse on} {white}qwertyuiop@*^{yellow}{reverse on} {reverse off}H{space*4}Gf3H{space*2}"
840 print"{space*8}G{reverse on}rs{black}a{reverse off}{yellow}s{black}{reverse on}df{yellow}{reverse off}g{black}{reverse on}hjk{yellow}{reverse off}l{black}{reverse on}:;{yellow}{reverse off}={reverse on}{space*2}{reverse off}H{space*4}Gf5H{space*2}"
850 print"{space*8}G{reverse on}{space*2}{white}zxcvbnm,.{yellow}{reverse off}/{reverse on}{space*2}{reverse off}{yellow}^{arrow left}H{space*4}Gf7H "
860 print"{space*8}JFI{space*12}UFK{space*4}JFFK"
870 print"{space*10}J{reverse on}{cm o*12}{reverse off}K"
880 print"{reverse on}premi un tasto":forde=0to70
890 geta$:ifa$<>""thenx=70:goto940
900 next
910 print"{up}premi un tasto":forde=0to70
920 geta$:ifa$<>""thenx=70:goto940
930 next:print"{up*2}":goto880
940 rem
950 rem***suona****
960 rem
970 rem "{reverse on}"=chr$(18) cioe' <ctrl><9>
980 rem "{reverse off}"=chr$(146) cioe' <ctrl><0>
990 rem "{white}"=chr$(5) cioe' <ctrl><2>
1000 rem "{black}"=chr$(144) cioe' <ctrl><1>
1010 print"{clear}{reverse on}{white}{reverse off} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {cm g}{space*2}{black} {white} {black} {white} "
1020 print"{reverse on}{white}{reverse off} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {cm g}{space*2}{black} {white} {black} {white} "
1030 print"{reverse on}{white}{reverse off} {black}2{white} {black}3{white} {cm g} {black}5{white} {black}6{white} {black}7{white} {cm g} {black}9{white} {black}0{white} {cm g}{space*2}{black}-{white} {black}{pound}{white} "
1040 print"{reverse on}{white}{reverse off} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm n}"
1050 print"{reverse on}{white}{reverse off}q{cm g}w{cm g}e{cm g}r{cm g}t{cm g}y{cm g}u{cm g}i{cm g}o{cm g}p{cm g}@{cm g}*{cm g}^{cm n}"
1060 print"{down*2}"
1070 print"{right*3}{reverse on}{black} {white} {cm g} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {black} {white} {cm g}{space*2}"
1080 print"{right*3}{reverse on}{black} {white} {cm g} {black} {white} {black} {white} {cm g} {black} {white} {black} {white} {black} {white} {cm g}{space*2}"
1090 print"{right*3}{reverse on}{black}a{white} {cm g} {black}d{white} {black}f{white} {cm g} {black}h{white} {black}j{white} {black}k{white} {cm g}{space*2}"
1100 print"{right*3}{reverse on}{white}{reverse off} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g} {cm g}{space*2}"
1110 print"{right*3}{reverse on}{white}{reverse off}z{cm g}x{cm g}c{cm g}v{cm g}b{cm g}n{cm g}m{cm g},{cm g}. "
1120 ky$="q2w3er5t6y7ui9o0p@-*{pound}^azxdcfvbhnjmk,."
1130 forx=1tolen(ky$):k(asc(mid$(ky$,x,1)))=x
1140 next:ot=12:fg=0
1150 sp$="{home}{down*3}{right*30}"
1160 printsp$"{left*3}ottava 1"
1170 printsp$"{down*10}{left*3}UCI{down}{left*4} G H {down}{left*4}JCK"
1180 printsp$"{down*8}{left*4}effetto{space*2}"ef
1190 getk$:pe=peek(56320):ifk$<>""then1290
1200 ifpeek(203)=60thengosub1420
1210 ifpeek(653)=4 then290
1220 ifpe=126thenm1=4:m2=7:printsp$"{down*3}{left*3}maggiore{space*2}":goto1190
1230 ifpe=119thenm1=3:m2=7:printsp$"{down*3}{left*3}minore{space*4}":goto1190
1240 ifpe=125thenm1=3:m2=6:printsp$"{down*3}{left*3}diminuita":goto1190
1250 ifpe=123thenm1=4:m2=-2:printsp$"{down*3}{left*3}dominante":goto1190
1260 ifpe=111andfg=1thenot=12:fg=0:printsp$"{right*3}{space*2}"sp$"{right*3} 1":goto1190
1270 ifpe=111andfg=0thenot=48:fg=1:printsp$"{right*3}{space*2}"sp$"{right*3} 2"
1280 goto1190
1290 se=k(asc(k$)):ifse=0then1190
1300 print"{home}{down*14}{right*28}{reverse on}"k$
1310 pokesi,g(se+ot)
1320 pokesi+1,f(se+ot)
1330 pokesi+7,g(se+m1+ot)
1340 pokesi+8,f(se+m1+ot)
1350 pokesi+14,g(se+m2+ot)
1360 pokesi+15,f(se+m2+ot)
1370 fort=0to2:pokesi+5+7*t,ad:pokesi+6+7*t,sr:pokesi+4+7*t,fo:next
1380 forde=0to50:next
1390 ifef=3thenifpeek(203)<>64then1390
1400 fort=0to2:pokesi+4+7*t,fo-1:next
1410 goto1190
1420 fort=0to2:pokesi+t*7,0:pokesi+1+t*7,0:next:m1=0:m2=0
1430 printsp$"{down*3}{left*3}{space*9}":return
1440 rem type-in & testing by dlm/rmw
1450 rem fixing/testing by amigos
1460 rem april 7, 2026
