Utilisateur anonyme
-
7 mai 2008 à 11:48
Utilisateur anonyme -
10 mai 2008 à 13:35
Salut la compagnie ,
Je travaille sur les fichiers midi : les évènements midi utilisent un paramètre qui est un DeltaTime et qui peut (et doit ) codé sur 32 bi</gras>. Sauf qu'il y a un sauf (ben oui sinon c'est pas drole).
Z'explique le truc :
Prenons un longword bidon :
10000001 10110001 10110001 1010001
Selon la norme Midi il faut sucré pour chaque Bytes le premier bit (ou le dernier si on va de la gauche vers la droite)
On obtient donc ceci
(1)0000001 (1)0110001 (1)0110001 (1)010001
On rafistole le tout (Encore un truc à la Mac Gyver ) :
On obtient 0000001 0110001 0110001 010001
On remplace les bits "perdus" par des zéros
On obtient : 0000 0000001 0110001 0110001 010001
Même si je connais les opérateurs binaires, je n'ai aucune idée de comment faire la chose.
Je tiens à tous vous remercier pour votre aider. Merci aux personnes qui m'ont aidé en privé (Twinuts, Sheorogath, Philippe).
Voila la procédure pour écrite la variable Length Quantitie :
Procedure WriteVLQ(Value:Word;MS:TMemoryStream);
Var
Buffer, Count, Index:Word;
Begin
Buffer:=Value AND $7F;
Value:=Value SHR 7;
Count:=0;
While Value>0 Do
Begin
Buffer:=Buffer SHL 8;
Buffer:=Buffer OR $80;
Buffer:=Buffer+ (Value AND $7F);
Value:=Value SHR 7;
Inc(Count);
End;
For Index:=Count DownTo 0 Do
Begin
MS.Write(Buffer,1);
Buffer:=Buffer SHR 8;
End;
End;
Désolé d'avoir été un peu lourd mais sans ce fichu delta time, je ne pouvais plus avancer
En fait je ne récupère pas les messages midi : c'est pour faire un fichier midi.
Un lien pourles explications .
Si l'utilisateur veut ajouter une note : la procédure suivante est lancée :
procedure TMidiWriter.Add_NoteOn_Event(Const DeltaTime : LongWord; Const Channel, KeyNumber, Velocity: byte);
Et là il faut transformer le Delta Time en virant les premiers bits.
Pour être honnète j'ai trouvé ceci :
void WriteVarLen (register long value)
{
register long buffer;
buffer = value & 0x7f;
while ((value >>= 7) > 0)
{
buffer <<= 8;
buffer |= 0x80;
buffer += (value & 0x7f);
}
while (TRUE)
{
putc(buffer & 0xFF,outfile);
if (buffer & 0x80)
buffer >>= 8;
else
break;
}
}
doubleword ReadVarLen ()
{
register doubleword value;
register byte c;
if ((value = getc(infile)) & 0x80)
{
value &= 0x7f;
do
{ value (value <<7) + ((c getc(infile)) & 0x7f);
} while (c & 0x80);
}
return (value);
}
Manque de bol c'est du C donc j'y comprend que dalle et cette saloperie d'opérateur <<= je l'ai trouvé nul part donc je sais pas ce que c'est.
Salut Cari : la fonction de f0xi AllToBinStr(const Buffer; const bSize : integer; var OutBinStr : string); pourrait éventuellement me dépanner. Mais je trouve ca lourd tout ca pour déplacer 4 octets . Ca fait pas propre à mon gout (Je sais je suis chiant mais apres c'est qui qui va se faire gronder quand il va poster le source???? C'est francky ).
Je vais voir du coté de l'Assembleur (En même temps mon pc est plus sous garantis donc j'hésite : l'asm peut etre dangereux sous les mains de Francky )
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 7 mai 2008 à 16:05
Elle est où la contrepèterie dans le titre ??
procedure Virons4Bits (var v: longword);
begin v := v and $7F7F7F7F;
v : = (v+ v and $7F) div 2; // 2^7 - 1
v := (v + v and $3FFF) div 2; // 2^14 - 1
v : = (v + v and $1FFFFF) div 2; // 2^21 - 1
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 7 mai 2008 à 16:33
Ou alors :
procedure Virons4BitsEncore(var v : longword);
type TTabByte = array [0..3] of byte;
var TByte : TTabbyte absolute v; // TByte et v partagent les mêmes octets
begin v: = Tbyte[0] and $7f + (Tbyte[1] and $7f)*$80 + (Tbyte[2] and $7f)*$4000 + (Tbyte[3] and $7f)*$200000;
end;
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 7 mai 2008 à 23:09
et en corrigant l'erreur de ton exemple (si c'est réellement une erreur) de Septet en Octet
ça le fait très bien ^^
10000001 10110001 10110001 10110001 Devient
Vous avez pas compris En fait il faut supprimer les premiers bits de chaque octet, coller ce qui reste. Et mettre à gauche 4 zéros pour tomber sur 32 bits.
"Since 81 is larger than 80, you can see that the 00 byte is also
part of the VLV. Lets look at 81 00 in binary notation:
10000001 00000000
Separate the continuation bit from the data bits:
1 0000001 0 0000000
Now you can see in binary notation what you can also see in hex notation --
that the first byte expects at least one more byte to follow it in the VLV.
Remove the continuation bits:
0000001 0000000
This is the actual number that is represented by the VLV value <tt>81 00</tt>,
but maybe we should convert to decimal or hex so you understand it better.
First, combine all of the bits into one clump:
00000010000000
I will convert first to hexadecimal, and later to decimal. For hexadecimal
conversion of a binary number, arrange the digits into groups of 4, starting
with the least siginificant (smallest, right) side of the number:
00 0000 1000 0000
There are two zeros left on the left size, so add two more zeros to make a
grouping of four digits:
0000 0000 1000 0000
We can do this in decimal notation to show why this can be done:
the number 0045 and 45 are the same number.
Now, convert the binary groupings into hexadecimal digits:
0000 0000 1000 0000"
0 0 8 0
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 8 mai 2008 à 05:33
ils sont virés automatiquement il me semble puisqu'il n'influent pas sur le résultat
10110001 0110001 0110001 2906289 $2C58B100000000 00101100 01011000 10110001 2906289 $2C58B1