User quartata memposting tantangan ini , tetapi dia mengabaikan fakta bahwa, untuk alasan apa pun, dia tidak dapat memutar file MIDI di komputernya.
Mari kita bantu dia dengan menulis program lengkap yang membaca lagu dalam format RTTTL dari input standar, mencetak nama lagu ke output standar dan memutarnya (dengan kecepatan dan nada yang tepat).
Detail format
RTTTL adalah format nada dering yang cukup bodoh dan kurang spesifik. Ini terdiri dari nama, beberapa nilai default, dan serangkaian catatan (hanya satu catatan pada satu waktu) dalam format teks sederhana.
Contoh: fifth: d=4,o=5,b=63: 8P, 8G5, 8G5, 8G5, 2D#5
Namanya adalah string yang diakhiri oleh tanda titik dua. Di sini namanya "kelima". Program Anda harus menerima nama dengan setidaknya 15 karakter.
Selanjutnya, bagian default (juga diakhiri oleh titik dua) mencantumkan beberapa nilai default untuk durasi (d), oktaf (o) dan ketukan per menit (b) untuk lagu. Mereka dipisahkan koma dan menggunakan sintaks "key = value". Mungkin ada sejumlah ruang di sekitar setiap bagian "key = value". Anda dapat mengasumsikan bahwa nilai default d, o dan b semuanya ada, dalam urutan ini. Durasi dan oktaf akan dijelaskan di bawah ini; bpm mengacu pada jumlah ketukan (sesuai dengan not seperempat) yang harus dimainkan dalam satu menit, dan Anda harus mendukung nilai integer antara 20 dan 900 (termasuk).
Kemudian lagu yang sebenarnya terdaftar sebagai serangkaian catatan yang dipisahkan koma menggunakan sintaksis "DPO", di mana D adalah durasinya, P adalah pitch (catatan) dan O adalah oktafnya. Mungkin ada sejumlah spasi dan baris baru di sekitar setiap bagian "DPO".
Durasi adalah kekuatan 2 antara 1 dan 32 (inklusif), mewakili sebagian kecil dari keseluruhan not. Jadi misalnya nilai 4 (not seperempat) dua kali lebih panjang dari nilai 8 (not seperdelapan). Durasi dapat hilang, dalam hal ini durasi default akan digunakan. Durasi juga dapat dimodifikasi oleh keberadaan titik ( .
), khususnya titik membuat catatan bertahan 50% lebih lama. Karena tidak semua orang setuju tentang di mana titik seharusnya, Anda harus menerima titik setelah nada atau setelah oktaf (yaitu "DP.O" dan "DPO." Harus bekerja).
Pitch adalah salah satu dari A, B, C, D, E, F, G, A #, C #, D #, F #, G #, P di mana AG # adalah not musik standar (catatan: tidak ada flat, gunakan nada tajam yang sesuai) dan P adalah jeda. Pitch adalah satu-satunya bagian dari not yang diperlukan, dan tidak peka huruf besar-kecil.
Dan akhirnya, satu oktaf adalah angka yang biasanya dari 4 hingga 8, tetapi Anda harus mendukung angka apa pun dari 1 hingga 8 yang inklusif. Sebagai contoh, C4 adalah standar C tengah dengan frekuensi sekitar 261.63Hz. Oktaf bisa hilang, dalam hal ini oktaf standar akan digunakan. Anda dapat berasumsi bahwa jeda tidak memiliki oktaf yang ditentukan (karena tidak memiliki arti).
Seperti disebutkan dalam tantangan lain, Anda dapat menggunakan situs ini untuk mengonversi lagu RTTTL ke format MIDI untuk pengujian (tetapi perhatikan bahwa itu mungkin tidak mengikuti spesifikasi yang sama persis).
Persyaratan:
Program Anda harus memainkan setiap nada dengan kecepatan dan nada yang tepat. Itu dapat menggunakan segala jenis suara (gelombang sinus / segitiga / persegi, suara piano, suara bel, apa pun; juga dapat berupa bunyi bip standar, bunyi gelombang, atau suara MIDI, dll.) Selama dapat didengar dan nada dapat dikenali.
Setiap not harus dimainkan terus menerus selama durasi yang ditentukan atau tidak lebih dari not ke 64 yang lebih pendek dari itu, kecuali jika Anda menggunakan sesuatu seperti amplop ADSR , dalam hal ini fase rilis dapat berlanjut hingga jeda berikutnya atau pada not berikutnya .
Jika dua not berturut-turut memiliki nada yang sama, mereka harus dibedakan dengan jelas, baik melalui istirahat pendek (menggunakan tidak lebih dari panjang catatan ke-64, sebagai bagian dari durasi catatan pertama) atau dengan menggunakan suara yang tidak seragam (seperti seperti amplop ADSR yang disebutkan di atas), atau setidaknya melalui perubahan fase jika cukup jelas. Dua jeda berturut-turut harus diperlakukan sama seperti jeda tunggal dengan total durasi.
Program harus dapat dijalankan di Linux menggunakan perangkat lunak yang tersedia secara bebas. Seharusnya membaca lagu dari input standar, dan mencetak nama lagu ke output standar.
Jika input tidak sesuai dengan spesifikasi di atas, perilaku tidak ditentukan. Program Anda mungkin mengabaikan kesalahan, atau mencetak pesan, atau memainkan sesuatu yang salah, hang atau crash, seharusnya tidak merusak.
Tidak ada celah standar.
Mencetak gol
Code golf, program terpendek (diukur dalam UTF-8 byte) menang.
Jawaban:
Jawa, 813
Saya masih mengerjakannya.
Ini agak sensitif terhadap kecepatan dan kesibukan CPU saat memulai.
sumber
C ++, 15186 byte
Ada tautan di bagian bawah tempat Anda dapat mendengar sampel
Saya menyajikan salah satu cara paling tidak praktis untuk memutar musik di mesin Linux Anda:
Sayangnya, saya tidak bisa memasukkan kode golf dan tidak disunat (batasan ruang), dan kode itu bisa di-golf lebih lanjut.
Sebagian besar alasan mengapa file tersebut sangat panjang adalah karena harus membuat setiap nada (12 nada * 5 oktaf) secara individual menggunakan gelombang sinus.
Kompilasi Saya mengkompilasi menggunakan dev cmd prompt untuk studio visual, tetapi sangat mirip dengan g ++ di Linux.
Anda hanya perlu menghubungkan berbagai hal dengan benar.
kredit ke SFML dan posting ini untuk gagasan itu.
Saya pikir timingnya benar, beri tahu saya jika tidak.
Dengarkan
Di Sini (Tautan ke DropBox) adalah rekaman layar yang memainkan rendition cepat Tema Morrowind yang saya buat. Perhatikan bahwa dalam video itu tidak meminta input karena file sudah ada.
sumber