Mencetak notasi musik dengan CSS Grid
(cruncher.ch)- Bagi musisi yang bermain sambil memperbesar PDF A4 di layar ponsel kecil, dibutuhkan rendering notasi musik yang luwes dan responsif di web
Prototipe Scribe
- Sebelumnya dibuat prototipe renderer musik bernama Scribe yang menghasilkan SVG dari JSON
- Tujuan awalnya adalah membuat renderer musik yang responsif, tetapi kemajuannya sulit karena harus menulis mesin layout multi-pass yang kompleks
- Setelah CSS Grid diperkenalkan ke proyek, terlihat bahwa ini bisa menjadi jawaban untuk masalah layout yang ditangani Scribe
Kelas .stave
- Paranada mirip dengan grid. Sumbu vertikal adalah tinggi nada, sumbu horizontal adalah waktu
- Di kelas
.stave, baris grid yang merupakan sumbu vertikal didefinisikan - Membuat baris grid berukuran tetap dengan nama tinggi nada standar dan menggunakan gambar latar untuk menggambar paranada
- Contoh peta baris untuk paranada kunci treble:
.stave { display: grid; row-gap: 0; grid-template-rows: [A5] 0.25em [G5] 0.25em [F5] 0.25em [E5] 0.25em [D5] 0.25em [C5] 0.25em [B4] 0.25em [A4] 0.25em [G4] 0.25em [F4] 0.25em [E4] 0.25em [D4] 0.25em [C4] 0.25em ; background-image: url('/path/to/stave.svg'); background-repeat: no-repeat; background-size: 100% 2.25em; background-position: 0 50%; } - Setiap garis dan spasi paranada memiliki garis grid dengan nama tinggi nada
Menempatkan tinggi nada pada paranada
- Di setiap baris paranada, beberapa tinggi nada dapat ditempatkan
- Agar elemen DOM berada di baris yang benar, nama tinggi nada dimasukkan ke atribut
data-pitchlalu nilaidata-pitchdipetakan ke baris paranada dengan CSS.stave > [data-pitch^="G"][data-pitch$="4"] { grid-row-start: G4; } - Aturan ini menangkap tinggi nada yang diawali dengan 'G' dan diakhiri dengan '4', lalu menempatkan
G♭4,G4,G♯4, dan sebagainya ke baris G4 - Ini perlu dilakukan untuk semua baris paranada
- Kini beberapa simbol dapat ditempatkan pada paranada
Kelas .bar dan ketukan
- Menangani ritme sedikit lebih rumit
- Tidak ada pembagian ritme minimum yang jelas yang mendukung semua jenis ritme
- Pendekatan 24 kolom per ketukan adalah titik awal yang baik karena dapat menempatkan not seperdelapan, seperenambelas, seper tigapuluh dua, dan triol secara merata
- Mendefinisikan 4 ketukan sebagai 4 × 24 = 96 kolom grid dan menambahkan kolom di awal serta akhir:
.bar { column-gap: 0.03125em; grid-template-columns: [bar-begin] max-content repeat(96, minmax(max-content, auto)) max-content [bar-end]; } - Menambahkan garis birama dengan
::beforedan::after, lalu menempatkan tanda kunci di tengah dengandata-pitch="B4"
Menempatkan simbol pada ketukan
- Kali ini atribut
data-beatdigunakan untuk menetapkan ketukan ke elemen, lalu aturan CSS dipakai untuk memetakan ketukan ke kolom grid - Peta CSS terdiri dari satu aturan untuk setiap 1/24 ketukan
- Dengan menggunakan selektor atribut awal
^=, aturan ini menjadi toleran terhadap galat - Bila digunakan bersama kelas
.stave, simbol dapat ditempatkan berdasarkan ketukan dan tinggi nada dengan mengaturdata-beatke nilai antara 1 hingga 5 dandata-pitchke nama nada
Notasi musik yang luwes dan responsif
- Dengan menaruh beberapa birama seperti ini ke dalam kontainer flexbox, kita bisa mendapatkan notasi musik responsif
- Masih banyak yang belum ada, tetapi ini adalah fondasi yang baik untuk memulai
- Pemenggalan barisnya sudah jauh lebih elegan dibanding renderer musik online yang ada
Jarak antar not
- Kepala not yang terjadi pada waktu yang lebih berdekatan dirender sedikit lebih rapat
- Ini adalah efek halus dan disengaja yang dihasilkan oleh
column-gapkecil, semacam 'eter' waktu tempat elemen simbol masuk ke slot - Kolom itu sendiri akan memiliki lebar 0 jika tidak ada kepala not, tetapi antara peristiwa yang jarak ketukannya lebih jauh ada lebih banyak celah antarkolom (24 per ketukan), sehingga tercipta jarak yang lebih besar
- Spasi yang konsisten dapat dikendalikan dengan menyesuaikan margin simbol
Tanda kunci dan tanda birama
- Alasan memakai kelas terpisah untuk jarak vertikal dan horizontal adalah agar salah satunya bisa diganti tanpa menyentuh yang lain
- Untuk menampilkan melodi yang sama dalam kunci bass, cukup ganti kelas
.stavedengan kelasbass-staveyang memetakan atributdata-pitchyang sama ke baris paranada bass - Dengan memetakan
data-duration="5"lewat CSS ke 120 kolom template grid milik.bar, tanda birama 5/4 dapat diberikan pada paranada yang sama
Akor dan lirik
- Dengan CSS Grid, simbol lain juga dapat disejajarkan di dalam grid notasi musik
- Akor, lirik, dinamika, dan lain-lain dapat disejajarkan serta diperluas mengikuti event yang memiliki penandaan waktu
Ekor not
- Ekor not, akor, dan beberapa tanda diam panjang dibuat membentang melintasi kolom dengan memetakan atribut
data-durationke nilai rentanggrid-column-end
Pengubahan ukuran
- Seluruh sistem diberi ukuran dalam satuan
em, jadi ukurannya dapat diubah hanya dengan menggantifont-size
Batasan Flex dan Grid
- Ini bukan sistem yang sempurna. Batasannya:
- CSS tidak dapat secara otomatis menempatkan tanda kunci/tanda mula baru saat terjadi pemenggalan baris
- Tidak dapat menghubungkan garis beam ke not baru di baris berikutnya
- Ekor not yang miring sulit disejajarkan karena posisi tepatnya baru diketahui setelah Grid menempatkannya
- Untuk benar-benar menyelesaikannya, dibutuhkan sedikit JavaScript pembersih, tetapi karena CSS menangani sebagian besar pekerjaan layout, pekerjaan layout yang harus dilakukan di JavaScript menjadi jauh lebih sedikit
Elemen kustom
- Sebuah interpreter ditulis di sekitar sistem CSS baru ini dan dibungkus dalam sebuah elemen
- Meski belum siap produksi, sistem ini menarik dan berguna karena sudah bisa merender lead sheet responsif dan menuliskan notasi drum
- Notasi musik dirender dari data konten, file yang diambil lewat atribut
src, atau objek JS yang diatur pada properti.datamilik elemen - Build pengembangan saat ini bisa dicoba dengan mengimpor file ke halaman web
Rencana ke depan
- Selain peningkatan di Scribe 0.3, fitur yang ingin diteliti dalam jangka panjang:
- Dukungan font SMuFL - mengganti font yang digunakan untuk simbol notasi musik
- Dukungan sequence bertingkat - mengaktifkan lagu multi-part
- Rendering paranada terbelah - menempatkan beberapa part pada satu paranada
- Rendering multi-paranada - menempatkan beberapa part pada beberapa paranada yang sejajar
Pendapat GN⁺
- Merender notasi musik yang luwes dan responsif di web tampaknya akan sangat berguna bagi musisi maupun penggemar musik. Ini bisa menghilangkan ketidaknyamanan melihat partitur PDF sambil zoom in/out di layar kecil
- Pendekatan yang memanfaatkan layout Grid dan Flex milik CSS terasa menarik. Ini adalah contoh bagus yang menunjukkan bahwa cukup banyak hal bisa diselesaikan hanya dengan CSS tanpa mesin layout yang kompleks
- Namun, karena sifat notasi musik, ada bagian-bagian yang tetap memiliki keterbatasan bila hanya mengandalkan CSS. Untuk hal-hal yang perlu memahami konteks musikal, seperti menempatkan tanda kunci/tanda mula secara otomatis saat pemenggalan baris atau menghubungkan beam secara otomatis, bantuan JavaScript tetap dibutuhkan
- Karena sudah cukup banyak yang diimplementasikan, seperti rendering lead sheet dan dukungan notasi drum, tampaknya ini bisa segera ditingkatkan menjadi cukup layak pakai. Jika di-open-source-kan dan pengembangannya berlanjut, ini bisa menjadi alternatif yang baik untuk editor notasi musik yang sudah ada seperti MuseScore
- Jika fitur yang direncanakan seperti dukungan font SMuFL, dukungan multi-part, dan rendering multi-paranada terwujud, kualitas representasi notasi musik akan meningkat secara signifikan. Ini proyek yang patut dinantikan
2 komentar
Pasti ada alasan Anda melakukan ini, kan
Opini Hacker News
[...]) terasa mengesankan. Contoh:.stave > [data-pitch^="A"][data-pitch$="5"] { grid-row-start: A5; }<scribe-music>juga menjanjikan