Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Midin tarkastelu, kuinka? (QB)

Firsti [02.11.2009 19:06:47]

#

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?

Grez [02.11.2009 19:13:04]

#

Tuolta löytyy kuvaus MIDI-tiedostojen rakenteesta: http://www.sonicspot.com/guide/midifiles.html

Metabolix [02.11.2009 19:14:18]

#

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.

Antti Laaksonen [02.11.2009 21:07:22]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta