Autore Topic: Sezione Musica  (Letto 1406 volte)

dj_pakito

  • Newbie
  • *
  • Post: 2
Sezione Musica
« il: 24 Febbraio 2004, 19:40:12 »
 Chi sa aiutarmi?
Non riesco a capire quali valori di Hi Freq e Low Freq devo mettere in relazione alla nota da suonare.
Sul manuale del C64, nella sezione Musica, fanno un esempio di un'intera ottava con i relativi valori di HF e LF, ma sull'appendice M ogni nota ha una coppia di valori completamente diversi.
Come va, allora, interpretata la tabella dell'Appendice?

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Sezione Musica
« Risposta #1 il: 24 Febbraio 2004, 21:03:33 »
 
Citazione
Non riesco a capire quali valori di Hi Freq e Low Freq devo mettere in relazione alla nota da suonare.
Quelli indicati nell'appendice.

Citazione
sull'appendice M ogni nota ha una coppia di valori completamente diversi.
Appendice M ??? Forse volevi dire Appendice E :blink:

Per quanto riguarda la frequenza del suono,supponiamo che tu voglia riprodurre la prima nota della prima ottava (quella che nell'Appendice è indicata come C-0).
Per riprodurla è sufficiente mettere il byte basso e il byte alto della frequenza della nota da riprodurre nei registri che controllano uno dei 3  oscillatori del SID.

Per l'oscillatore n.1,basta scrivere

POKE 54272,1:POKE 54273,12.

Per l'oscillatore n.2

POKE 54279,1:POKE 54280,12.

Per l'oscillatore n.3

POKE 54286,1:POKE 54287,12.

Il suono così emesso ha una frequenza pari a 256*1 + 1*12 = 268 Hz.

Viceversa,se ad esempio vuoi riprodurre un suono pari a 44100 Hz,il suo valore esadecimale è AC44.
AC tradotto in decimale è 172;44 è 68.
In questo caso,per generare il suono con l'oscillatore n.1 scriverai:

POKE 54272,68:POKE 54273,172.

Il programma dimostrativo presente nella sezione musica usa altri numeri perchè utilizza un proprio algoritmo per decodificarli e risalire alla nota corrispondente.

Ciao
 ;)

dj_pakito

  • Newbie
  • *
  • Post: 2
Sezione Musica
« Risposta #2 il: 25 Febbraio 2004, 17:47:32 »
 Ti ringrazio moltissimo, Alberto.
Mi sei stato di grande aiuto.
Mi domando da dove arrivano quelle formule che hai scritto. Hai forse qualche manuale del C64? Conosci qualcuno che me lo potrebbe vendere?
Purtroppo non ho libri sul C64, cerco di arrangiarmi con quello che trovo in rete, ma preferirei qualche libro.
Ciao.

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Sezione Musica
« Risposta #3 il: 25 Febbraio 2004, 18:31:40 »
 Ciao

La 'C64 Programmer's Reference Guide' è senz'altro la guida più completa sulla programmazione del C64:li' trovi una panoramica completa su tutto quel che ti serve per conoscere la macchina,dalla comversione binario a decimale/esadecimale,alle prime nozioni di Basic al linguaggio macchina e all'hardware.
Su questo sito,nella sezione 'C64 guida' trovi la versione italiana in formato elettronico ( in lento ma costante aggiornamento ) del suddetto manuale,ad opera del nostro collaboratore Marcello Massetti.
Ciauz :D




 

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Sezione Musica
« Risposta #4 il: 14 Aprile 2004, 00:19:06 »
 
Citazione
Viceversa,se ad esempio vuoi riprodurre un suono pari a 44100 Hz,il suo valore esadecimale è AC44.
AC tradotto in decimale è 172;44 è 68.
In questo caso,per generare il suono con l'oscillatore n.1 scriverai:

POKE 54272,68:POKE 54273,172.


Per scomporre un numero in termini di byte alto e byte basso, si può fare anche così:

es. scomporre il numero 53280 in byte alto e byte basso

1.     53280/256 = 208.125
Si prende la parte intera (208): questo è il byte alto (che indica la pagina di memoria);

2.     208 * 256 = 53248 (prima locazione della pagina di memoria 208).

3.     sottrarre il numero assegnato alla prima pagina di memoria:
        53280 - 53248 = 32 (questo è il byte basso).

Così, 53280 è esprimibile come 32 byte basso e 208 byte alto.

Proviamo con 44100.

44100/256=172.26 --> 172 (byte alto)

172 * 256 = 44032

44100 - 44032 = 68

E torna!

Questo metodo, che non passa per l'esadecimale, è facilmente implementabile in BASIC.

Codice: [Seleziona]
10 REM BYTE ALTO - BYTE BASSO
20 INPUT "NUMERO";A
30 HI =INT(A/256):C=HI*256:LO=A-C
40 PRINT "BYTE BASSO";LO: PRINT"BYTE ALTO";HI

Ciao!
-=MarC=ellO=-

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Sezione Musica
« Risposta #5 il: 14 Aprile 2004, 00:27:57 »
 Le formule dette derivano da un ragionamento che ho fatto tenendo conto dell'organizzazione in pagine della memoria.
Ogni pagina è data da 256 byte.
Così, la famosa pagina zero altro non è che i primi 256 byte della memoria.
Il byte alto è dato dal numero di pagina (quindi si divide per 256 e si arrotonda ad intero per difetto; cosa che fa INT, vedi capitolo 2 della mia traduzione/revisione della Guida di Riferimento).
Il byte basso dice la posizione della locazione entro quella pagina di memoria, che è pari alla differenza fra l'indirizzo della locazione che si considera e il primo indirizzo della pagina di memoria.
Ovviamente, per locazione intendo un qualsiasi numero a 16bit, che può anche rappresentare la frequenza di una nota...

Mi scuso per la spiegazione veloce... ma se c'è bisogno chiedetemi pure! Ciao!

 
-=MarC=ellO=-