Benvenuto, Visitatore. Per favore, effettua il login o registrati.

  Hai perso la tua email di attivazione?

Main Home Help Ricerca Login Registrati

+  Virtual Sound - FORUM
|-+  Linguaggi per la Computer Music
| |-+  Altri linguaggi
| | |-+  Rappresentazione time in protocollo SMF
« precedente successivo »
Pagine: [1] Stampa
Autore Topic: Rappresentazione time in protocollo SMF  (Letto 239 volte)
NOwave
Full Member
***
Posts: 233



Guarda Profilo
« il: Agosto 10, 2007, 16:09:07 »

Ciao raga , dunque:

sto facendo un po di programmazione in C
allego piccolo programmino per decodificare i byte in un file midi:

------------------------------- DEC.CPP ------------------------------------

/*  file  dec.cpp

by  Dustin Caldwell    (dustin@gse.utah.edu)

*/


#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

void helpdoc();

main()
{
        FILE *fp;

        unsigned char ch, c;

        if((fp=fopen(_argv[1], "rb"))==NULL)            /* open file to read */
        {
                printf("cannot open file %s\n",_argv[1]);
                helpdoc();
                exit(-1);
        }

        c=0;
        ch=fgetc(fp);

        while(!feof(fp))                        /* loop for whole file */
        {
                printf("%u\t", ch);             /* print every byte's decimal equiv. */
                c++;
                if(c>Figo                                 /* print 8 numbers to a line */
                {
                        c=0;
                        printf("\n");
                }

                ch=fgetc(fp);
        }

        fclose(fp);                     /* close up */
}

void helpdoc()                  /* print help message */
{
        printf("\n   Binary File Decoder\n\n");

        printf("\n Syntax:  dec binary_file_name\n\n");

        printf("by Dustin Caldwell  (dustin@gse.utah.edu)\n\n");
        printf("This is a filter program that reads a binary file\n");
        printf("and prints the decimal equivalent of each byte\n");
        printf("tab-separated. This is mostly useful when piped \n");
        printf("into another file to be edited manually.  eg:\n\n");
        printf("c:\>dec sonata3.mid > son3.txt\n\n");
        printf("This will create a file called son3.txt which can\n");
        printf("be edited with any ascii editor. \n\n");
        printf("(rec.exe may also be useful, as it reencodes the \n");
        printf("ascii text file).\n\n");
        printf("Have Fun!!\n");
}

more info su http://www.wotsit.org/
sito interessante per reperire info sui protocolli di vari file (.wav compresi)

dunque dicevo:
1) leggere i byte di un file midi record
2) codificarli secondo lo Standard midi file
3) manipolarli a piacimento etc.

?)) ciò che mi risulta ostico è interpretare i byte del cosiddetto "delta-time"
     o "variable leght quantity". e cioè il modo in cui il protocollo Midi trasmette
    la locazione temporale di un determinato evento.


Allego testo di un pò di lavoro fatto , cosi mi spiego meglio

M012_000dec.mid      FileRecord
questo è lo stream diretto del midi file ricavato con il progammino C allegato sopra.

77   84   104   100   0   0   0   6   0   
1   0   2   1   224   77   84   114   107   
0   0   0   31   0   255   3   8   77   
48   49   50   95   48   48   48   0   255   
81   3   7   161   32   0   255   88   4   
4   2   24   8   0   255   47   0   77   
84   114   107   0   0   0   73   0   255   
3   7   77   73   68   73   32   48   49   
0   144   0   100   0   1   100   0   2   
100   0   3   100   0   4   100   0   5   
100   0   6   100   0   7   100   135   62   
128   0   64   135   64   1   64   135   64   
2   64   135   64   3   64   135   64   4   
64   135   64   5   64   135   64   6   64   
135   64   7   64   0   255   47   0   

M012_000dec.txt      DecodedStream ASCII
Questi sono gli stessi byte di cui sopra riposizionati e codificati secondo il Protocollo StandardMidiFile.
Se a qualcuno interessa si evince la esatta interpretazione Byte/MessaggioMidi

77   84   104   100   0   0   0   6   Mthd(len=6)   
0   1                     Format=1
0   2                     # of Tracks=2
1   224                     Ticks=480
77   84   114   107   0   0   0   31   Mtrk(len=31)   
0   255   3   8               Track Name(len=8)
77   48   49   50   95   48   48   48   <M012_000>   
0   255   81   3               Tempo   
7   161   32                  <500000> (120BPM)
0   255   88   4               Time Sig   
4   2                     4/4
24                        24Clocks   
8                        8x32 1/4               
0   255   47   0               End of track
77   84   114   107   0   0   0   73   Mtrk(len=73)
0   255   3   7               Track Name(len=7)
77   73   68   73   32   48   49      <MIDI 01>   
0      144   0   100            On Note Ch1
0         1   100   
0         2   100   
0         3   100   
0         4   100   
0         5   100   
0         6   100   
0         7   100   
135   62   128   0   64      Off Note Ch1
135   64      1   64   
135   64      2   64   
135   64      3   64   
135   64      4   64   
135   64      5   64   
135   64      6   64   
135   64                7   64   
0   255   47   0               End of track

i Byte sottolineati son quelli di cui parlavo (variable lenght quantity) e determinano la posizione temporale dell'evento successivo ( in questo caso 128=NoteOFF).
PS:scusate l'identazione del testo ma con il copia/incolla si perde un pò.


M012_000dsm.txt      MidiFormat
questi sono i messaggi Midi contenuti nel file

MThd | Format=1 | # of Tracks=2 | Division=480

Track #0 ******************************************
    Time       Event
   1: 1:  0 |Track Name  | len=8     |
       0x4D 0x30 0x31 0x32 0x5F 0x30 0x30 0x30         <M012_000>
       |Tempo    | BPM=120   | micros\quarter=500000
       |Time Sig    |  4/4      | MIDI-clocks\click=24 | 32nds\quarter=8
       |End of track|

Track #1 ******************************************
    Time       Event
   1: 1:  0 |Track Name  | len=7     |
       0x4D 0x49 0x44 0x49 0x20 0x30 0x31            <MIDI 01>
       |On Note    | chan= 1   | pitch=C -2    | vol=100
       |On Note    | chan= 1   | pitch=C#-2    | vol=100
       |On Note    | chan= 1   | pitch=D -2    | vol=100
       |On Note    | chan= 1   | pitch=D#-2    | vol=100
       |On Note    | chan= 1   | pitch=E -2    | vol=100
       |On Note    | chan= 1   | pitch=F -2    | vol=100
       |On Note    | chan= 1   | pitch=F#-2    | vol=100
       |On Note    | chan= 1   | pitch=G -2    | vol=100
      2:478 |Off Note    | chan= 1   | pitch=c -2    | vol=64
      4:478 |Off Note    | chan= 1   | pitch=c#-2    | vol=64
   2: 2:478 |Off Note    | chan= 1   | pitch=d -2    | vol=64
      4:478 |Off Note    | chan= 1   | pitch=d#-2    | vol=64
   3: 2:478 |Off Note    | chan= 1   | pitch=e -2    | vol=64
      4:478 |Off Note    | chan= 1   | pitch=f -2    | vol=64
   4: 2:478 |Off Note    | chan= 1   | pitch=f#-2    | vol=64
      4:478 |Off Note    | chan= 1   | pitch=g -2    | vol=64
       |End of track|
   

Concludendo:
come riportato sopra si tratta di un MidiFile con:

120 BPM _ Divisione 480 Ticks _ 4/4 _ 24Clocks _ 8x32 su 1/4

non riesco a capire il metodo per calcolare i "Delta Time" segnalati.

ho trovato sul Web alcune dispense ma non ne sono ancora venuto a capo:
http://www.borg.com/~jglatt/tech/midifile/vari.htm

qualcuno mi può aiutare?  Sorriso

Ciao P
Loggato
NOwave
Full Member
***
Posts: 233



Guarda Profilo
« Risposta #1 il: Agosto 12, 2007, 16:09:45 »

Ok alla fine ci sono arrivato da solo.

Se a qualcuno interessa qui ci sono tutte le info sui byte "delta time"

http://www.ccarh.org/courses/253/handout/vlv/

per verifica :
se volete calcolare un delta time di 1/4 su file con una divisione
di (480Ticks)x(nota 1/4) _ otterrete un DeltaTime su du Byte
il cui valore decimale è 131 96.

Ciao P
Loggato
Pagine: [1] Stampa 
« precedente successivo »
Salta a:  


Login con username, password e lunghezza della sessione

Powered by MySQL Powered by PHP © Copyright 1996 - 2008 - ConTempoNet Edizioni Musicali ® - P.IVA: 05174251008
Tutti i diritti riservati - Tutti i marchi sono registrati -
È vietata la riproduzione, anche parziale, dei testi e delle immagini.
Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC
Traduzione Italiana a cura di SMItalia
XHTML 1.0 Valido! CSS Valido!