OldComp.cz

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


Právě je 27.04.2024, 09:45

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: 04.07.2023, 10:42 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
Tak již mám všechny proměnné maximálně na rozsahu "uint" (tedy ne na "long-u").

Vyřešil jsem to takhle:
Kód:
byte[] y3 = r.ReadBytes(4);
uint[] y = {y3[0],y3[1],y3[2],y3[3]};


Mám pak v kódu pouze 1 další pretypování, protože jsem proměnnou "y2" ponechal na rozsahu "byte"
Kód:
y2[KzpracuvanyPRG] = (byte)y[3]; //do y2 nova uroven hlasitosti

_________________
Amiga - PMD 85


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

Registrován: 08.07.2013, 00:28
Příspěvky: 1565
Has thanked: 487 times
Been thanked: 642 times
Lisiak4 píše:
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"?

Já jenom takovou jednu technickou - jestli se někdy budeš dotazovat na programovacích fórech (třeba Stackoverflow.com), tak tam tě zdrbnou za tenhle styl dotazů. Správně formulovanej dotaz má:

(1) stručně tvůj dotaz bez dalšího kontextu (např. Dá se nějak využívat horní bit int-u?)
(2) co je tvým cílem (např. Potřebuju používat horní bajt toho int-u samostatně)
(3) jak jsi to doposud vyřešil, pokud nějak (např. ukázka na minimum osekanýho programu/kontextu, kterej ti způsobuje problémy)

Když to budeš takhle psát i tady, tak ti určitě místní C#isti rádi a snadněji pomůžou ;-)

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďá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: 04.07.2023, 12:29 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
Diky za tip,

to bylo takové mé, na co se příště zaměřím i sám. Vyřesil jsem to snad lépe než zavádět "long-y". Jestli je to nejlepší alternativa těžko říci, ale průser to řešení za mně není. Horší pro mne bylo to načítání souboru MOD ze začátku a taky to použití:

w.Write(hex1.ToCharArray());

mi pomohlo :like:

_________________
Amiga - PMD 85


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

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
SPLKNUTI...

Vcera jsem dokoncil prevod z MODu na muj format vsech dulezitych veci. Koukal jsem, co by jeste melo smysl udelat a pridal jsem logiku, ktera pokud se hraje sampl a neni v patternu radku v MODu u nej i nastaveni hlasitosti a nastava i zmena hlasitosti vuci puvodne nastavene, tak se vezme prednastavena hlasitost pro dany sampl. Kazdy nastroj muze mit svou prednastavenou hlasitost. To ma smysl pro situaci, ze pri hrani tonu muzete pouzit i jiny efekt, ktery vam pouziti nastaveni hlasitosti neblokuje.

Zde je hlavni cast daneho kodu a priznam se, že jsem dokonce jiz u toho i musel celkem premyslet, ale ano vysledek vypada jiz jednoduse a prehedne:

Kód:
if ((y[2] & 0x0f) == 0x0e || (y[2] & 0x0f) == 0x00)
              {
                if ((s == 1084) || (s != 1084 && volKhraje[KzpracuvanyPRG] != prvniSetVolProSmp1az31mod[cisloSmp -1]))
                {
                  //hlasitost z prvniSetVolProSmp1az31mod
                  volKhraje[KzpracuvanyPRG] = prvniSetVolProSmp1az31mod[cisloSmp -1];
                  switch (KzpracuvanyPRG)
                  {
                    case 0: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 26; break; //kanal 0
                    case 1: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 20; break; //kanal 1
                    case 2: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 14; break; //kanal 2
                    case 3: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 <<  8; break; //kanal 3
                  }
                  sekvenceVol = sekvenceVol ^ hex0 ^ 0x1;
                }
              }


Pomoci hex editoru jsem se i musel podivat na samotny MOD, protoze tracker mi opet vse neukazoval. Pri nastaveni hlasitosti z prednastavene hodnoty, ktera se nachazi v MODu na zacatku mimo klasicky radek patternu trackeru prouziva MOD sve vlastni znaceni, ktere tracker Octamed neukazuje. Zatim odchytavam pro tenhle pripad hodnotu "0x0e" a nulovou hodnotu a uvidim.

Vyresil jsem i to, ze v mem formatu se nulova hodnotu hlasitosti zadava tam kde ton (tedy mimo nastaveni samotne hlasitosti). Z toho co jsem videl v C# mne nic lepsiho zatim nenapadlo. Potreboval jsem "vynulovat" vzdy 1 byte "string-u" tak jsem to udelal takhle:

Kód:
else
              if ((y[3] == 0) && (volKhraje[KzpracuvanyPRG] != 255)) //uplne 1.radek paterrnu || dalsi radky patternu && jina hlasitost nez posledne nastavena?
              {
                volKhraje[KzpracuvanyPRG] = 255; // 255 urcuje jiz zapsanou nulovou hlasitost v sekvenceTony (hodnota 0 je pro vysledni hlasitost 1)
                switch (KzpracuvanyPRG)
                {
                  case 0: sekvenceTony =                               "00" + sekvenceTony.Substring(2,6); break; //kanal 0
                  case 1: sekvenceTony = sekvenceTony.Substring(0,2) + "00" + sekvenceTony.Substring(4,4); break; //kanal 1
                  case 2: sekvenceTony = sekvenceTony.Substring(0,4) + "00" + sekvenceTony.Substring(6,2); break; //kanal 2
                  case 3: sekvenceTony = sekvenceTony.Substring(0,6) + "00"                              ; break; //kanal 3
                }
               
              }


Takhle vypada vystup z terminalu:
Kód:
PS C:\WinUAE HDD\C# programovani> dotnet run
183D1B13 000080A2 1C07DFC3 000000E5 00000080 32 36 16 64 64 64 64 64 64 0 32 32 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


dvouciferne cisla na konci zobrazuji vsechny prednastavene hodnoty hlasitosti pro kazdy sampl v desitkove soustave.
4 byte o hodnote 1C07DFC3 jsou data pro hlasitost v kazdem radku patternu presneji 3 byte 1C07DF, tedy 6 bite pro celkove 4 hudebni kanaly. Hodnota 1C0 pro kanal 0 a 1 a hodnota 7DF pro kanal 2 a 3. Hodnota 1C0 je braná z radku patternu MODu a nastavujeme v ni hlasitost pro kanal 0. Hodnota 7DF je braná z prednastavene hlasitosti pro nastroj, tedy z dat mimo radek patternu. Binarne je to 0111 1101 1111, tedy pro kanal 2 je hodnota 011111 a pro kanal 3 hodnota 011111 co odpovida hodnote v desitkove soustave 31. Ma hudebni rutina pak tuhle hodnotu pred pouzitim zvysuje o 1, cim se dostavame na spravnou hodnotu 32. Z tech 3 cisel 32 z prednastavenych hodnot u vystupu z terminalu u 2 cifernych cisel by to meli byt prvni 2 cisla 32, hraje se nastroj 1 a B.
Kód:
1/32 2/36 3/16 4/64 5/64 6/64 7/64 8/64 9/64 A/0 B/32 C/32 D/64 - nastroj / hlasitost desitkove


Jeste mne u C# zaujalo ze v prikazu "foreach" musi byt promenna "radek2" deklarovana primo v samotnem bloku prikazu:

Kód:
foreach (byte radek2 in prvniSetVolProSmp1az31mod)


Tedy nemuzu udelat:
Kód:
byte radek2;
foreach (radek2 in prvniSetVolProSmp1az31mod)


Vnimam to jako uzsi navaznost pro vnitrne striktnejsi kod u C#.
Uvidim jestli se v kodu vyskytnou jeste nejake chyby :)

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

    uint KzpracuvanyPRG = 0; //pro jednotlive cykly (kanal 0-3) pri nacteni dat o hrajicim SMP z MODu
   
                  //                    1  2  3  4  5  6  7  8  9  10 11
    uint[] prvniSetVolProSmp1az31mod = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    uint[] smpKprirazeniCMR = {0, 0, 0, 0, 0}; //pri nove hrajicim SMP zvyseni o 1(kanal 0-3, 4.poz.nevyuzita)
    uint[] smpPoleModCmr =  {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
    uint[] 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 = "";
    uint sekvenceSmp = 0x000000a0;      // nejnizsi byte predsekvence SMP v bitech "101"0 0000
    uint sekvenceVol = 0x000000c0;      // nejnizsi byte predsekvence VOL v bitech "110"0 0000
    uint sekvenceArpeggio = 0x000000e0; // nejnizsi byte predsekvence ARP v bitech "111"0 0000
    uint sekvencePattern = 0x00000080;  // nejnizsi byte predsekvence PAT v bitech "100"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
        uint perioda, hex0, cisloSmp; //perioda = format MOD, cisloSMP = format MOD
        string hex1; //, sekvenceTony = "";
        uint[] volKhraje = {255, 255, 255, 255};

        byte radek;
        uint s = 45;
        for (radek = 0; radek < 31; radek++)
        {
          r.BaseStream.Seek(s, SeekOrigin.Begin);
          {
            byte[] y3 = r.ReadBytes(1);
            prvniSetVolProSmp1az31mod[radek] = y3[0];
          }
        s = s +30;
        }

        s = 1084;
        for (radek = 0; radek < 4; radek++)
        {
          r.BaseStream.Seek(s, SeekOrigin.Begin);
          {
        //byte[] y = r.ReadBytes(2);
       
            byte[] y3 = r.ReadBytes(4);
            uint[] y = {y3[0],y3[1],y3[2],y3[3]};

//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)
            {
              if (smpPoleModCmr[hex0] == 9) //hraje se smp && bude se hrat sampl uplne poprve?
              {
                smpPoleModCmr[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] != smpPoleModCmr[hex0]) //hraje se smp && "if" puvodni hrajici SMP != SMP co se ma hrat
              {
                smpKhraje[KzpracuvanyPRG] = smpPoleModCmr[hex0];
                switch (KzpracuvanyPRG)
                {
                //if (KzpracuvanyPRG == 0)       //kanal 0
                //{
                  case 0:               
                  sekvenceSmp = sekvenceSmp ^ 0x2;  //aktivace bitu pro nahrani samplu pro kanal 0
                  hex0 = smpPoleModCmr[hex0] << 2;   //bity pro cislo SMP pro kanal 0 na spravnou pozici pro sekvenci SMP
                  break;

                  case 1:
                  sekvenceSmp = sekvenceSmp ^ 0x0100;
                  hex0 = smpPoleModCmr[hex0] << 9;
                  break;

                  case 2:
                  sekvenceSmp = sekvenceSmp ^ 0x8000;
                  hex0 = smpPoleModCmr[hex0] << 12;
                  break;

                  case 3:
                  sekvenceVol = sekvenceVol ^ 0x2; //poslední SMP v kanalu se zpracovava v sekvenci Volume
                  hex0 = smpPoleModCmr[hex0] << 2;
                  sekvenceVol = sekvenceVol ^ hex0; //SMP pro posledni kanal se aktivuje v predsekvenci Volume!
                  break;
                }
              }
              if (KzpracuvanyPRG < 3) sekvenceSmp = sekvenceSmp ^ hex0;

             
              //if ((y[2] & 0x0f) == 0x0e && y[3] == 0xd0)
              if ((y[2] & 0x0f) == 0x0e || (y[2] & 0x0f) == 0x00)
              {
                if ((s == 1084) || (s != 1084 && volKhraje[KzpracuvanyPRG] != prvniSetVolProSmp1az31mod[cisloSmp -1]))
                {
                  //hlasitost z prvniSetVolProSmp1az31mod
                  volKhraje[KzpracuvanyPRG] = prvniSetVolProSmp1az31mod[cisloSmp -1];
                  switch (KzpracuvanyPRG)
                  {
                    case 0: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 26; break; //kanal 0
                    case 1: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 20; break; //kanal 1
                    case 2: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 << 14; break; //kanal 2
                    case 3: hex0 = prvniSetVolProSmp1az31mod[cisloSmp -1] -1 <<  8; break; //kanal 3
                  }
                  sekvenceVol = sekvenceVol ^ hex0 ^ 0x1;
                }
              }
            }

            hex0 = (y[2] & 0x0f);
            if ((y[2] & 0x0f) == 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; //aktivace Volume Slide pro kanal 0
                if (y[3] > 15)
                {                                     //44332211
                  sekvencePattern = sekvencePattern ^ 0x00000010; //zesileni hlasitosti pro Volume Slide, 0 = zeslabeni hlasitosti
                  hex0 = y[3] << 4;    // ************************************************************************
                }                      // *hodnota zesileni a zeslabeni Volume Slide na stejnou pozici, MOD > CMR
                else hex0 = y[3] << 8; // ************************************************************************
                sekvencePattern = sekvencePattern ^ hex0; // zapis hodnotu zesileni/zeslabeni pro Volume Slide
              }
            }
             

//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] != volKhraje[KzpracuvanyPRG])) //uplne 1.radek paterrnu || dalsi radky patternu && jina hlasitost nez posledne nastavena?
              if ((s == 1084 && y[3] > 0) || (s != 1084 && y[3] > 0 && y[3] != volKhraje[KzpracuvanyPRG])) //uplne 1.radek paterrnu || dalsi radky patternu && jina hlasitost nez posledne nastavena?
              {               //y[3] > 0) a hlasitost je na urovni alespon 1 a vyssi
                volKhraje[KzpracuvanyPRG] = (byte)y[3]; //zapis novou 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;
              }
              else
              if ((y[3] == 0) && (volKhraje[KzpracuvanyPRG] != 255)) //uplne 1.radek paterrnu || dalsi radky patternu && jina hlasitost nez posledne nastavena?
              {
                volKhraje[KzpracuvanyPRG] = 255; // 255 urcuje jiz zapsanou nulovou hlasitost v sekvenceTony (hodnota 0 je pro vysledni hlasitost 1)
                switch (KzpracuvanyPRG)
                {
                  case 0: sekvenceTony =                               "00" + sekvenceTony.Substring(2,6); break; //kanal 0
                  case 1: sekvenceTony = sekvenceTony.Substring(0,2) + "00" + sekvenceTony.Substring(4,4); break; //kanal 1
                  case 2: sekvenceTony = sekvenceTony.Substring(0,4) + "00" + sekvenceTony.Substring(6,2); break; //kanal 2
                  case 3: sekvenceTony = sekvenceTony.Substring(0,6) + "00"                              ; break; //kanal 3
                }
               
              }
            }

//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; //aktivace Volume Slide kanal 1
                if (y[3] > 15)                          //44332211
                  sekvenceArpeggio = sekvenceArpeggio ^ 0x80000000; //zesileni hlasitosti pro Volume Slide, 0 = zeslabeni hlasitosti
                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;
              }
              if (KzpracuvanyPRG > 0)
              {
                if (y[3] > 15)
                  hex0 = y[3] << 4;    // ************************************************************************
                                       // *hodnota zesileni a zeslabeni Volume Slide na stejnou pozici, MOD > CMR
                else hex0 = y[3] << 8; // ************************************************************************
                sekvencePattern = sekvencePattern ^ hex0; // zapis hodnotu zesileni / zeslabeni pro Volume Slide

              }
            }

//PATTERN + hodtnota pro volume slide
          sekvencePattern = sekvencePattern ^ 0x1; //frekvence zmeny hlasitosti ve Volume Slide MOD nema, prednastavuji zatim 0x1 = kazdy 2.cyklus (0,1)

          }
          s = s+4; //dalsi 4 byte z MODu pro zpracovani.
          KzpracuvanyPRG = KzpracuvanyPRG + 1; // dalsi hudebni kanal pro zpracovani
        }

        //Console.WriteLine(sekvenceTony.Substring(0, 2) + "00" + sekvenceTony.Substring(4, 4));
        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
        hex1 = string.Format("{0:X8}", sekvencePattern);
        Console.Write(hex1+ " ");    //sekvencePattern

        //Console.Write(prvniSetVolProSmp1az31mod);

        foreach (byte radek2 in prvniSetVolProSmp1az31mod)
        {
          System.Console.Write("{0} ", radek2);
        }
      }
    }
  }
}

_________________
Amiga - PMD 85


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

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
konstatování...

C# se možná drobátko změnil v syntaxi? Nevšiml jsem si, že by mne předtím upozorňoval na něco, na co mně upozorňoval teď... .

Začal jsem si dělat nový jednoduchý program, který mi z hudebního formátu MOD vytáhne pouze data samotných patternů.

Použil jsem tedy opět pro načtení bytů syntaxi
Kód:
using (BinaryReader r = new BinaryReader(File.Open("Aladdin_Menu.mod", FileMode.Open)))


Ono mne prostředí C# upozorňovalo původně na víc věcí než na 1, ale to jsem eliminoval na 1 upozorňění. Na "new BinaryReader" mi prostředí dávalo dvě tečky u BinaryReader a nemyslím si, že bych si toho u původního kódu nevšiml, tak si myslím, že je to něco teď nového.

Ono se to upozornění u BinaryReader dá potlačit, ale mne zajímlo jak to udělat bez tohohle potlačení.

Pomohla mi až v dokumentaci tahle věc, kde mně to nasměrovalo, že by jsem v rámci syntaxe mohl napsat pouze "new" a ne "new BinaryReader" na kterou mně C# v upozornění směrovalo, ale všiml jsem si toho v té dokumentaci až později.

z dokumentace:
Kód:
// csharp_style_implicit_object_creation_when_type_is_apparent = true
C c = new();
C c2 = new() { Field = 0 };

// csharp_style_implicit_object_creation_when_type_is_apparent = false
C c = new C();
C c2 = new C() { Field = 0 };


Pak jsem si tedy ještě "byte[] y3;" deklaroval na začátku kódu a snad je to takhle ok.

Zdrojový kód:
Kód:
class Program
{
  static void Main()
  {
    string retezec;
    uint index;
    uint indexSoubor = 1084;
    byte[] y3;

    using (BinaryReader r = new(File.Open("Aladdin_Menu.mod", FileMode.Open)))
    {
      r.BaseStream.Seek(indexSoubor, SeekOrigin.Begin);
      y3 = r.ReadBytes(4);
    }

    for (index = 0; index < 4; index++)
    {
      retezec = string.Format("{0:X2}", y3[index]);
      Console.Write(retezec);
    }
  }
}

_________________
Amiga - PMD 85


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

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
Dnes ráno jsem si opět našel čas a zkusil pokračovat v předchozím kódu, kde chci načíst patterny hudebního formátu MOD.

První příkaz FOR jsem původně chtěl dát za USING, aby jsme zbytecne opakovane nenacital soubor ale C#-pu se to opet nepozdavalo, tak jsem první FOR dal pred USING. Jeste bych pak mel soubor asi i zavirat, ale to jsem ted neresil.

Dalsi vec, co se C#-pu nepozdavalo byl zapis:
indexSoubor = indexSoubor + 4;

tak jsem to dal instinktivne na:
indexSoubor = +4;
co se zdálo být ok, ale byla to chyba

tak jsem se podival do dokumentace a asi takhle:
indexSoubor += 4;
trochu nezvyk pro mne, ale urcite se na to da zvyknout :)

Nacteni prvnich 4 hudebnich kanalu z 1.radku patternu skladby ve formátu MOD a zobrazeni v hexa se tváří ok. Přidal jsem si tam i direktivu zápisu do paměti pro počítač Amiga.

Navrh spravnejsiho zapisu kodu vitany, zatim to mám takhle:

Kód:
class Program
{
  static void Main()
  {
    string retezec;
    uint index;
    uint index2;
    uint indexSoubor = 1084;
    byte[] y3;

    Console.Write(" dc.l");
    for (index = 0; index < 4; index++)
    {

      using (BinaryReader r = new(File.Open("Aladdin_Menu.mod", FileMode.Open)))
      {
        r.BaseStream.Seek(indexSoubor, SeekOrigin.Begin);
        y3 = r.ReadBytes(4);
      }

      if (index == 0)
        Console.Write(" $");
      else Console.Write(", $");

      for (index2 = 0; index2 < 4; index2++)
      {
        retezec = string.Format("{0:X2}", y3[index2]);
        Console.Write(retezec);
      }
      indexSoubor += 4;
    }
  }
}


Výstup:
Kód:
 dc.l $01C52C08, $00000F06, $017DBED0, $025C1E01

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 26.09.2023, 04:37 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.06.2023, 18:37
Příspěvky: 109
Bydliště: Pražák z Prahe, žádná náplava :)
Has thanked: 20 times
Been thanked: 27 times
Ono je to s tím zvětšováním logické, ale líp to vynikne u zmenšování (a samozřejmě je to takhle už od prvních návrhů Céčka), protože je potřeba rozlišit zvětšování/zmenšování o něco od přiřazování kladného/záporného čísla:

Kód:
cislo = - 2 ; // prirazeni zaporneho cisla
cislo -= 2 ; // jeho zmenseni o 2 na -4
cislo -= - 2 ; // jeho "zmenseni o -2" (tedy zvetseni o dve) zpet na -2


A když už tu píšu o těch základních operacích, tak index ++ je post-inkrementace, která vezme hodnotu proměnné index, zapamatuje si ji, pak proměnnou index zvětší ji jedna a uloží a pak vrátí tu zapamatovanou, nezvětšenou hodnotu, co měl index předtím.
V konstrukci for(;;index++){}; je to tak nějak jedno, protože se ta vrácená hodnota zapomene a nepoužije, stejně jako když to stojí samo na řádku, ale kvůli těm opičkám se zapamatováváním té hodnoty to může generovat delší kód (no, dnešní kompilátory si to určitě nějak vyoptimalizujou).
Druhá varianta je pre-inkrementace ++index, která vezme proměnnou index, zvětší ji o jedna a uloží a pak vrátí její hodnotu (tu zvětšenou, kterou má čerstvě v ruce). To se někdy překládalo kratším kódem. Proto bývalo zvykem tak, kde to bylo jedno, používat tento zápis. (klasicky v tom for(;;++index){}.)
V obou případech je pak proměnná index o jedna větší, ale pokud jsi nezahodil hodnotu toho výrazu, tak ta hodnota se liší
Kód:
int pole[]={0,1,2,3,4,5};
x=2;
a=pole[x++]; // a=pole[2];
// x=3

x=2;
a=pole[++x]; // a=pole[3];
// x=3

_________________
Spousta věcí chodí líp, když se zapne ...
http://micro-corner.gilhad.cz/, http://8bit.gilhad.cz/ a mnohé další


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

Registrován: 08.07.2013, 00:28
Příspěvky: 1565
Has thanked: 487 times
Been thanked: 642 times
Kód:
--x-=-x--;
je bohužel taky validní příkaz, jehož výsledkem pro počáteční int x=0 je -3 :-D
Viz tabulka předností operátorů (operace s pointery platí v unsafe regionech v C#), do které se dodnes občas dívám, protože si všechno nepamatuju.


Obrázek

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďá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: 26.09.2023, 17:07 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1980
Bydliště: Most, Praha
Has thanked: 874 times
Been thanked: 699 times
tomascz píše:
Kód:
--x-=-x--;
je bohužel taky validní příkaz, jehož výsledkem pro počáteční int x=0 je -3 :-D ...
Nevím jak C#, ale na podobné kombinace jsem doplatil v C++. MS VC++ měl jiné pořadí vyhodnocování levé a pravé strany než GCC, a tak dával jiný výsledek. Byl to příkaz myslím nějak jako *s++ = *s + 10.

_________________
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: 26.09.2023, 19:02 
Offline
Óm Nejvyšší
Uživatelský avatar

Registrován: 07.07.2019, 22:14
Příspěvky: 3829
Has thanked: 280 times
Been thanked: 457 times
Mrkvochvo$t musí mít všechno naopak, to je stará známá věc. Vždyť i lomítko na C:\ otočili...


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

Registrován: 23.03.2014, 20:13
Příspěvky: 2788
Has thanked: 230 times
Been thanked: 608 times
Závorky jsou jistota. Kdo si má těch čtrnáct úrovní priorit sakra pamatovat? :lol:

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


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

Registrován: 24.05.2018, 22:32
Příspěvky: 1980
Bydliště: Most, Praha
Has thanked: 874 times
Been thanked: 699 times
Nadbytek závorek jsem si navykl používat od doby, co mě párkrát vypekly bitové operátory. Nečekal jsem, že if(a == b & 1) se vyhodnotí jako if((a == b) & 1) a ne jako if(a == (b & 1)). MS VC++ dokonce v takovém případě zobrazí varování a doporučení k použití závorek, protože vědí že je ta definice divná a matoucí. Tak raději používám závorky už i v if(a == (b + 5)), což někteří nechápou.

_________________
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: 26.09.2023, 21:06 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2290
Bydliště: Brno
Has thanked: 848 times
Been thanked: 318 times
Panda38 píše:
Nadbytek závorek jsem si navykl používat od doby, co mě párkrát vypekly bitové operátory. Nečekal jsem, že if(a == b & 1) se vyhodnotí jako if((a == b) & 1) a ne jako if(a == (b & 1)). MS VC++ dokonce v takovém případě zobrazí varování a doporučení k použití závorek, protože vědí že je ta definice divná a matoucí. Tak raději používám závorky už i v if(a == (b + 5)), což někteří nechápou.

Dobré vědět tohle :like:

_________________
Amiga - PMD 85


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

Registrován: 08.07.2013, 00:28
Příspěvky: 1565
Has thanked: 487 times
Been thanked: 642 times
Panda38 píše:
tomascz píše:
Kód:
--x-=-x--;
je bohužel taky validní příkaz, jehož výsledkem pro počáteční int x=0 je -3 :-D ...
Nevím jak C#, ale na podobné kombinace jsem doplatil v C++. MS VC++ měl jiné pořadí vyhodnocování levé a pravé strany než GCC, a tak dával jiný výsledek. Byl to příkaz myslím nějak jako *s++ = *s + 10.

Jo, tyhle extrémní případy jsou vachrlatý - já to uved spíš jen pro pobavení než jako pozitivní příklad.

Já měl zase problémy v desetinných číslech. Zatímco všichni zkonvertujou číslo 5.55 na int jako 5 (tj. useknou desetinnou část), tak ne tak archaický MSVC1 z 90.let - to provede matematický zaokrouhlení na 6 :) A potom hledej chybu! :suicide:

Edit: Ale třeba se to dá nějak přepnout v rámci způsobu práce s desetinnýma číslama. Já to vyřešil přes floor() a dál to neštudoval , protože to bylo jediný použití desetinných čísel :-)

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďá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: 27.09.2023, 00:09 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Panda38 píše:
Nadbytek závorek jsem si navykl používat od doby, co...
V mojom pripade to bolo pisanie takych exotickych konstrukcii ako napr. toto:
Kód:
(defun otoc (a) (cond ((null a) nil)
            ((atom a) a)
            (t (append (otoc (cdr a)) (list (otoc (car a)))))))
(ale to sme uz asi mimo temy C#)


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 19 návštevní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