একটি এমআইডিআই ট্র্যাক প্রদর্শন করুন


17

পটভূমি

এমআইডিআই ফাইলগুলি ডাব্লুএইভি বা এমপি 3 অডিও ফাইলগুলির থেকে বেশ আলাদা। এমপি 3 এবং ডাব্লুএইভি ফাইলগুলিতে অডিওর "রেকর্ডিং" উপস্থাপন করে বাইট থাকে, যখন এমআইডিআই ফাইলগুলিতে এমআইডিআই ইভেন্টগুলিতে একটি এমআইডিআই বার্তাগুলি সঞ্চিত থাকে তবে কোন ভার্চুয়াল ইনস্ট্রুমেন্ট বা কোন মিডি সিকোয়েন্সার প্লেব্যাক টেম্পো ব্যবহার করা উচিত তা একটি এমআইডিআই সিন্থেসাইজারকে জানিয়ে দেয়। এই বার্তাগুলি ট্র্যাকগুলিতে সংরক্ষণ করা হয়, এবং ট্র্যাকের একটি সংগ্রহ একটি এমআইডিআই ক্রম তৈরি করে, যার ইভেন্টগুলি সিকোয়েন্সার দ্বারা বিশ্লেষণ করা যেতে পারে এবং এর বার্তাগুলি সিকোয়েন্সার থেকে একটি সিনথেসাইজারের রিসিভারে স্থানান্তরিত করতে পারে।

বেশিরভাগ সময় এমআইডিআই ইভেন্টগুলিতে সংরক্ষিত মিডি বার্তাগুলি নোট অন ম্যাসেজগুলি থাকে যা সিন্থেসাইজারকে কোনও নির্দিষ্ট নোট বাজাতে বলে বা নোট অফ বার্তাগুলি যা সংশ্লেষকে নোটটি বাজানো বন্ধ করতে বলে। এই বার্তাগুলিতে দুটি ডেটা বাইট থাকে, যার মধ্যে প্রথমটি নোটটির বেগের সংশ্লেষকে অবহিত করে (উচ্চতর বেগটি একটি উচ্চতর নোটের ফলস্বরূপ) এবং এর দ্বিতীয়টি সংশ্লেষকে নোটটি খেলতে বলে (অর্থাৎ মিডল সি)। ইভেন্টগুলি নিজেরাই টিকগুলি ধারণ করে যা মেসেজগুলি প্রেরণ করার সময় সিকোয়েন্সারকে বলার উদ্দেশ্যে কাজ করে।

চ্যালেঞ্জ

চ্যালেঞ্জটি হ'ল একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন যা একটি একক ট্র্যাক এমআইডি অনুক্রমের নোট অন এবং নোট অফ এমআইডি ম্যাসেজগুলির একটি সিরিজ বিশ্লেষণ করে এবং নির্দিষ্ট নোটগুলি কখন বন্ধ থাকে তা দেখানো একটি চার্ট বন্ধ করে দেয় এবং এই নোটগুলির বেগ চার্টের উল্লম্ব অক্ষটি নোট মানটি উপস্থাপন করে এবং নীচে বর্ণিত হিসাবে লেবেলযুক্ত হওয়া উচিত, এবং অনুভূমিক অক্ষটি এমআইডিআই টিকগুলিতে সময় উপস্থাপন করে (যদিও এটি জটিলতা এবং ব্যবধানের সমস্যাগুলি হ্রাস করার জন্য লেবেলযুক্ত থাকা উচিত)।

আপনার ইনপুটটি চারটি পৃথক অ্যারে বা তালিকাগুলি হতে পারে, যার মধ্যে প্রতিটি সংখ্যার পূর্ণসংখ্যার মান থাকে; একটি দ্বিমাত্রিক অ্যারে বা চারটি উপ-অ্যারে / উপ-তালিকা সমষ্টির পূর্ণসংখ্যার মানগুলির একটি তালিকা; বা অন্য কোনও সুবিধাজনক উপায়; এটি ট্র্যাকের নোট অন এবং নোট অফ বার্তাগুলির সাথে সংগ্রহের মিডি ইভেন্টগুলি উপস্থাপন করে। এই অ্যারেগুলির প্রথমটির মানগুলি নোটটি নির্দিষ্ট করে, দ্বিতীয় গতিবেগ, ইভেন্ট টিকের তৃতীয় নোট এবং চতুর্থ নোট বন্ধ ইভেন্ট টিক। উদাহরণস্বরূপ, প্রদত্ত চারটি অ্যারে যেমন:

{60, 62, 64, 65,  67}
{20, 40, 60, 80, 100}
{ 0,  4,  8, 12,  16}
{ 2,  6, 10, 14,  18}

প্রতিটি অ্যারের প্রথম উপাদানটি বিশ্লেষণ করে দুটি ইভেন্ট দেয়: একটি ইভেন্টে 0 টিক চিহ্নযুক্ত একটি বার্তা সহ একটি নোট অন কমান্ড, নোট 60 (মিডিল সি) এবং 20 নোটের বেগ নোট করুন; এবং একই ইভেন্টের সাথে টিক 2 এ একটি বার্তা রয়েছে যাতে একই নোট এবং বেগ সহ নোট অফ কমান্ড রয়েছে।

বিধি

চার্টটিতে বাম পাশের ক্রমহ্রাসমান ক্রমে (নোট মানটি উপস্থাপন করে) প্রদর্শিত নম্বর 0 থেকে 127 পর্যন্ত বৈশিষ্ট্যযুক্ত হওয়া উচিত, যখন নোটটি শুরু হয়, প্রতিটি নোটের সময়কাল (টিক বিয়োগ বিড়াল নোট অন টিক টিক) এবং নোটটির বেগ হবে। নোটগুলি উপস্থাপন করা প্রতীকগুলি তাদের বেগের উপর নির্ভরশীল:

  • 0-15: O
  • 16-31: =
  • 32-47: #
  • 48-63: -
  • 64-79: @
  • 80-95: +
  • 96-111: 0
  • 112-127: *

আপনি নিম্নলিখিত অনুমান করতে পারেন:

  • দ্রষ্টব্য এবং বেগের মানগুলি [0, 127] এর মধ্যে থাকবে।
  • চারটি অ্যারের প্রত্যেকটির দৈর্ঘ্য সর্বদা একে অপরের সমান হবে।

এখানে কিছু উদাহরণ আছে:

{60, 62, 64, 65,  67}
{20, 40, 60, 80, 100}
{ 0,  4,  8, 12,  16}
{ 2,  6, 10, 14,  18}

127|
126|
125|
...
67 |                00
66 |
65 |            ++
64 |        --
63 |
62 |    ##
61 |
60 |==
59 |
...
2  |
1  |
0  |


{60, 48, 62, 47, 64, 45,  65,  43, 67, 41, 65, 43, 64, 45,  62, 47, 60, 48}
{63, 31, 75, 90, 12, 23, 122, 104, 33, 19, 57, 42,  5, 82, 109, 86, 95, 71}
{0,   0,  2,  2,  4,  4,   6,   6,  8,  8, 10, 10, 12, 12,  14, 14, 16, 16}
{2,   2,  4,  4,  6,  6,   8,   8, 10, 10, 12, 12, 14, 14,  16, 16, 18, 18}

127|
126|
...
68 |
67 |        ##
66 |
65 |      **  --
64 |    OO      OO
63 |
62 |  @@          00
61 |
60 |--              ++
59 |
...
49 |
48 |==              @@
47 |  ++          ++
46 |
45 |    ==      ++
44 |
43 |      00  ##
42 |
41 |        ==
40 |
...
1  |
0  |

এখানে একটি উদাহরণ যা জয়কে ওডের প্রথম কয়েকটি নোট প্রদর্শন করে:

{48, 55, 64, 64, 65, 67, 55, 67, 65, 64, 62, 52, 55,  60,  60,  62,  64,  55, 64, 62, 62}
{45, 45, 63, 63, 63, 63, 89, 66, 66, 66, 66, 30, 30, 103, 103, 103, 103, 127, 55, 55, 55}
{ 0,  0,  0,  4,  8, 12, 16, 16, 20, 24, 28, 32, 32,  32,  36,  40,  44,  48, 48, 54, 56}
{16, 16,  2,  6, 10, 14, 32, 18, 22, 26, 30, 48, 48,  34,  38,  42,  46,  64, 50, 55, 64}

127|
...
67 |            --  @@
66 |
65 |        --          @@
64 |--  --                  @@                  00  --
63 |
62 |                            @@          00            - --------
61 |
60 |                                00  00
59 |
58 |
57 |
56 |
55 |################++++++++++++++++================****************
54 |
53 |
52 |                                ================
51 |
50 |
49 |
48 |################
...
0  |

আপনি 25% দ্বারা আপনার স্কোর হ্রাস করতে পারেন যদি ইনপুট হিসাবে একটি সত্যিকারের এমআইডিআই ক্রম নেয় তবে নোট অন এবং নোট অফ বার্তাগুলির বিশ্লেষণ করে আপনার পছন্দের কোনও ট্র্যাকের নোট অন এবং নোট অফ বার্তা এবং আউটপুট সহ কমপক্ষে চারটি ইভেন্ট রয়েছে উপরে বর্ণিত একটি তালিকা

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোড জয়ী। শুভকামনা!

উত্তর:


6

পিএইচপি , 127 + 571 = 698 মোট স্কোর *

ঠিক আছে, আমি বোনাস দাবি করছি। :) এটি একটি স্ট্যান্ডার্ড এমআইডিআই ফাইল নেবে এবং আউটপুট প্রদর্শন করবে।

স্কোরকে আরও তুলনীয় করে তুলতে আমি উপরের স্কোরকে মূল চ্যালেঞ্জ (নোটটি অন / অফ করে বিশ্লেষণ করুন এবং চার্ট হিসাবে প্রদর্শন করুন) এবং বোনাস চ্যালেঞ্জ (স্ট্যান্ডার্ড এমআইডিআই থেকে ইনপুট পড়ুন) এ ভাগ করেছি।

প্রধান: 170 বাইট - 25% = 127

মূল জন্য, ফাংশন $d()প্রয়োজনীয় অ্যারে নেয় এবং ASCII আউটপুট প্রদর্শন করে। নীচে সমস্ত পরীক্ষার এবং পরীক্ষা এমআইডিআই ফাইলের আউটপুট অন্তর্ভুক্ত রয়েছে।

$d=function($a){for($l=max($n=$a[0]);$l>=min($n);){$r=' |';foreach($n as$c=>$e)while($e==$l&$a[2][$c]<$a[3][$c])$r[++$a[2][$c]+1]='O=#-@+0*'[$a[1][$c]/16];echo$l--,$r,"
";}}

এটি অনলাইন চেষ্টা করুন!

বোনাস: 761 বাইট - 25% = 571

ফাংশনটি $m()একটি স্ট্যান্ডার্ড এমআইডিআই ফাইল লোড করবে (স্থানীয়ভাবে বা ইউআরএল দ্বারা) এবং সমস্ত এমআইডিআই ফাইল ট্র্যাকের জন্য নির্দিষ্ট নোট বিন্যাসে একটি অ্যারে সম্বলিত ট্র্যাকগুলির একটি অ্যারে প্রদান করবে।

$m=function($f){$a=function($f){do$s=($s<<7)+(($c=unpack(C,fread($f,1))[1])&127);while($c&128);return$s;};$r=function($n){foreach($n as$e){if($e[4]==9&&$e[1]>0)foreach($n as$y=>$f)if($f[0]==$e[0]&&($f[4]==8||($f[4]==9&&$f[1]==0))){$o[0][]=$e[0];$o[1][]=$e[1];$o[2][]=$e[2];$o[3][]=$f[2];$n[$y][4]=0;break;}}return$o;};$m=fopen($f,r);while($b=fread($m,8)){$z=unpack(N2,$b)[2];if($b[3]==d){$k=unpack(n3,fread($m,$z))[3]/4;}else{$t=0;$n=[];$d=ftell($m)+$z;while(ftell($m)<$d){$t+=$a($m);if(($e=unpack(C,fread($m,1))[1])==255){fread($m,1);if($w=$a($m))fread($m,$w);}else{if($e>127)list(,$e,$h)=unpack('C*',fread($m,($y=(240&$e)>>4)==12?1:2));else$h=unpack(C,fread($m,1))[1];if($y==9|$y==8)$n[]=[$e,$h,(int)round($t/$k),0,$y];}}if($n)$u[]=$r($n);}}fclose($m);return$u;};

এটি অনলাইনে দেখুন! স্পষ্টতই টিআইও দূরবর্তী অনুরোধ বা স্থানীয় ফাইলগুলিকে অনুমতি না দেওয়ার জন্য স্যান্ডবক্সযুক্ত, সুতরাং এটি কার্যকরভাবে দেখতে আপনাকে এই কোডটি স্থানীয়ভাবে চালাতে হবে। ডিসপ্লে ফাংশনে প্রথম [পরীক্ষাগুলি] [টিআইও-জ্রোয়া tu০ টি] পরীক্ষার এমআইডিআই ফাইলের অ্যারের ফলাফল অন্তর্ভুক্ত করে ।

এমআইডিআই ফাইল লোডের রুটিন অসম্পূর্ণ:

$m=fopen($f,'r');                           // m = midi file handle
while($b=fread($m,8)){                      // read chunk header
    $z=unpack('N2',$b)[2];                  // z = current chunk size
    if($b[3]=='d'){                         // is a header chunk?
        $k=unpack('n3',fread($m,$z))[3]/4;  // k = ticks per quarter note (you can change the 4 to 8 or 16 to "zoom in" so each char represents eights or sixteenth notes)
    }else{                                  // is a track chunk?
        $t=0;                               // track/chunk time offset starts at 0
        $d=ftell($m)+$z;                    // d = end of chunk file pos
        while(ftell($m)<$d){                // q = current file pos
            $t+=$a($m);                     // decode var length for event offset and add to current time
            if(($e=unpack('C',fread($m,1))[1])==255){ // is a META event 
                fread($m,1);                // read and discard meta event type
                if($w=$a($m))
                    fread($m,$w);
            }else{                          // is a MIDI event
                if($e>127) {                // is a new event type
                    list(,$e,$h)=unpack('C*',  // if is a prog change (0x0c), event is 1 byte
                        fread($m,($y=(240&$e)>>4)==12?1:2)); // otherwise read 2 bytes
                } else {                    // is a MIDI "streaming" event, same type as last
                    $h=unpack('C',fread($m,1))[1];
                }
                if($y==9|$y==8)             // if is a Note On or Note Off
                    $n[]=[$e,$h,(int)round($t/$k),0,$y];  // add note to output
            }
        }
        if($n)                              // if this track has notes,
            $u[]=$r($n);                    // add to array of output tracks ($u)
    }
}
fclose($m); // yes, could golf this out and rely on PHP GC to close it

"ওড টু জয়" এর একটি পরীক্ষা এমআইডিআই ফাইল যা এখানে ডাউনলোড করা যায় । উদাহরণ ব্যবহার:

$d( $m( 'beethoven_ode_to_joy.mid' )[0] );      // display first track

$d( $m( 'https://www.8notes.com/school/midi/piano/beethoven_ode_to_joy.mid' )[0] );

foreach( $m( 'multi_track_song.mid' ) as $t ) {  // display all tracks
    $d( $t );
}

"ওড টু জয়" এমআইডিআই ফাইল আউটপুট

67 |            0000++++                                                        00000000                                                                                                                        00000000
66 |
65 |        0000        ++++                                                0000        0000                                                              @@              @@                                0000        ++++
64 |++++++++                ++++                0000000000          00000000                0000                0000                        @@@@        @@  ----        @@  ----                ++++++++++++                ++++                0000
63 |
62 |                            ++++        0000          00++++++++                            ++++        0000    000000          @@@@----        ----            @@@@        ----    ----                                    ++++        0000    000000
61 |
60 |++++                            ++++0000                        0000                            ++++0000              ++00000000            ----            ----                ----            00000000                        ++++0000    ****      ++00000000
59 |                                                        ++++++++
58 |                                                                                                                                                                                                        00000000
57 |                                                                                                                                                                                ----                            ++++++++
56 |                                                                                                                                                                        --------
55 |++++++++++++++++++++++++00000000000000000000000000000000++++++++00000000000000000000000000000000000000000000000000000000        ----------------------------------------                --------                                        0000    ++++++++00000000
54 |                                                                                                                                                                                    ----
53 |                                                                                                                                                                                                                        ++++++++
52 |                                0000000000000000                                                0000000000000000                                                                                                                ++++0000                00000000
51 |
50 |
49 |
48 |++++++++++++++++                0000000000000000                0000000000000000                0000000000000000        ++++++++                                                                                                                        00000000

মন্তব্য

এমআইডিআই ফর্ম্যাটে নোট অন / নোট অফ ইভেন্টগুলি পারমাণবিক, যার অর্থ আপনি একটি নির্দিষ্ট নোটের জন্য একটি নির্দিষ্ট সময়ে একটি নোট অন ইভেন্ট দেখতে পান (ই 5 বলুন) এবং এটি বোঝানো হয়েছে যে এটি অন্য E5 নোটের জন্য একটি নোট অফ ইভেন্ট না হওয়া পর্যন্ত চলবে দেখা যাচ্ছে. যেমনটি, এটি এমআইডিআই ইভেন্টগুলি বিশ্লেষণ করে একটি প্রদত্ত নোট অন নোট অফ এর সাথে মিলিয়ে নেওয়া দরকার, এটির জন্য কোডটি যা297184 বাইট। এটিকে আরও জটিল করে তোলা, এটি মানক এমআইডিআই ফর্ম্যাটে মোটামুটি সাধারণ একটি পরবর্তী দ্রষ্টব্য নোট অন হিসাবে নোট অফ হিসাবে একই জিনিসকে উপস্থাপন করে তার সাথে মিল থাকা নোট অন দেখতে পাওয়া।

এটি এখন নোট অফের পরিবর্তে শূন্য-বেগ নোট অন রয়েছে এমন ফাইলগুলি সঠিকভাবে পড়বে, তাই বেশিরভাগ স্ট্যান্ডার্ড ফাইলগুলি খোলার উচিত।

আদেশ সহকারে

এটি কোনওভাবেই এমআইডিআই ফর্ম্যাটটির সম্পূর্ণ বাস্তবায়ন নয়, তবে আমি এটি এমআইডিআই ফাইলগুলির মোটামুটি বিস্তৃত সংগ্রহের সাথে পরীক্ষা করেছি এবং এটি সমস্ত সুন্দরভাবে পড়ে reads

এই জমাটি এখনও চূড়ান্তভাবে গল্ফ করা হয়নি, সুতরাং সম্পূর্ণরূপে সম্ভবত এটি আরও ছোট করা যেতে পারে। আমি মনে করি যে এটি 25% স্কোর হ্রাস বোনাস একটি স্ট্যান্ডার্ড এমআইডিআই ফাইল পড়ার জন্য প্রয়োজনীয় কোডটি অফসেট করবে এমনটা খুব কমই বলে। (বর্তমান) ক্ষুদ্রতম জমা হিসাবে যা কেবল ASCII প্রদর্শন করে106 65 বাইট, এটি এমআইডিআই ফাইল রুটিনগুলিতে প্রয়োগ করা প্রয়োজন 2521 বাইট বীট। আমি কাউকে চ্যালেঞ্জ জানাতে চাই (অন্তর্নির্মিত বা মডিউল ভাষা ব্যবহার না করে)। :)


এটি একটি দুর্দান্ত উত্তর। এই চ্যালেঞ্জটির দিকে ফিরে তাকালে, আমি সম্মত হই যে বোনাসের পরিমাণ সম্ভবত একটি এমআইডিআই ফাইল পড়ার ওভারহেডের জন্য অ্যাকাউন্ট করতে যথেষ্ট স্কোর কমবে না। (আমি মনে করি বোনাসগুলি আজকাল যেভাবেই নিরুৎসাহিত করা হয়েছে)) তবুও আমি খুব বোধ করি আপনি বোনাস চ্যালেঞ্জটি গ্রহণ করেছিলেন। আমি আপনাকে এটির জন্য একটি ভাল অনুদান দিতে পারি।
টিএনটি

@ টিএনটি, ধন্যবাদ! সত্যই এটি করা উপভোগ করেছে এবং এসএমএফ হিসাবে বোকা কিছু জন্য গল্ফ ফাইল ফর্ম্যাট রুটিন চেষ্টা চেষ্টা আকর্ষণীয় ছিল। দুর্দান্ত চ্যালেঞ্জ!
640KB

5

রুবি, 106 বাইট

এই মজা ছিল। আমি নিশ্চিত নই কেন কেন কেউ চেষ্টা করে নি।

এই ফাংশনটি চারটি অ্যারে আর্গুমেন্ট হিসাবে ইনপুট নেয় এবং চার্টের প্রতিটি লাইনের জন্য একটি স্ট্রিংয়ের অ্যারে প্রদান করে।

->a,*r{q=(0..z=127).map{|i|"%3d|"%(z-i)+" "*1e4}
a.zip(*r){|n,v,o,f|q[z-n][o+4]="O=#-@+0*"[v/16]*(f-o)}
q}

দ্রষ্টব্য: এই নির্বিচারে ধরে নেওয়া হয় যে 10,000 টির বেশি টিক্স থাকবে না। আপনি যদি এটি আপনার টার্মিনালে চালান তবে আমি এটিতে পাইপ দেওয়ার পরামর্শ দিচ্ছি lessযাতে আপনি অনুভূমিকভাবে স্ক্রোল করতে পারেন। আপনি 1e4যদি আরও বেশি টিক্স চান তবে আপনি পরিবর্তন করতে পারেন 9e9, তবে এটি একটি টেরাবাইট বা দুটি র‌্যাম লাগবে।

এটি repl.it এ দেখুন: https://repl.it/Cx4I/1


জমা দেওয়ার জন্য ধন্যবাদ! তবে আশ্চর্যের বিষয় যথেষ্ট যে আমি রেপিকে আউটপুট দেখতে পারছি না (আমি দেখতে পাচ্ছি তাদের মধ্যে অনেকগুলি রিটার্ন সহ 127-0 সংখ্যাগুলি )। আমি এর আগে কখনও Repl ব্যবহার করিনি তাই কেন জানতাম না। আউটপুটটি সঠিকভাবে দেখার জন্য আপনি কি কোনও উপায়ের পরামর্শ দিতে পারেন?
টিএনটি

বেশ সুন্দর। এটা আমার জন্য কাজ করে. আমি এখনই কম্পিউটারে নেই, তবে এখানে আমার ফোন থেকে একটি স্ক্রিনশট এসেছে: i.stack.imgur.com/3UCyn.jpg
জর্ডান

স্ক্রিনশটের জন্য ধন্যবাদ। আমি ভাবছি যে সমস্যাটি আমি যে ওয়েব ব্রাউজারটি ব্যবহার করছি তা হতে পারে, তাই আমি এটি পরে আলাদাভাবে চেষ্টা করব। আমার কাছ থেকে যদিও +1। :)
টিএনটি

2

পাইথন 2, 163 160 156 145 বাইট

এটি করার গল্ফিয়াস্ট উপায় নয়, তবে এটি ছিল সর্বাধিক সহজ। যদি আমি বুঝতে পারি যে স্ট্রিংগুলির কিছু অংশ তালিকাতে না বদলানো, প্রতিস্থাপন করা এবং সেগুলি আবার স্ট্রিংয়ে রূপান্তর করা, তবে এখানে খুব সহায়ক হবে। গল্ফিং পরামর্শ স্বাগত জানাই।

সম্পাদনা করুন: 18 বাইট লিকি নুনকে ধন্যবাদ আইডিয়নে চেষ্টা করে দেখুন !

a=input();z=[" "*max(a[3])]*128
for n,v,b,e in zip(*a):z[n]=z[n][:b]+"O=#-@+0*"[v/16]*(e-b)+z[n][e:]
for i in range(128)[::-1]:print"%3d|"%i+z[i]

@ লেকিউন উফফফ, আমার খারাপ
লুভজো

আপনি কি নিয়মিত প্রকাশের বিকল্প ব্যবহার করতে পারেন? রুবি str.sub(/(?<=.{20}).{3}/,"foo")তেমন কিছু সমান str[20,3] = "foo"। অবশ্যই, এর অর্থ সূচক / দৈর্ঘ্যের ভেরিয়েবলগুলির সাথে স্ট্রিং ইন্টারপোলেশন / কনটেনটেশন দ্বারা রেজিপ্যাক্ট নির্মাণ করা - যা রুবি বাইটে সস্তা, তবে পাইথনে নয়।
জর্দান

1

জাপট , 65 বাইট

®Æ"O=#-@+0*"gXzG
#€Çs ú3 +'|ÃúUmg2 rÔ+5
£VhXÎVgXv)hXÎ+4Xo pXra
Vw

এটি অনলাইন চেষ্টা করুন!

বিন্যাসে নোটগুলির তালিকা হিসাবে ইনপুট নেয় [pitch, start_tick, end_tick, velocity]। পৃথক তালিকা হিসাবে ইনপুট নেওয়া বাধ্যতামূলক (অর্থাত্ একটি পিচ সমেত একটি তালিকা, সমস্ত বেগ ইত্যাদি একটি), যা 1 বাইট ব্যয়ে সম্পন্ন করা যায় ।

ব্যাখ্যা:

®Æ"O=#-@+0*"gXzG          #Gets the velocity character to use for each note
®                         # For each note in the input
 Æ                        # Replace the last item X with:
             XzG          #  Integer divide X by 16
  "O=#-@+0*"g             #  Get the character at that index in the string "O=#-@+0*"

#€Çs ú3 +'|ÃúUmg2 rÔ+5    #Generate the blank chart
#€Ç        à              # For each number X in the range [0...127]:
   s                      #  Turn X into a string
     ú3                   #  Right-pad with spaces until it is 3 characters long
        +'|               #  Add "|" to the end
            ú             # Right pad each of those with spaces to this length:
             Umg2         #  Get all the end_tick values
                  rÔ      #  Find the largest one
                    +5    #  Add 5

£VhXÎVgXv)hXÎ+4Xo pXra    #Put the notes into the chart
£                         # For each note:
     VgXv)                #  Get a line from the chart based on the note's pitch
          h               #  Overwrite part of that line:
           XÎ+4           #   Starting at index start_tick +4
               Xo         #   Overwrite characters with the velocity character
                  pXra    #   For the next end_tick - start_tick characters
 VhXÎ                     #  Put the modified line back into the chart

Vw                        #Print the chart
V                         # Get the chart
 w                        # Reverse it (so 127 is the first line)
                          # Implicitly print it
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.