OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 16.04.2024, 17:06

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku Předchozí  1, 2, 3, 4  Další
Autor Zpráva
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 01.06.2023, 23:18 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Tak funguje :)

Načtení prvního tónu z hudebního formátu MOD.
-načtení 2 byte
-vynulování 4 nejvyšších bite (smazání info o samplu)
-zobrazení šestnáckově
-zobrazení dvojkově

MOD Aladdina jsem použil, protože v tom tónu používá tón využívající i vyšší 2.byte (celkově 2 byte). Chtěl jsem mít jistotu, že s tímhle bytem pracuji taky.

Kód:
class Program
{
    static void Main()
    {
        // 1.
        // Open as binary file.
        using (BinaryReader b = new BinaryReader(File.Open("Aladdin_Menu.mod",
                                                           FileMode.Open)))
        {
            // Seek the required index.
            b.BaseStream.Seek(1084, SeekOrigin.Begin); { 
                byte[] y = b.ReadBytes(2);
               
                int hex0 = (y[0]+255) + y[1];
                int SmpPerioda =  0x0fff;
                int perioda =  hex0 & SmpPerioda; 
                Console.WriteLine(perioda);

                string hex1 = string.Format("{0:X2}", perioda);
                Console.WriteLine(hex1);
               
                string bin = Convert.ToString(perioda, 2);
                Console.WriteLine(bin);

            }
        }
    }
}

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 05.06.2023, 22:54 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Načtení a převod prvních 4 tónů z MODu do mého hudebního formátu. Jsem tápal, jak správně a snadno zpracovat 2 byte jako 1 celé číslo, ale jak jsem viděl kód v C# s rotaci bitů, hned mně osvítilo.

Kód:
class Program
{
    static void Main()
    {

        int s = 1084;
        int i;

        int[] 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 };
        // 1.
        // Open as binary file.
        using (BinaryReader b = new BinaryReader(File.Open("Aladdin_Menu.mod",
                                                           FileMode.Open)))
        {
            // Seek the required index.
            //int s = 1084;
           
            for (int radek = 0; radek < 4; radek++)
            {
               
                    b.BaseStream.Seek(s, SeekOrigin.Begin); {     
                    byte[] y = b.ReadBytes(2);
   
                    int hex0 = (y[0] << 8);
               
                  //hex0 = (y[0]+255) + y[1];
                    hex0 = hex0 + y[1];

                    int SmpPerioda =  0x0fff;
                    int perioda =  hex0 & SmpPerioda; 
                 
                    i = 1;
                    while (oktava[i] != perioda)
                        i++;
                  //Console.ReadKey();


            Console.WriteLine(perioda);
            Console.WriteLine(i);

            string hex1 = string.Format("{0:X2}", i);
            Console.WriteLine(hex1);
               
            //string bin = Convert.ToString(i, 2);
            //Console.WriteLine(bin);
            //i = 1;
            s = s+4; }
            }
        }
    }
}


Výstup u MODu Aladdina :
1.číslo desítkově perioda (obrácená hodnota frekvence)
2.číslo desítkově převod na tón v mém formátu
3.číslo šestnáckově tón v mém formátu

Kód:
PS C:\WinUAE HDD\C# programovani> dotnet run
453
24
18
0
1
01
381
27
1B
604
19
13
PS C:\WinUAE HDD\C# programovani>


Ještě pak lépe zpracuji stav, kdy se tón nehraje (2.tón: 0,1,01).

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 07.06.2023, 11:58 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Tak dobře neznám C# (je to už hodně let, co jsem ho používal v Unity), ale pro jistotu bych byl opatrný s používáním typů a bitovými (ale i aritmetickými) operacemi nad nimi.
Docela mne překvapuje, že
Kód:
int hex0 = (y[0] << 8);

funguje, když y je deklarované jako pole bajtů a tedy posun o osm bitů by měl hodnotu spolehlivě vynulovat. Osobně bych to raději napsal takto
Kód:
int hex0 = (int)y[0] << 8;

(operátory bitového posunu mají myslím v jazycích nejnižší prioritu). Ale když to funguje, tak je to asi v pohodě...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 07.06.2023, 18:23 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1563
Has thanked: 487 times
Been thanked: 641 times
defor píše:
Tak dobře neznám C# (je to už hodně let, co jsem ho používal v Unity), ale pro jistotu bych byl opatrný s používáním typů a bitovými (ale i aritmetickými) operacemi nad nimi.
Docela mne překvapuje, že
Kód:
int hex0 = (y[0] << 8);

funguje, když y je deklarované jako pole bajtů a tedy posun o osm bitů by měl hodnotu spolehlivě vynulovat. Osobně bych to raději napsal takto
Kód:
int hex0 = (int)y[0] << 8;

(operátory bitového posunu mají myslím v jazycích nejnižší prioritu). Ale když to funguje, tak je to asi v pohodě...

To je zbytečné, protože by-default se výsledky všech aritmetických/bitových operací konvertujou do 32 bitů (int, uint), viz C++ (a v C# to nebude jiný, jen místo auto dej var),
Obrázek
V C++ se pak výsledek tiše osekne, pokud je hex0 deklarovaný jako BYTE (protože proč ne, třeba se výsledek fakt vejde to jednoho bajtu)
V C# by už kompilátor měl vynadat.

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 07.06.2023, 22:43 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Lisiak4 píše:
OS: Win 10
prostředí VS code s CP1250
Spouštím v terminálu pomocí dotnet run.


Jde mi o zapsání textu v binární podobě. Jen mi to na první pozici písmene háže 1 znak který nezapisuji, tedy je navíc. Když začnu psát text od 2.řádku, nechtěný znak se již nezapisuje. Když použiju další příkaz .Write, pro zapsání znaku do souboru, opět se zapíše znak navíc za text, který jsem zapsal pomocí prvního .Write.

Díky za radu, jak docílit, aby se mi zapisoval do souboru pouze text, který zapsat chci :) Vyzkoušel jsem více kódů i ten, kde se to takhle nemá chovat, ale mně se to takhle chová, tedy je tam špatně věc, kterou si neuvědomuji. Hlavní příkaz v kódu je BinaryWriter.

Možná je to tu už vyřešeno, tak se dyštak omlouvám, nicméně ten nechtěný první znak je automatický Enter, tuším 0x0D alá Char 13.

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 07.06.2023, 22:57 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
tomascz: používáš zápisy, co vidím prvně a asi ani nepotřebují používat. V tom prvním řádku kódu si asi chtěl dát do "y" náhodou hodnotu. Rand() bude asi smyšlená funkce (použil jsem výraz z Pythonu, když tak pardon). Pak jsem se musel podívat na operátor ::, ten má v C++ jiný význam než v C#. V ani v jednom případě jej asi nebudu používat. Promiň ale přijde mi to, jako by si trošku složitě, zapisoval ukázkový kód ;). K tomu přiřazení proměnné k typu var. Četl jsem nějaké diskuze a taky zastávám zatím názor, že to spíše znepřehledňuje kód a že pokud typ proměnné var nemusí být použit, tak by použit být neměl. Samozřejmě C# se učím a dělám si v něm můj 1.program. Můžu se v něčem plést a učím se za pochodu... .

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 08.06.2023, 07:28 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1975
Bydliště: Most, Praha
Has thanked: 870 times
Been thanked: 699 times
tomascz píše že to uvádí jako příklad z C++ ukazující, že se integer operace provádí automaticky jako 32(64)-bitová a není tedy potřeba přetypovat 8-bitový operand jak doporučuje defor. "::rand()" znamená C funkce rand() z libc knihovny z globálního jmenného prostoru, ale to tam nebylo důležité.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 08.06.2023, 08:33 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1563
Has thanked: 487 times
Been thanked: 641 times
Lisiak4: Tak to se omlouvám - použitím ::rand() jsem nechtěl, aby mi kompilátor dělal nějaký optimalizace konstant (protože ten samej kompilátor dělá nápovědy podržením kurzoru nad proměnnou, kde se ukázalo že vše menšího se konvertuje do 32 bitů i na 64 bitovým stroji). Jinak ano, je to C++, protože C# editor nemám doma ve Visual Studiu nainstalovanej.

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 08.06.2023, 19:06 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Pardon, já tu formulaci od @tomascz špatně přečetl a tedy i pochopil v rámci toho, v čem psal jeho příklad.

@Panda38: můžu tedy nechat mou formulaci
Kód:
int hex0 = (y[0] << 8);

A proto mi to tedy nešlo do chyby, protože se ty operace konvertují do 32 bitů... .

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 10.06.2023, 08:29 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
drobné splknutí
Tak včera jsem ještě koukal do mé hudební rutiny, aby jsem si ujasnil pár věcí ohledně práce s hudebním efektem vibrato a taky si obnovil informace ohledně tohohle, ale nechávám původní stav (v tónu hexa hodnota 3E + 1 bit). Uvažoval jsem jestli to nevyřeším pouze tím 1 bitem, ale původní řešení 3E + 1 bit je v kódu o něco efektivnější. Tenhle efekt je u formátu MOD natolik komplexní (verze Protacker, MED a jeho další nastavení), vůči mému vibratu, že definovat kód v C#, aniž bych dopředu věděl, jaká jeho verze je v nějaké skladbě MODu použita je minimálně prozatím zbytečná práce. Tenhle 1 bit pro aktivní vibrato přenáším s informací o hraní tónu, co jsem řešil výše. V zapisovaných 4 byte, budu přenášet zatím tedy pouze informaci a výšce hraného tónu, co je v každém 1 byte 6 bite (7 a 8 bite zatím vynechám).

programování v C#
Začal jsem zapisovat data do souboru pomocí BinaryWriter, ale když použiju kód:
Kód:
w.Write(hex1);

ve výše uvedeném programu, tak se mi před každý byte zapíše charakter STX (v hexa je to číslo 02).
Kód:
183D1B13


Zkoušel jsem to useknout dle příkladů na internetu, zadat kódování, ale mé postupy nevyřešili můj problém.

Mám ale 1 řešení, ze kterého nemám zrovna dobrý pocit, ale funguje :)
Je to tohle
Kód:
w.Write(hex1[0]);
w.Write(hex1[1]);

Musím to zapisovat takhle zvlášť po 1 byte, když jsem se to snažil alespoň sloučit, aby jsem to mohl zapsat pouze jedním Write, opět mi do souboru byl zapsán i charakter STX.

Asi to jde řešit i elegantněji?

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 10.06.2023, 10:17 
Offline
Kecka

Registrován: 08.06.2016, 18:25
Příspěvky: 48
Has thanked: 5 times
Been thanked: 21 times
hex1 je string, proto metoda Write zapíše nejprve délku řetězce (2) a pak ty znaky samotné.
BinaryWriter má ještě přetíženou metodu Write(char[]), takže cíle dosáhneš i takto:

Kód:
w.Write(hex1.ToCharArray());

_________________
http://maximalne.8u.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 10.06.2023, 10:32 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Supr, použito, děkuji! :like:

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 19.06.2023, 20:36 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Pouze info / splknutí:

Dnes první verze pro zpracovaní druhé čtverice bytů. Již jen stav kdy se tyhle 4 byte nezapíší pokud nebudou přenášet informaci, protože jsou v hudebním formátu nepovinné. Zpracovává se zde info o nahrání třech ze čtyřech samplů. 2 Byte nezpracovávám (nahrání 5.samplu v 1 řádku patternu). Ty by mohli zpracovat i ten 4.sampl, ale ta funkce toho umí více a je pravdou, že tohle je věc, co se mi u mého formátu libí nejmíň, když se běžné použití 4.samplu načítá ve třetí čtverici bytů.

obsazení 4 bytů pro načtení samplů:

Kód:
*****************************************************
* predsekvence sampl (s casovacem pro 3.kanal, 0-3) *
*****************************************************
 pocet bitu 32 / funkce
-------------------------------------------
 6 frekvence samplu (casovac, 3.kanal)
 1 ztlumeni samplu? (casovac, 3.kanal)
 1 nahrat sampl?    (casovac, 3.kanal)
-------------------------------------------
 3 sampl 1-8        (casovac, 3.kanal)
 5 casovac - 2.sampl         (3.kanal)
-------------------------------------------
 1 nahrat sampl? (2.kanal)
 3 sampl 1-8     (2.kanal)
 3 sampl 1-8     (1.kanal)
 1 nahrat sampl? (1.kanal)
-------------------------------------------
 1 predsekvence
 2 sampl, hlasitost, arpeggio, pattern (01,10,11,00)
 3 sampl 1-8     (0.kanal)
 1 nahrat sampl? (0.kanal)
 1 volume slide? (0.kanal)


Hlavní část přidaného kódu v C#:
Kód:
        byte[] y = r.ReadBytes(4);
                   
        cisloSmp = y[0] & 0xf0;
        hex0 = (y[2] & 0xf0) >> 4;
        cisloSmp = cisloSmp ^ hex0;

        hex0 = (smpKzpracuvanyPRG * 20) + cisloSmp;                 //index samplu
         
        if ((cisloSmp != 0) && (smpKanal0az3[hex0] == 9))         //bude se hrat sampl uplne poprve?
          {
          smpKanal0az3[hex0] = smpKprirazeniCMR[smpKzpracuvanyPRG]; //ano, prirad samplu cislo ve formatu CMR

          //smpKhraje[smpKzpracuvanyPRG] = smpKanal0az3[hex0]; //zapsat prave hrajici sampl do vybraneho kanalu
          smpKprirazeniCMR[smpKzpracuvanyPRG] = smpKprirazeniCMR[smpKzpracuvanyPRG] + 1; //pro dalsi mozny-
                                                                      //-sampl zvys cislo ve formatu CMR o 1
          }
          //Console.Write(smpKzpracuvanyPRG);
        if (smpKhraje[smpKzpracuvanyPRG] != smpKanal0az3[hex0]) //puvodni hrajici SMP != SMP co se ma hrat
          {
            if (smpKzpracuvanyPRG == 0)       //kanal 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
            sekvenceSmp = sekvenceSmp ^ hex0; //zapsani cisla hrajiciho SMP pro kanal 0           
            }
            if (smpKzpracuvanyPRG == 1)       //kanal 1
            {
            sekvenceSmp = sekvenceSmp ^ 0x0100;
            hex0 = smpKanal0az3[hex0] << 9;
            sekvenceSmp = sekvenceSmp ^ hex0;           
            }
            if (smpKzpracuvanyPRG == 2)       //kanal 2
            {
            sekvenceSmp = sekvenceSmp ^ 0x8000;
            hex0 = smpKanal0az3[hex0] << 12;
            sekvenceSmp = sekvenceSmp ^ hex0;           
            //Console.Write(sekvenceSmp + " ");
            }
          }


Výstup, čtverice bytů oddělená mezerou. První 4 byte = 4 tóny, druhé 4 byte = 3 sample
Kód:
183D1B13 000080A2


Celý kód:
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 smpKzpracuvanyPRG = 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
  int sekvenceSmp = 0x000000a0; // nejnizsi byte predsekvence sampl v bitech "101"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, hex0, perioda, cisloSmp;
    string hex1, sekvenceTony = "";

    for (int radek = 0; radek < 4; radek++)
      {
      r.BaseStream.Seek(s, SeekOrigin.Begin);
        {
        //byte[] y = r.ReadBytes(2);
        byte[] y = r.ReadBytes(4);
                   
        cisloSmp = y[0] & 0xf0;
        hex0 = (y[2] & 0xf0) >> 4;
        cisloSmp = cisloSmp ^ hex0;

        hex0 = (smpKzpracuvanyPRG * 20) + cisloSmp;                 //index samplu
         
        if ((cisloSmp != 0) && (smpKanal0az3[hex0] == 9))         //bude se hrat sampl uplne poprve?
          {
          smpKanal0az3[hex0] = smpKprirazeniCMR[smpKzpracuvanyPRG]; //ano, prirad samplu cislo ve formatu CMR

          //smpKhraje[smpKzpracuvanyPRG] = smpKanal0az3[hex0]; //zapsat prave hrajici sampl do vybraneho kanalu
          smpKprirazeniCMR[smpKzpracuvanyPRG] = smpKprirazeniCMR[smpKzpracuvanyPRG] + 1; //pro dalsi mozny-
                                                                      //-sampl zvys cislo ve formatu CMR o 1
          }
          //Console.Write(smpKzpracuvanyPRG);
        if (smpKhraje[smpKzpracuvanyPRG] != smpKanal0az3[hex0]) //puvodni hrajici SMP != SMP co se ma hrat
          {
            if (smpKzpracuvanyPRG == 0)       //kanal 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
            sekvenceSmp = sekvenceSmp ^ hex0; //zapsani cisla hrajiciho SMP pro kanal 0           
            }
            if (smpKzpracuvanyPRG == 1)       //kanal 1
            {
            sekvenceSmp = sekvenceSmp ^ 0x0100;
            hex0 = smpKanal0az3[hex0] << 9;
            sekvenceSmp = sekvenceSmp ^ hex0;           
            }
            if (smpKzpracuvanyPRG == 2)       //kanal 2
            {
            sekvenceSmp = sekvenceSmp ^ 0x8000;
            hex0 = smpKanal0az3[hex0] << 12;
            sekvenceSmp = sekvenceSmp ^ hex0;           
            //Console.Write(sekvenceSmp + " ");
            }
          }
        //sekvenceSmp = sekvenceSmp + " " + cisloSmp;

          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());
          s = s+4;
          smpKzpracuvanyPRG = smpKzpracuvanyPRG + 1;
          }
        }
      hex1 = string.Format("{0:X8}", sekvenceSmp);
      Console.Write(sekvenceTony + " ");
      Console.Write(hex1); //sekvenceSmp

      }
    }
  }
}

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 24.06.2023, 13:54 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Pouze splnutí...

Včera jsem dokončil převod hlasitosti do mého hudebního formátu. Nastavení hlasitosti v mým formátu opět není povinné pro každý zahraný tón (pouze při změně). Když jsem tuhle skutečnost aplikoval do převodu, šel jsem na to blbě, protože jsem dělal porovnání změny hlasitosti pouze s předešlým řádkem patternu, co je blbost. A tak vznikla proměnná "y2". Dnes jsem si uvědomil, že pro 4 hudební kanály potřebuji 4 promenné a tak vniklo pole "byte[] y2 = {255, 255, 255, 255};". Hlasitost se pohybuje od 0 do 63 a před použitím v registry na počítači Amiga se hodnota zvyšuje o 1, čím se dostáváme na hlasitost 1-64 (64 je maximální hlasitost u Amigy). Počáteční hodnotou 255 v "y2" si pouze zabezpečím, že úplně první nastavení hlasitosti proběhne vždy. Dost mne pobavilo, když jsem chtěl zapsat do pole s "y2" více hodnot. Dělal jsem to prvně a pouze oddělení čárkou mi nestačilo. Hranaté závorky nic, kulaté nic. "Do prde.." jak se to tam zadává. Net... ááááá složené závorky, C# skoro jsem zapomněl ... :lol:

Ještě do převodu pak přidám zpracování toho 1 samplu. Jo a velice rád jsem si osvojil příkaz "switch". Rovno jsem jej dal i do předešlé části kódu pro předsekvenci sampl.

Jinak si je třeba uvědomit, že hudební trackery uchovávají i předvolenou hodnotu hlasitosti a pokud se ve skladbě v MODu použije zahrání tónu bez nastavení hlasitosti, je použita předvolená hlasitost. Někteří hudebníci to používají. Já jsem rád, že jsem rád a proto si beru data o hlasitosti pouze z MODu. U převodu takové skladby z MODu na můj formát by jsem tedy musel do MODu u tónů s předvolenou hlasitostí dopsat hlasitost ručně i přímo do skladby (MODu). Ale vůči kompletnímu ručnímu psaní celé skladby v mém hudebním formátu je to procházka růžovou zahradou :lol:

V mém hudebním formátu předsekvence hlasitost
Kód:
*************************************************************
* predsekvence hlasitost / zahrani samplu pro 3.kanal (0-3) *
*************************************************************
 pocet bitu 32 / funkce
-------------------------------------------
 6 hlasitost 1-64 - 0.kanal (0-3Fh)
-------------------------------------------
 6 hlasitost 1-64 - 1.kanal (0-3Fh)
-------------------------------------------
 6 hlasitost 1-64 - 2.kanal (0-3Fh)
-------------------------------------------
 6 hlasitost 1-64 - 3.kanal (0-3Fh)
-------------------------------------------
 1 predsekvence
 2 sampl, hlasitost, arpeggio, pattern (01,10,11,00)
 3 sampl 1-8 (3.kanal, 0-3)
 1 nahrat sampl 1-8? (3.kanal, zadani prvniho ze 2 samplu)
 1 pouzit nastaveni hlasitosti? (0-3.kanal)

 -nulova hlasitost se dosahuje primo ve formatu, kde se zadava ton pomoci 00
 -zadani 2.tonu a 2.samplu (pro 3.kanal, 0-3) pro hrani 2 samplu v 1 radku patternu
  se nastavuje v predsekvenci sampl.


Nově přidaná část kódu:
Kód:
//HLASITOST + 1 SAMPL

            hex0 = (y[2] & 0x0f);
            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;
              }
            }
            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


konzolový výstup po 4 bytech: tóny, sample, hlasitost (převod z MODu na můj hudební formát):

Kód:
PS C:\WinUAE HDD\C# programovani> dotnet run
183D1B13 000080A2 1C0000C0


celý kód:
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
    int sekvenceSmp = 0x000000a0; // nejnizsi byte predsekvence sampl v bitech "101"0 0000
    int sekvenceVol = 0x000000c0; // nejnizsi byte predsekvence sampl v bitech "101"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, hex0, perioda, cisloSmp;
        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] << 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;
              }
              if (KzpracuvanyPRG < 3) sekvenceSmp = sekvenceSmp ^ hex0;
            }
            //sekvenceSmp = sekvenceSmp ^ hex0;

//HLASITOST + 1 SAMPL

            hex0 = (y[2] & 0x0f);
            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;
              }
            }
            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

      }
    }
  }
}

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 03.07.2023, 00:45 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
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

      }
    }
  }
}

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku Předchozí  1, 2, 3, 4  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz