DOTAZ:Jak jsem v ramci promenne "int" pouzival i nejvyssi bit, ktery je pro urceni zaporneho cisla, zacal jsem mit logicky problem s tim, ze pouzivam "int", co je v poradku, nicmene jak jsem to zmenil na "uint", nektere prikazy zacali mit s timhle problem.
Myslim ze treba:
Kód:
byte[] y = r.ReadBytes(4);
Zkousel jsem to pretypovat, ale bez vysledku a treba jsem to delal spatne. Tak jsem promennou kde potrebuji vsech 32 bitu zmenil na 64 bitovy "long" a bylo po problemu.
Jde to nejak i s "uint", nebo mam zustat u "long"?
Ja pak tedy vic promennych budu muset dat na "long", protoze plne vyuzivam vsechny 4 bajty i ten nejvyssi s "int / uint" zatim problemovym.
SPLKNUTI:Pridal jsem rychlost hrani skladby, co mela byt brnkacka, ale 1-2 hodiny jsem prichazel na to, ze mi tracker v Amize pise prikaz pro rychlost "9", ale primo v nactenem MODu je obdoba prikazu pro rychlost a to prikaz "F", co jsem videl az v HEXa editoru.
Zkoumal jsem efekt Arpeggio a ten zatim nebud prevadet kvuli tomu ze ma hudebni rutina s nim pracuje jinak nez tracker na Amize. Mozna jej casem v me hudebni rutine prizpusobim, uvidim.
Zkoumal jsem i efekt Volume Slide i primo v mem ASM kodu a zpracoval dalsi 4 byte z meho hudebniho formatu, kde se pracuje i s timhle efektem, ale s nim se pracuje i v dalsich poslednich 4 byte. Jsou jeste dalsi 4 byte, ale ty slouzi pouze na opakovani useku skladby a delam tam skok primo na adresu tedy absolutni adresaci. Jako vsechny hudebni efekty i Volume Slide je osekany vuci MODu, ale ma dle vseho i neco navic a to je svuj casovac. Tedy dokazu o rychlosti hrani skladby treba 5 cyklech kazde napriklad 3 cykly menit hlasitost pomoci tohohle efektu. Ale to je jen dobre pri primem pristupu na HW registre (co ma vice omezeni), nez je to u trackerech s elektronickym prepoctem velikosti sinusovky (hlasitosti) daneho samplu.
Jeste jsem hledal 1 chybu v kodu ...Dva krat "IF" bez 1 slozenych zavorek, pak jsem se divil, ze proc mi to za timhle kodem nebere kominaci ELSE/IF, ktera mela stacit, ale pouze IF...
Predposledni dulezita sekvence 4 bytu v mem hudebnim formatu:
Kód:
*********************************************************************************
* predsekvence arpeggio / rychlost hrani skladby / volume slide kanal 1-3 (0-3) *
*********************************************************************************
pocet bitu 32 / funkce
------------------------------------------------------------
1 volume slide zesilit (0=zeslabit) 1.kanal (0-3)
1 volume slide? 1.kanal
6 arpeggio 1.ton (0-3) ze stupnice
1 volume slide zesilit (0=zeslabit) 2.kanal (0-3)
1 volume slide? 2.kanal
6 arpeggio 2.ton (0-3) ze stupnice
1 volume slide zesilit (0=zeslabit) 3.kanal (0-3)
1 volume slide? 3.kanal
6 arpeggio 3.ton (0-3) ze stupnice
------------------------------------------------------------
1 predsekvence
2 sampl, hlasitost, arpeggio, pattern (01,10,11,00)
5 casovac - rychlost hrani skladby
(0.ton pro arpeggio se zadava primo ve formatu)
Nova cast kodu:
Kód:
//ARPEGGIO + rychlost hrani skladby
//if (hex0 == 0x09) // v hex je 9 v MOD formatu pro rychlost hrani skladby
else
if (hex0 == 0x0f) // v hex je F/9 v MOD formatu pro rychlost hrani skladby
{
hex0 = y[3] -1; //rychlost hrani skladby -1
sekvenceArpeggio = sekvenceArpeggio ^ hex0;
}
//sekvenceArpeggio = sekvenceArpeggio ^ hex0;
else
if (hex0 == 0x0d) // v hex je D v MOD formatu pro efekt Volume Slide, misto D muze byt i A (Protracker...)
{
switch (KzpracuvanyPRG)
{
case 1: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x40000000; //kanal 1
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x80000000;
break;
case 2: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00400000; //kanal 2
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00800000;
break;
case 3: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00004000; //kanal 3
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00008000;
break;
}
}
Konzolovy vystup:
Kód:
C:\WinUAE HDD\C# programovani> dotnet run
183D1B13 000080A2 1C0000C3 000000E5 (E5 - rychlost hrani skladby 5 (0-31) )
Cely kod:
Kód:
class Program
{
static void Main()
{
//ushort s = 1084; // pozice 1.frekvence v MODu
//ushort i; // index hrajici frekvence pro format CMR
//int i2; // index hrajiciho samplu
ushort[] oktava = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
856,808,762,720,678,640,604,570,538,508,480,453,
428,404,381,360,339,320,302,285,269,254,240,226,
214,202,190,180,170,160,151,143,135,127,120,113 };
// cislo samplu 0-3, 9 = volna pozice pro sampl
int KzpracuvanyPRG = 0; //pro jednotlive cykly (kanal 0-3) pri nacteni dat o hrajicim SMP z MODu
int[] smpKprirazeniCMR = {0, 0, 0, 0, 0}; //pri nove hrajicim SMP zvyseni o 1(kanal 0-3, 4.poz.nevyuzita)
int[] smpKanal0az3 = {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //20 pozic
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //20 pozic
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //20 pozic
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; //20 pozic
int[] smpKhraje = {9, 9, 9, 9, 9}; // kanal 0-3, 4.pozice nevyuzita
//string sekvenceSmp = "\x000000a0"; // nejnizsi byte predsekvence sampl v bitech "101"0 0000
string sekvenceTony = "";
int sekvenceSmp = 0x000000a0; // nejnizsi byte predsekvence SMP v bitech "101"0 0000
int sekvenceVol = 0x000000c0; // nejnizsi byte predsekvence VOL v bitech "110"0 0000
long sekvenceArpeggio = 0x000000e0; // nejnizsi byte predsekvence ARP v bitech "111"0 0000
//string hex2 = string.Empty;
// 1.
// Open as binary file.
using (BinaryReader r = new BinaryReader(File.Open("Aladdin_Menu.mod", FileMode.Open)))
//FileStream fs6 = new FileStream("Aladdin.mod", FileMode.Open);
//StreamWriter r = new StreamWriter(fs6);
{
using (BinaryWriter w = new BinaryWriter(File.Open("mydata.txt", FileMode.Create)))
//FileStream fs7 = new FileStream("mydata.txt", FileMode.Create);
//StreamWriter w = new StreamWriter(fs7);
{
// Seek the required index.
ushort i; // index hrajici frekvence pro format CMR
int s = 1084, perioda, cisloSmp; //perioda = format MOD, cisloSMP = format MOD
int hex0;
string hex1; //, sekvenceTony = "";
byte[] y2 = {255, 255, 255, 255};
for (int radek = 0; radek < 4; radek++)
{
r.BaseStream.Seek(s, SeekOrigin.Begin);
{
//byte[] y = r.ReadBytes(2);
byte[] y = r.ReadBytes(4);
//TONY
//hex0 = y[0];
//hex0 = (int(hex0));
hex0 = y[0] << 8;
hex0 = hex0 + y[1];
perioda = hex0 & 0x0fff;
i = 1;
while (oktava[i] != perioda)
i++;
if (perioda == 0)
i = 61;
hex1 = string.Format("{0:X2}", i);
sekvenceTony = sekvenceTony + hex1;
w.Write(hex1.ToCharArray());
//SAMPLE
cisloSmp = y[0] & 0xf0;
hex0 = (y[2] & 0xf0) >> 4;
cisloSmp = cisloSmp ^ hex0;
hex0 = (KzpracuvanyPRG * 20) + cisloSmp; //index samplu
if ((cisloSmp != 0) && (smpKanal0az3[hex0] == 9)) //bude se hrat sampl uplne poprve?
{
smpKanal0az3[hex0] = smpKprirazeniCMR[KzpracuvanyPRG]; //ano, prirad samplu cislo ve formatu CMR
//smpKhraje[KzpracuvanyPRG] = smpKanal0az3[hex0]; //zapsat prave hrajici sampl do vybraneho kanalu
smpKprirazeniCMR[KzpracuvanyPRG] = smpKprirazeniCMR[KzpracuvanyPRG] + 1; //pro dalsi mozny-
//-sampl zvys cislo ve formatu CMR o 1
}
//Console.Write(KzpracuvanyPRG);
if (smpKhraje[KzpracuvanyPRG] != smpKanal0az3[hex0]) //puvodni hrajici SMP != SMP co se ma hrat
{
switch (KzpracuvanyPRG)
{
//if (KzpracuvanyPRG == 0) //kanal 0
//{
case 0:
sekvenceSmp = sekvenceSmp ^ 0x2; //aktivace bitu pro nahrani samplu pro kanal 0
hex0 = smpKanal0az3[hex0] << 2; //bity pro cislo SMP pro kanal 0 na spravnou pozici pro sekvenci SMP
break;
case 1:
sekvenceSmp = sekvenceSmp ^ 0x0100;
hex0 = smpKanal0az3[hex0] << 9;
break;
case 2:
sekvenceSmp = sekvenceSmp ^ 0x8000;
hex0 = smpKanal0az3[hex0] << 12;
break;
case 3:
sekvenceVol = sekvenceVol ^ 0x2; //poslední SMP v kanalu se zpracovava v sekvenci Volume
hex0 = smpKanal0az3[hex0] << 2;
sekvenceVol = sekvenceVol ^ hex0; //SMP pro posledni kanal se aktivuje v predsekvenci Volume!
break;
}
if (KzpracuvanyPRG < 3) sekvenceSmp = sekvenceSmp ^ hex0;
}
//sekvenceSmp = sekvenceSmp ^ hex0;
hex0 = (y[2] & 0x0f);
if (hex0 == 0x0d) // v hex je D v MOD formatu pro efekt Volume Slide, misto D muze byt i A (Protracker...)
{
if (KzpracuvanyPRG == 0)
sekvenceSmp = sekvenceSmp ^ 0x1;
}
//HLASITOST + 1 SAMPL (+ 1 sampl se zpracovava v kodu vyse)
//hex0 = (y[2] & 0x0f);
else
if (hex0 == 0x0c) // v hex je C v MOD formatu pro hlasitost
{
if ((s == 1084) || (s != 1084) && (y[3] != y2[KzpracuvanyPRG])) //uplne 1.radek paterrnu || dalsi radky patternu && jina hlasitost nez posledne nastavena?
{
y2[KzpracuvanyPRG] = y[3]; //do y2 nova uroven hlasitosti
switch (KzpracuvanyPRG)
{
case 0: hex0 = y[3] -1 <<26; break; //kanal 0
case 1: hex0 = y[3] -1 <<20; break; //kanal 1
case 2: hex0 = y[3] -1 <<14; break; //kanal 2
case 3: hex0 = y[3] -1 << 8; break; //kanal 3
}
sekvenceVol = sekvenceVol ^ hex0 ^ 0x1;
}
}
//ARPEGGIO + rychlost hrani skladby
//if (hex0 == 0x09) // v hex je 9 v MOD formatu pro rychlost hrani skladby
else
if (hex0 == 0x0f) // v hex je F/9 v MOD formatu pro rychlost hrani skladby
{
hex0 = y[3] -1; //rychlost hrani skladby -1
sekvenceArpeggio = sekvenceArpeggio ^ hex0;
}
//sekvenceArpeggio = sekvenceArpeggio ^ hex0;
else
if (hex0 == 0x0d) // v hex je D v MOD formatu pro efekt Volume Slide, misto D muze byt i A (Protracker...)
{
switch (KzpracuvanyPRG)
{
case 1: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x40000000; //kanal 1
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x80000000;
break;
case 2: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00400000; //kanal 2
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00800000;
break;
case 3: //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00004000; //kanal 3
if (y[3] > 15) //44332211
sekvenceArpeggio = sekvenceArpeggio ^ 0x00008000;
break;
}
}
}
s = s+4; //dalsi 4 byte z MODu pro zpracovani.
KzpracuvanyPRG = KzpracuvanyPRG + 1; // dalsi hudebni kanal pro zpracovani
}
Console.Write(sekvenceTony + " ");
hex1 = string.Format("{0:X8}", sekvenceSmp);
Console.Write(hex1 + " "); //sekvenceSmp
hex1 = string.Format("{0:X8}", sekvenceVol);
Console.Write(hex1 + " "); //sekvenceVol
hex1 = string.Format("{0:X8}", sekvenceArpeggio);
Console.Write(hex1); //sekvenceArpeggio
}
}
}
}