Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 12 su 12
  1. #11
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278
    Lavorare a colpi di blocchi di struct non è proprio semplice. Ma mi sto impegnando e tra l'altro sto imparando un sacco di cose sul mondo dei midi file, della lettura e lavorazione dei file in C.

    Ho realizzato queste due funzioni per il passaggio da big endian a little endian, può essere utile anche ad altri per cui le riporto (aggiungete anche la libreria stdint):

    codice:
    //funzione swap big endian --> little Endian per valori di 16 o 32 bit
    uint32_t swap32(uint32_t f)
    {
    f = ((f>>24)&0xff) | ((f<<8)&0xff0000) | ((f>>8)&0xff00) |  ((f<<24)&0xff000000 );
    }
    uint16_t swap16(uint16_t x)
    {
        x = (x>>8) | (x<<8);
    }

    Comunque pian piano sto procedendo. Ho ben capito che i midi sono composti così:

    tempo-->evento-->tempo-->evento-->tempo-->evento.

    Fare il pairsing non è proprio semplice. Sto impazzendo per riuscire a dividere tempo ed eventi.

    Ho trovato un'interessante "articolo" che spiega qualcosa, lo pubblico che magari potrebbe interessare anche ad altri sull'argomento:
    00 ff 58 04 04 02 30 08 00 ff 59 02 00 00 00 90 3c 28 81 00 90 3c
    00 00 90 3c 1e 81 00 90 3c 00 00 90 43 2d 81 00 90 43 00 00 90 43
    32 81 00 90 43 00 00 90 45 2d 81 00 90 45 00 00 90 45 32 81 00 90
    45 00 00 90 43 23 82 00 90 43 00 00 90 41 32 81 00 90 41 00 00 90
    41 2d 81 00 90 41 00 00 90 40 32 40 90 40 00 40 90 40 28 40 90 40
    00 40 90 3e 2d 40 90 3e 00 40 90 3e 32 40 90 3e 00 40 90 3c 1e 82
    00 90 3c 00 00 ff 2f 00

    How do you separate this stream of data into time/message pairs? If you don't know anything about MIDI, you are in the same position as a computer who is reading this data. In order to to the segretation into time/data pairs you have to know the MIDI Protcol and about Variable Length Values. Once you have a basic understanding of MIDI files, you should be able to distinguish the time/message pairs with hardly any effort:
    Ora sto cercando di ottenere questo, ma non è così semplice...
    codice:
         DELTA TIME   MESSAGE
    00           ff 58 04 04 02 30 08 
    00           ff 59 02 00 00 
    00           90 3c 28 
    81 00        90 3c 00 
    00           90 3c 1e 
    81 00        90 3c 00 
    00           90 43 2d 
    81 00        90 43 00 
    00           90 43 32 
    81 00        90 43 00 
    00           90 45 2d 
    81 00        90 45 00 
    00           90 45 32 
    81 00        90 45 00 
    00           90 43 23 
    82 00        90 43 00 
    00           90 41 32 
    81 00        90 41 00 
    00           90 41 2d 
    81 00        90 41 00 
    00           90 40 32 
    40           90 40 00 
    40           90 40 28 
    40           90 40 00 
    40           90 3e 2d 
    40           90 3e 00 
    40           90 3e 32 
    40           90 3e 00 
    40           90 3c 1e 
    82 00        90 3c 00 
    00           ff 2f 00
    Notice that time values sometime are two bytes in length, and sometimes they are one byte in length. Using more than one byte for the delta time implies a longer time value. Time values in a MIDI file are stored as Variable Length Values (VLV). A VLV is a number with a variable width

    I won't explain how to segment the MIDI message data here, but here is a simple algorithm for parsing a VLV value out of a byte stream:

    If byte is greater or equal to 80h (128 decimal) then the next byte
    is also part of the VLV,
    else byte is the last byte in a VLV.

    Fonte: http://253.ccarh.org/handout/vlv/
    ]
    Nonostante scriva come fare, implementarlo, per le mie conoscenze del momento, non è molto semplice. Ma mi sto applicando per capire meglio queste VLV. Come si creano, si usano e soprattutto come inserirle nelle struct.

    Insomma è un bel macello

    Avete qualche altro consiglio (qualsiasi consiglio che mi possa agevolare i lavori è ben accetto)?!

  2. #12
    Originariamente inviato da stejano
    Nonostante scriva come fare, implementarlo, per le mie conoscenze del momento, non è molto semplice. Ma mi sto applicando per capire meglio queste VLV. Come si creano, si usano e soprattutto come inserirle nelle struct.
    In linea di massima, ti conviene fare posto nelle tue struct per il valore più grande possibile che può avere ciascuno di questi VLV e convertirli in tale forma al momento della lettura, in modo da conservare un numero "normale" nella tua struct.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.