
Ini adalah artikel lain dari serangkaian artikel pelatihan untuk pengembang di bidang kecerdasan buatan. Pada artikel sebelumnya, kami memeriksa pengumpulan dan persiapan data dengan gambar, dalam artikel ini kami akan melanjutkan diskusi tentang pengumpulan dan studi data musik.
Tujuan dari proyek ini adalah:
- Buat aplikasi yang menerima serangkaian gambar sebagai input.
- Menekankan pewarnaan emosional gambar.
- Menerima output karya musik yang mencerminkan emosi yang sesuai.
Proyek ini digunakan untuk menghasilkan musik yang dimodulasi dengan bantuan emosi, sebuah algoritma (Transformasi musik berdasarkan emosi), yang melakukan perubahan dalam melodi dasar sesuai dengan emosi tertentu dan harmonisasi serta penyelesaian melodi berikutnya menggunakan model pembelajaran mendalam. Untuk menyelesaikan tugas ini, set data musik berikut diperlukan:
- Kumpulan data untuk mempelajari algoritme penyelesaian melodi (Bach chorales).
- Seperangkat lagu populer yang berfungsi sebagai templat untuk memodulasi emosi.
Pengumpulan dan studi kumpulan data musik
Bach Chorales - proyek Music21
Music21 adalah toolkit berbasis Python untuk sains musik menggunakan komputer. Ini berisi koleksi lengkap paduan suara Bach sebagai bagian dari karya-karyanya yang dikumpulkan. Oleh karena itu, prosedur pengumpulan data sangat sederhana - Anda hanya perlu menginstal paket
music21 (manual tersedia untuk macOS *, Windows * dan Linux *).
Setelah instalasi, akses ke paduan suara Bach dapat diperoleh dengan menggunakan kode berikut:
from music21 import corpus for score in corpus.chorales.Iterator(numberingSystem='bwv', returnType='stream'): pass
Iterasi atas semua paduan suara BachSebagai alternatif, Anda dapat menggunakan kode berikut: ia mengembalikan daftar nama file untuk semua paduan suara Bach, yang dapat diproses lebih lanjut menggunakan fungsi parsing:
from music21 import corpus chorales = corpus.getBachChorales() score = corpus.parse(chorales[0])
Mengambil Daftar Semua Bach BachEksplorasi data
Setelah menyelesaikan pengumpulan data (dalam hal ini, setelah mendapatkan akses ke sana), langkah selanjutnya adalah memeriksa dan mempelajari tanda-tanda data ini.
Kode berikut menampilkan representasi teks dari file musik:
>>> from music21 import corpus
>>> chorales = corpus.getBachChorales()
>>> score = corpus.parse(chorales[0])
>>> score.show('text')
{0.0} <music21.text.TextBox "BWV 1.6 W...">
{0.0} <music21.text.TextBox "Harmonized...">
{0.0} <music21.text.TextBox "PDF 2004 ...">
{0.0} <music21.metadata.Metadata object at 0x117b78f60>
{0.0} <music21.stream.Part Horn 2>
{0.0} <music21.instrument.Instrument P1: Horn 2: Instrument 7>
{0.0} <music21.stream.Measure 0 offset=0.0>
{0.0} <music21.layout.PageLayout>
{0.0} <music21.clef.TrebleClef>
{0.0} <music21.key.Key of F major>
{0.0} <music21.meter.TimeSignature 4/4>
{0.0} <music21.note.Note F>
{1.0} <music21.stream.Measure 1 offset=1.0>
{0.0} <music21.note.Note G>
{0.5} <music21.note.Note C>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note F>
{2.0} <music21.note.Note A>
{2.5} <music21.note.Note F>
{3.0} <music21.note.Note A>
{3.5} <music21.note.Note C>
{5.0} <music21.stream.Measure 2 offset=5.0>
{0.0} <music21.note.Note F>
{0.25} <music21.note.Note B->
{0.5} <music21.note.Note A>
{0.75} <music21.note.Note G>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note G>
{2.0} <music21.note.Note A>
{3.0} <music21.note.Note A>
{9.0} <music21.stream.Measure 3 offset=9.0>
{0.0} <music21.note.Note F>
{0.5} <music21.note.Note G>
.
.
.
>>> print(score)
<music21.stream.Score 0x10bf4d828>
Representasi teks dari paduan suaraDi atas adalah tampilan representasi tekstual paduan suara sebagai objek
music21.stream .Score. Sangat menarik untuk belajar tentang bagaimana music21 merepresentasikan musik dalam kode, tetapi itu tidak terlalu berguna dalam hal mempelajari atribut data penting. Oleh karena itu, kami membutuhkan perangkat lunak yang dapat menampilkan skor.
Seperti yang dinyatakan sebelumnya dalam artikel
Menyiapkan model dan hiperparameter untuk mengenali emosi dalam gambar , skor dalam musik21 disimpan dalam file MusicXML * (dengan ekstensi .xml atau .mxl). Untuk melihat file-file ini dalam notasi musik, digunakan aplikasi Finale NotePad * 2 gratis (versi uji coba paket profesional Finale * untuk bekerja dengan notasi musik).
Finale NotePad tersedia untuk Mac dan Windows. Setelah mengunduh Finale Notepad, jalankan kode berikut untuk mengonfigurasi music21 agar berfungsi dengan Finale Notepad:
>>> import music21
>>> music21.configure.run()
Sekarang kita dapat menjalankan kode di atas, tetapi gunakan fragmen
score.show () alih-alih
score.show ('text') . Dalam hal ini, file MusicXML akan dibuka di aplikasi Finale, yang terlihat seperti ini:
Halaman pertama Bach dalam notasi musikFormat ini memberikan presentasi visual yang lebih jelas untuk paduan suara. Ketika memeriksa beberapa paduan suara, kami memastikan bahwa data memenuhi harapan kami: Ini adalah karya musik pendek yang mengandung setidaknya empat bagian (sopran, biola, tenor dan bass), dibagi menjadi frasa terpisah melalui pertanian.
Biasanya, statistik deskriptif tertentu dihitung sebagai bagian dari prosedur studi data. Dalam hal ini, kita dapat menentukan berapa kali setiap tombol muncul dalam karya yang dikumpulkan. Berikut ini adalah contoh kode yang memungkinkan Anda untuk menghitung dan memvisualisasikan peringkat pemanfaatan setiap kunci dalam kumpulan data.
from music21 import* import matplotlib.pyplot as plt chorales = corpus.getBachChorales() dict = {} for chorale in chorales: score = corpus.parse(chorale) key = score.analyze('key').tonicPitchNameWithCase dict[key] = dict[key] + 1 if key in dict.keys() else 1 ind = [i for i in range(len(dict))] fig, ax = plt.subplots() ax.bar(ind, dict.values()) ax.set_title('Frequency of Each Key') ax.set_ylabel('Frequency') plt.xticks(ind, dict.keys(), rotation='vertical') plt.show()
Frekuensi penggunaan setiap kunci dalam karya yang dikumpulkan. Kunci kecil diwakili oleh huruf kecil, dan kunci utama diwakili oleh huruf kecil. Rumah Susun ditandai dengan "-"Berikut adalah beberapa statistik yang terkait dengan karya yang dikumpulkan.
Distribusi kunci yang digunakan dalam satu set komposisi
Lokasi catatan, dihitung sebagai offset dari awal pengukuran dalam catatan kuartalStatistik deskriptif yang menarik untuk perhitungan akan bervariasi untuk setiap proyek. Namun, dalam kebanyakan kasus, ini dapat membantu Anda mengetahui jenis data apa yang sedang Anda kerjakan, dan bahkan mengelola tindakan tertentu selama pemrosesan data. Statistik ini juga dapat berfungsi sebagai titik awal untuk memeriksa hasil preprocessing data.
Transformasi Musik - Informasi Teoritis
Ada dua pembawa utama ekspresi dalam musik - nada dan irama. Kami menggunakan media ekspresi ini sebagai parameter untuk menulis ulang melodi kami dalam suasana hati yang dipilih.
Dalam teori musik, ketika sampai pada nada suara dalam melodi, hubungan ketinggian antara not-not tersebut tersirat. Sistem not musik berdasarkan urutan bunyi nada tertentu disebut skala. Interval atau ukuran lebar masing-masing langkah dari urutan mungkin berbeda satu sama lain. Perbedaan atau ketidakhadiran seperti itu menciptakan hubungan antara nada dan kecenderungan melodi di mana kombinasi dan gravitasi yang stabil menciptakan ekspresi suasana hati. Dalam tradisi musik Barat, ketika sampai pada skala diatonis sederhana, posisi nada relatif terhadap nada pertama skala disebut
tahap skala (I-II-III-IV-V-VI-VII). Sesuai dengan kombinasi dan gravitasi yang stabil, skala skala menyediakan nada musik yang menjalankan fungsinya dalam sistem. Hal ini membuat gagasan tentang tahap skala sangat berguna dalam menganalisis pola melodi sederhana dan mengkodekannya dengan kemungkinan menetapkan nilai yang berbeda.
Pada tingkat awal, kita perlu memilih skala yang sesuai dari sudut pandang artistik untuk menciptakan suasana hati tertentu. Jadi, jika kita perlu mengubah mood melodi, kita harus mempelajari struktur fungsionalnya menggunakan gagasan skala yang dijelaskan, dan kemudian menetapkan nilai-nilai baru ke template yang ada dari langkah-langkah skala. Seperti peta, templat ini juga berisi informasi tentang arah dan periode dalam melodi.
Untuk setiap suasana hati tertentu, kami menggunakan beberapa parameter tambahan untuk membuat melodi baru kami lebih ekspresif, harmonis, dan ekspresif.
Ritme adalah cara mengatur suara dalam waktu. Ini termasuk informasi seperti: urutan penampilan nada dalam melodi, panjang relatifnya, berhenti di antara mereka dan berbagai aksen. Jadi, periode waktu diciptakan untuk menyusun ukuran musik. Jika kita perlu mempertahankan pola melodi asli, maka kita harus mempertahankan struktur ritmisnya. Untuk mencapai tujuan ini, hanya perlu mengubah beberapa parameter ritme - panjang catatan dan jeda - dan ini harus cukup dari sudut pandang artistik. Selain itu, untuk membuat melodi yang dimodifikasi lebih ekspresif, kita dapat menggunakan beberapa metode tambahan untuk menekankan suasana hatinya.
Sebagai contoh, ANXIETY dapat diekspresikan dengan kunci minor dan ritme yang lebih energik. Templat untuk skala asli kami adalah sebagai berikut: VV-VI-VI-VII VV-VI-V-II-I VVV (transisi satu oktaf lebih tinggi) -III-I-VII-VI IV-IV-III-I-II-I .
Templat sumberMelodi asli ditulis dalam kunci utama, yang berbeda dari kunci minor dalam tiga not - kunci utama dari tahap III, VI dan VII adalah mayor (setengah nada di atas), dan dalam kunci minor - minor (setengah nada di bawah). Karena itu, jika kita perlu mengubah nada suara yang digunakan, kita hanya perlu mengganti langkah yang lebih tinggi dengan yang lebih rendah (atau sebaliknya). Namun, untuk menciptakan efek kecemasan yang lebih menonjol, perlu untuk meninggalkan tahap VII yang utama (meningkat) - ini akan meningkatkan ketidakstabilan nada ini dan menekankan skala kita dengan cara khusus.
Untuk membuat ritme lebih energik, kita dapat menambahkannya sebagai sinkop, atau gangguan sinkronik dari gerakan ritme biasa, dengan mengubah posisi beberapa not. Dalam hal ini, kami akan memindahkan beberapa not yang sama satu beat ke depan.
Kecemasan KonversiKesedihan juga dapat diekspresikan dengan kunci minor yang sederhana, tetapi ritme-nya harus tenang. Jadi, kami mengganti langkah-langkah utama dengan minor, termasuk langkah VII. Untuk membuat ritme lebih rileks, Anda perlu mengisi jeda dengan menambah panjang not di depannya.
SAD konversiUntuk mengekspresikan BLESSING, kita harus menghindari intonasi yang tegas dan tegas - ini akan menjadi prinsip transformasi yang sesuai. Seperti yang Anda lihat, sesuai dengan perbedaan urutan suara yang digunakan, langkah-langkah skala memiliki arti yang berbeda dan jarak dari langkah pertama (I). Dengan demikian, signifikansi mereka dibuat dalam gambaran keseluruhan. Oleh karena itu, perpindahan dari tahap IV ke tahap I sangat mudah karena fungsinya. Intonasi ketika bergerak dari tahap V ke tahap I juga terdengar sangat mudah. Kami akan menghindari dua intonasi ini untuk menciptakan kesan ruang dan ketidakpastian.
Oleh karena itu, di setiap elemen templat, di mana tahap I mengikuti tahap V, atau tahap IV mengikuti tahap IV, dan juga dalam urutan terbalik dari langkah-langkah ini, kami akan mengganti salah satu dari catatan ini (atau kedua catatan) dengan langkah-langkah terdekat dengan mereka. Anda dapat mengubah ritme dengan cara yang mirip dengan menciptakan efek GRUSH - cukup dengan mengurangi kecepatannya.
Mengubah BLESSDECISION dikaitkan dengan gerakan yang kuat, jadi cara paling sederhana untuk menunjukkannya adalah mengubah ritme dengan cara yang mirip dengan perubahan untuk efek ANXIETY. Juga perlu untuk mengurangi durasi semua not kecuali untuk setiap not terakhir dari setiap periode, VV-VI-VI-VII VV-VI-V-II-I.
KEPUTUSAN TransformasiKunci utama itu sendiri terdengar positif dan menyenangkan, untuk menekankan dan mengekspresikan KEBENARAN / SUKACITA, kami menggunakan kunci pentatonis utama. Ini terdiri dari langkah yang sama, dengan pengecualian dua di antaranya - yang keempat dan ketujuh, I-II-III-V-VI.
Karenanya, setiap kali kami menemukan dua langkah ini di templat kami, kami menggantinya dengan langkah-langkah yang paling dekat dengannya. Untuk menekankan kesederhanaan yang disediakan oleh nada suara kami, kami menggunakan fragmen melodi turun yang terdiri dari lima not atau lebih sebagai demonstrasi langkah-demi-langkah dari skala kami.
Konversi SUKACITAKetenangan / Ketenangan dapat diekspresikan tidak hanya dengan mengubah nada suara, itu juga membutuhkan transformasi gerakan melodi. Untuk melakukan ini, Anda perlu menganalisis templat sumber dan memilih segmen serupa di dalamnya. Catatan pertama dari setiap segmen menentukan konteks harmonik dari seluruh frasa, sehingga catatan ini memiliki nilai terbesar bagi kita:
V -
V -VI-VI-VII-VII
V -V-VI-V-II-I-
V -VV-III-I-VII-VI
IV- IV-III-I-II-I.
Untuk segmen pertama, hanya langkah-langkah berikut yang harus digunakan: IV-VI-VII; untuk yang kedua: V-VII-II-I; untuk yang ketiga: VI-VII-III-II; untuk yang keempat: VII-IV-I-VII.
Set langkah yang mungkin ini sebenarnya adalah tipe lain dari struktur musik, akord. Namun, kita masih dapat menggunakannya sebagai sistem untuk mengonversi melodi. Langkah-langkah skala dapat diganti dengan langkah-langkah yang paling dekat dengan mereka dari pola chord yang ditunjukkan. Jika seluruh segmen dimulai dengan nada yang lebih rendah dari aslinya, maka perlu untuk mengganti semua langkah di dalamnya dengan langkah-langkah lebih rendah yang tersedia di templat yang ditentukan. Untuk membuat efek penundaan, perlu juga memecah durasi setiap not menjadi not yang kedelapan dan secara bertahap mengurangi kecepatan not yang baru ini.
Ketenangan Konversi / KetenanganUntuk menekankan GRATITUDE, perlu menggunakan tampilan gaya dalam ritme, menciptakan efek arpeggio: kita kembali ke nada pertama di akhir setiap segmen (frasa). Hal ini diperlukan untuk membagi dua durasi setiap not terakhir dalam suatu segmen dan menempatkan not pertama dari segmen ini di sana.
GRATITUDE KonversiBagian praktis
Python dan music21 toolkit
Script transformasi diimplementasikan menggunakan bahasa Python dan music21 toolkit.
Music21 adalah kelas yang sangat fleksibel dan tingkat tinggi untuk memanipulasi konsep musik seperti: catatan, ukuran, akor, nada suara, dll. Ini memungkinkan Anda untuk melakukan operasi langsung di area subjek, sebagai lawan dari manipulasi tingkat rendah dengan data mentah dari file. Antarmuka Alat Musik Digital (MIDI). Namun, langsung bekerja dengan file MIDI di music21 tidak selalu nyaman, terutama ketika datang untuk memvisualisasikan skor. Oleh karena itu, untuk visualisasi dan implementasi algoritma, cara yang lebih mudah adalah dengan mengkonversi file sumber MIDI ke format musicXML. Selain itu, format musicXML adalah format input untuk BachBot, yang mewakili langkah selanjutnya dalam urutan pemrosesan kami.
Konversi dapat dilakukan menggunakan Musescore:
untuk mendapatkan output dari file musicXML:
musescore input.mid -o output.xml
untuk mendapatkan output dari file MIDI:
musescore input.mid -o output.mid
Jupyter
Toolkit music21 terintegrasi dengan baik dengan aplikasi Jupyter. Selain itu, integrasi dengan Musescore memungkinkan Anda untuk menampilkan skor langsung di dokumen notebook Jupyter dan mendengarkan hasilnya melalui pemutar bawaan selama pengembangan dan eksperimen.
Dokumen notebook Jupyter dengan kode, skor dan pemainFungsi Skor Pertunjukan sangat berguna untuk kerja tim dari seorang programmer dan musisi-teoretikus. Kombinasi sifat interaktif Jupyter, domain khusus untuk musik21, dan kesederhanaan Python membuat alur kerja ini sangat menjanjikan untuk penelitian interdisipliner semacam ini.
Implementasi
Script transformasi diimplementasikan sebagai modul Python, sehingga memungkinkan panggilan langsung:
python3 emotransform.py --emotion JOY input.mid
Atau Anda dapat menyebutnya melalui skrip eksternal (atau Jupyter):
from emotransform import transform transform('input.mid','JOY')
Dalam kedua kasus, hasil karya akan berupa file yang dimodulasi dengan bantuan emosi tertentu.
Transformasi yang terkait dengan perubahan dalam langkah-langkah musikal - ANXIETY, SADNESS, BLESSING and JOY - didasarkan pada penggunaan fungsi music21.Note.transpose dalam kombinasi dengan analisis posisi saat ini dan diperlukan dari langkah-langkah musikal. Di sini kita menggunakan modul music21.scale dan fungsinya untuk membangun skala yang diperlukan dari tonik apa pun. Untuk mendapatkan tonik melodi tertentu, Anda dapat menggunakan
fungsi analisis ('kunci') dari modul music21.Stream7.
Untuk konversi berbasis frase - KEPUTUSAN, GRATITUDE, Ketenangan / Ketenangan - diperlukan penelitian tambahan. Penelitian ini akan memungkinkan kita untuk mendeteksi secara akurat awal dan akhir frasa musik.
Kesimpulan
Dalam artikel ini, kami menyajikan ide utama yang mendasari transformasi musik berdasarkan emosi - mengubah posisi nada tunggal dalam skala relatif terhadap tonik (langkah musik), tempo potongan, serta frasa musik. Ide ini diimplementasikan sebagai skrip dengan Python. Namun, implementasi ide-ide teoretis di dunia nyata tidak selalu mudah, jadi kami mengalami beberapa kesulitan dan mengidentifikasi kemungkinan arahan untuk penelitian masa depan. Studi ini terutama terkait dengan pendeteksian frasa musik dan transformasi mereka. Pilihan instrumen (musik21) yang tepat dan penelitian di bidang informasi musik adalah faktor kunci untuk memecahkan masalah tersebut.
Transformasi musik berdasarkan emosi merupakan tahap pertama dalam urutan kami dalam memproses data musik, tahap berikutnya adalah penyerahan melodi yang dikonversi dan disiapkan untuk input BachBot.