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>

/* 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 FileRecordquesto è 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 ASCIIQuesti 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 MidiFormatquesti 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.htmqualcuno mi può aiutare?

Ciao P