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 FUNCTION
Ohjelman 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.