|
Titolo: Rappresentazione time in protocollo SMF Post di: NOwave su 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>8) /* 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? :) Ciao P Titolo: Re: Rappresentazione time in protocollo SMF Post di: NOwave su 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
© 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 |