Rivista: Acorn User – Numero: 5 – Anno: 1982 – Trascrizione: Francesco Fiorentini
Continua la nostra rassegna dei listati per BBC Micro estratti dalla rivista inglese Acorn User. Questa volta si tratta di un programma estratto dal numero 5 di Dicembre 1982, che fornisce la rappresentazione grafica del suono prima di produrlo.
Dopo aver visualizzato la rappresentazione grafica di un suono di default, il programma permette di variarne i parametri e di visualizzare e riprodurre il risultato della modifica.
Le opzioni disponibili per gestire il programma sono visualizzate continuamente nella parte inferiore dello schermo. Tutti i parametri sia nei comandi audio che in quelli dell’inviluppo possono essere variati individualmente, e la visualizzazione sullo schermo indica sia il valore attuale che i valori limite del parametro da modificare. La visualizzazione grafica può essere aggiornata dopo ogni modifica, oppure dopo che sono state apportate diverse modifiche. Il suono risultante viene riprodotto automaticamente dopo l’aggiornamento dello schermo e può essere ripetuto.
Ah, il programma fornisce anche le informazioni riguardanti il range di valore per ogni parametro che vogliamo provare a cambiare.
Divertitevi a generare nuovi suoni e vedere come sono rappresentati a schermo.

Titolo: Graphics Windowing
Piattaforma: BBC Micro
Linguaggio: Basic
Versione originale: Paul Beverly
Pubblicazione: Acorn User – numero 5
Anno: 1982 – Dicembre
Trascrizione: Francesco Fiorentini
Anno: 2026
Download: N/A


Come sempre, qui di seguito trovate il codice ottimizzato per essere copiato direttamente sul vostro BBC Micro oppure su un emulatore. Il nostro consiglio é quello di utilizzare BeebEm.
Una volta avviato BeebEm non dovrete far altro che copiare il listato sottostante ed incollarlo sull’emulatore tramite: Edit -> Paste. Dopodiché digitate RUN ed il gioco é fatto!
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.
Listato: Sound generator – BBC Micro – Basic
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165 10 MODE4
20 PROCinit
30 REPEAT
40 PROCtext
50 PROCplotamp
60 PROCplotfreq
70 PROCtest
80 PROCchange
90 UNTIL exit
100 MODE7:END
499:
500 DEF PROCplot(x%,y%,z%,k%)
501 REM ====================
510 x%=x%*SC:y%=y%*(2-z%)
520 z%=z%*380+224:y%=y%+z%
530 MOVE x%,z%:PLOT k%,x%,y%
540 ENDPROC
999:
1000 DEF PROCinit
1001 REM ======
1010 DIM NS(5),E(14,2),E$(14),S(3,2),S$(3)
1020 VDU28,0,30,39,26
1030 FOR I=2 TO 14
1040 READ E(I,1):READ E(I,2)
1050 READ E$(I):NEXT
1060 FOR I=2 TO 14
1070 READ E(I,0):NEXT
1080 FOR I=1 TO 3
1090 READ S(I,1):READ S(I,2)
1100 READ S(I,0):READ S$(I):NEXT
1110 exit=0
1120 ENDPROC
1499:
1500 DEF PROCtext
1501 REM ======
1510 VDU5,16:MOVE380,1000:PRINT"SOUND ";STR$(S(1,0));",";"1,";STR$(S(2,0));",";STR$(S(3,0))
1520 MOVE340,960:DRAW948,960
1530 MOVE160,928:PRINT"ENV.1, ";STR$(E(2,0));",";STR$(E(3,0));",";STR$(E(4,0));",";STR$(E(5,0));",";STR$(E(6,0));",";STR$(E(7,0));",";STR$(E(8,0));","
1540 MOVE280,544:PRINTSTR$(E(9,0));",";STR$(E(10,0));",";STR$(E(11,0));",";STR$(E(12,0));",";STR$(E(13,0));",";STR$(E(14,0))
1550 MOVE0,600:PLOT21,1280,600
1560 MOVE0,220:PLOT21,1280,220
1570 ENDPROC
1999:
2000 DEF PROCplotamp
2001 REM ===========
2010 Y=0:k=5:TM=S(3,0)*5:SC=4
2020 TB=E(2,0)MOD128:IF TB=0 THEN TB=1
2030 FOR I=0 TO 4:NS(I)=0:NEXT
2040 PROCamp(E(9,0),E(13,0),1)
2050 PROCamp(E(10,0),E(14,0),2)
2060 IF Y=0 THEN TMX=NS(2):ENDPROC
2070 PROCtime(E(11,0),TM,3)
2080 IF Y=0 THEN TMX=NS(3):ENDPROC
2090 PROCamp(E(12,0),0,4)
2100 TMX=NS(4)
2110 ENDPROC
2499:
2500 DEF PROCplotfreq
2501 REM ===========
2510 Y=S(2,0):k=5
2520 FOR I=1 TO 3
2530 IF E(6,0)=0 AND E(7,0)=0 AND E(8,0)=0 THEN PROCfreq(0,255,0):GOTO 2560
2540 IF E(I+5,0)=0 THEN 2570
2550 PROCfreq(E(I+2,0),E(I+5,0),0)
2560 IF NS(0)*TB>=TMX THEN I=3
2570 NEXT:IF NS(0)*TB<TMX AND E(2,0)<128 THEN 2510
2580 IF NS(0)*TB<TMX AND E(2,0)>127 THEN PROCfreq(0,255,0)
2590 MOVE160,24:PRINT"ENTER NUMBER AND PRESS RETURN"
2600 ENDPROC
2999:
3000 DEF PROCamp(dY,YT,p)
3001 REM ===========
3010 REPEAT
3020 NS(p)=NS(p)+TB
3030 Y=Y+dY
3040 IF Y=YT OR (Y>YT AND Y-dY<YT) OR (Y<YT AND Y-dY>YT) THEN Y=YT:k=21
3050 IF Y<=0 THEN Y=0:YT=0
3060 PROCplot(NS(p),Y,0,k):k=5
3070 UNTIL Y=YT OR (NS(p)>=TM AND p<3)
3080 NS(p+1)=NS(p)
3090 ENDPROC
3499:
3500 DEF PROCtime(dY,NST,p)
3501 REM ================
3510 REPEAT
3520 NS(p)=NS(p)+TB
3530 Y=Y+dY
3540 IF Y<=0 THEN Y=0:NST=NS(p)
3550 IF NS(p)>=NST THEN k=21
3560 PROCplot(NS(p),Y,0,k):k=5
3570 UNTIL NS(p)>=NST
3580 NS(p+1)=NS(p)
3590 ENDPROC
3999:
4000 DEF PROCfreq(dY,NST,p)
4001 REM ====================
4010 max=NST+NS(p)
4020 REPEAT
4030 NS(p)=NS(p)+1
4040 Y=Y+dY
4050 IF Y>255 THEN Y=Y-256
4060 IF Y<0 THEN Y=Y+256
4070 IF NS(p)>=max THEN k=21
4080 PROCplot(NS(p)*TB,Y,1,k):k=5
4090 UNTIL NS(p)>=max OR NS(p)*TB>=TMX
4100 ENDPROC
4499:
4500 DEF PROCtest
4501 REM ======
4510 ENVELOPE 1,E(2,0),E(3,0),E(4,0),E(5,0),E(6,0),E(7,0),E(8,0),E(9,0),E(10,0),E(11,0),E(12,0),E(13,0),E(14,0)
4520 SOUND S(1,0),1,S(2,0),S(3,0)
4530 ENDPROC
4999:
5000 DEF PROCchange
5001 REM ======
5010 VDU4,12
5020 PRINTTAB(5,1);"1> Modify 'ENVELOPE' command"
5030 PRINTTAB(5,2)"2> Modify 'SOUND' command"
5040 PRINTTAB(5,3)"3> Play sound 4> Exit program"
5050 INPUTTAB(0,2)" "OP
5060 IF OP=1 THEN PROCenv:GOTO 5100
5070 IF OP=2 THEN PROCsound:GOTO 5100
5080 IF OP=3 THEN PROCtest:GOTO 5010
5090 IF OP=4 THEN exit=-1:ENDPROC ELSE VDU7:GOTO 5010
5100 CLS:PRINTTAB(6,1);"1> Change another parameter"
5110 PRINTTAB(6,3);"2> Plot new Envelope"
5120 INPUTTAB(2,2)OP
5130 IF OP=1 THEN 5010 ELSE IF OP<>2 THEN VDU7:GOTO 5100
5140 CLS:CLG
5150 ENDPROC
5499:
5500 DEF PROCenv
5510 REM ======
5510 CLS
5520 PRINTTAB(0,0);"2 3 4 5 6 7 8 9 10 11 12 13 14"
5530 PRINTTAB(0,2);"TB,P1,P2,P3,N1,N2,N3,AA,AD,AS,AR,TA,TD"
5540 INPUTTAB(2,4)OP
5550 IF OP<2 OR OP>14 THEN VDU7:GOTO 5510
5560 CLS:PRINTTAB(0,0);E$(OP);" can be from ";E(OP,1);" to ";E(OP,2)
5570 PRINTTAB(0,2);"Present value: ";E(OP,0):INPUTTAB(22,2)"New value? "NV
5580 IF NV<=E(OP,2) AND NV>=E(OP,1) THEN E(OP,0)=NV ELSE VDU7:GOTO 5560
5590 ENDPROC
5999:
6000 DEF PROCsound
6010 REM ========
6010 CLS
6020 PRINTTAB(8,0);" 1 - 2 3";
6030 PRINTTAB(0,2);"SOUND Chan. Env. Pitch Time ";
6040 INPUTTAB(2,4)OP
6050 IF OP<1 OR OP>3 THEN VDU7:GOTO 6010
6060 CLS:PRINTTAB(0,0);S$(OP);" can be from ";S(OP,1);" to ";S(OP,2)
6070 PRINTTAB(0,2);"Present value: ";S(OP,0):INPUTTAB(22,2)"New value? "NV
6080 IF NV<=S(OP,2) AND NV>=S(OP,1) THEN S(OP,0)=NV ELSE VDU7:GOTO 6060
6090 ENDPROC
9999:
10000 DATA 0,255,TB,-128,127,P1
10010 DATA -128,127,P2,-128,127,P3
10020 DATA 0,255,N1,0,255,N2
10030 DATA 0,255,N3,1,127,AA
10040 DATA -127,127,AD,-127,0,AS
10050 DATA -127,0,AR,0,126,TA,0,126,TD
10060 DATA 1,0,16,0,50,6,50
10070 DATA 2,1,0,-2,100,126
10080 DATA 0,3,1,Chan,0,255
10090 DATA 53,Pitch,0,254,40,Time
