Moro,
onko kellään tietoa onko kuinka helppoa/vaikeaa ihan vain tarkastella MIDI-tiedostoa Qbasicilla?
En ole soittamassa mitään biisejä, vaan haluaisin vain tulostaa ruudulle mahdollista dataa itse mideistä.
Esim. ajatellaan että on normaali foobar.mid-tiedosto joka sisältää yhden pianoraidan, jossa taasen soitetaan ukkonooa. Pystynköhän jotenkin helposti saamaan tulostettua Qbasicissa ukkonooan nuotit?
Latailin erilaisia QMIDI.BAS-juttuja yms, mutta ne näyttävät todella sekaisilta ja suurilta härdelleiltä (Varmastikin itse soittamista varten tehty), enkä oikein tiedä mistä aloittaa.
Onko kellään antaa mitään neuvoa?
Tuolta löytyy kuvaus MIDI-tiedostojen rakenteesta: http://www.sonicspot.com/guide/midifiles.html
Voit avata ja lukea ihan normaaleilla binaaritiedostofunktioilla. Googlella löytyy kyllä itse tiedostomuodosta tietoja. MIDI-tiedosto ei ole aivan yksinkertainen rakenteeltaan, joten jos (kun) et etukäteen tiedä binaaritiedostoista ja tiedostoformaateista, kannattaa ehkä harjoittelun vuoksi kokeilla ensin jotain helpompaa, esimerkiksi PCX-kuvatiedoston lataamista (ja piirtämistä), jotta pääsee perusasioista jyvälle. Yksikanavaisen, pelkkiä ääniä sisältävän MIDI-tiedoston lukeminen on onneksi tavoitteena ihan realistinen.
Tässä on vähän mallia ohjelman rungoksi:
TYPE THEADER
id AS STRING * 4
size AS STRING * 4
format AS STRING * 2
tracks AS STRING * 2
time AS STRING * 2
END TYPE
TYPE TTRACK
id AS STRING * 4
size AS STRING * 4
END TYPE
OPEN "ukkonooa.mid" FOR BINARY AS #1
DIM header AS THEADER
GET #1, , header
PRINT "OTSIKKOLOHKO"
PRINT "Lohkon tunniste: "; header.id
PRINT "Lohkon pituus: "; Luku&(header.size)
PRINT "Tiedostoformaatti: "; Luku&(header.format)
PRINT "Raitojen määrä: "; Luku&(header.tracks)
DIM track AS TTRACK
FOR i% = 1 TO Luku&(header.tracks)
GET #1, , track
PRINT "RAITALOHKO"
PRINT "Lohkon tunniste: "; track.id
PRINT "Lohkon pituus: "; Luku&(track.size)
data$ = SPACE$(Luku&(track.size))
GET #1, , data$
PRINT "Data:"
FOR j% = 1 TO LEN(data$)
PRINT RIGHT$("0" + HEX$(ASC(MID$(data$, j%, 1))), 2);
IF j% MOD 30 = 0 OR j% = LEN(data$) THEN PRINT
NEXT
NEXT
CLOSE #1
FUNCTION Luku& (data$)
tulos& = 0
FOR i% = 1 TO LEN(data$)
tulos& = tulos& * &HFF
tulos& = tulos& + ASC(MID$(data$, i%, 1))
NEXT
Luku& = tulos&
END FUNCTIONOhjelman tulostus Ukko Nooalla:
OTSIKKOLOHKO Lohkon tunniste: MThd Lohkon pituus: 6 Tiedostoformaatti: 1 Raitojen määrä: 3 RAITALOHKO Lohkon tunniste: MTrk Lohkon pituus: 40 Data: 00FF012047656E657261746564206279204E6F7465576F7274687920436F 6D706F73657200FF2F00 RAITALOHKO Lohkon tunniste: MTrk Lohkon pituus: 145 Data: 00FF21010000FF030753746166662D3100B0077F00B00A4000903C6E8120 903C0020903C6E8120903C0020903C6E8120903C002090406E8120904000 20903E6E8120903E0020903E6E8120903E0020903E6E8120903E00209041 6E81209041002090406E81209040002090406E812090400020903E6E8120 903E0020903E6E8120903E0020903C6E8550903C0000FF2F00 RAITALOHKO Lohkon tunniste: MTrk Lohkon pituus: 145 Data: 00FF21010000FF030753746166662D3200B1077F00B10A400091306E8120 9130002091376E81209137002091346E81209134002091376E8120913700 20912F6E8120912F002091376E81209137002091326E8120913200209137 6E81209137002091306E81209130002091376E812091370020912F6E8120 912F002091376E81209137002091306E855091300000FF2F00
Tässä ensimmäinen raita sisältää tietoa MIDI-tiedoston luoneesta ohjelmasta ("Generated by NoteWorthy Composer"), toinen raita sisältää oikean käden melodian ja kolmas raita sisältää vasemman käden säestyksen.
Toisen raidan datan seasta pystyy lukemaan Ukko Nooan melodian:
903C 903C 903C 9040 903E 903E 903E 9041 9040 9040 903E 903E 903C c c c e d d d f e e d d c
Aihe on jo aika vanha, joten et voi enää vastata siihen.