【音乐生成】乐谱生成

介绍与研究动机

在这里插入图片描述
论文链接:AN EXPLORATION OF GENERATING SHEET MUSIC IMAGES
传统的音乐生成任务的输出格式以MIDI、WAV为主,本文研究的格式却是乐谱,那么乐谱形式的音乐相较MIDI格式的音乐有哪些优势呢?
1、作曲家的首选格式,音乐专业的学生对于打谱软件早已习以为常;
2、拥有MIDI格式音乐中没有的信息,例如time signature, measure boundaries, harmonic information。
3、MIDI的嵌入编码会十分在意低层次的信息,例如note velocity,基于乐谱的作曲则不会在这里钻牛角尖;

数据集

在这里插入图片描述
本文作者探究了三种格式,分别是Image format, Semantic encoding, XML code。

方法

在这里插入图片描述
作者对三种格式都运用了相同的语言模型,分别是AWD- LSTM,GPT-2

实验结果

作者选择的评价指标主要是一致性(cohesion)。
在这里插入图片描述
可以发现基于语义编码的数据格式在两个语言模型上表现差不多,而GPT在XML上的time signature cohesion表现的要好一些。但是总体结果不大理想。

MIDI.js是一个JavaScript库,可以用来生成和播放MIDI音乐文件。以下是使用MIDI.js生成乐谱的步骤: 1. 引入MIDI.js库 在HTML文件中引入MIDI.js库的JavaScript文件。 ```html <script src="https://cdn.jsdelivr.net/npm/midijs/dist/midi.min.js"></script> ``` 2. 加载MIDI文件 使用MIDI.js的`MIDIjs.player.loadFile`方法加载MIDI文件。例如: ```javascript MIDIjs.player.loadFile("music.mid"); ``` 3. 解析MIDI文件 使用MIDI.js的`MIDIjs.Player`类解析MIDI文件。例如: ```javascript var player = new MIDIjs.Player(); player.load("music.mid", function() { var track = player.tracks[0]; console.log(track.events); }); ``` 4. 生成乐谱 根据MIDI文件中的事件信息,生成乐谱。例如: ```javascript var events = track.events; var notes = []; for (var i = 0; i < events.length; i++) { var event = events[i]; if (event.type === "channel") { if (event.subtype === "noteOn") { notes.push({ pitch: event.param1, start: event.playTime, duration: 0 }); } else if (event.subtype === "noteOff") { for (var j = notes.length - 1; j >= 0; j--) { if (notes[j].pitch === event.param1 && notes[j].duration === 0) { notes[j].duration = event.playTime - notes[j].start; break; } } } } } console.log(notes); ``` 以上代码将MIDI文件中的音符事件转换为一个包含音高、开始时间和持续时间的数组。 5. 显示乐谱生成乐谱显示在网页中。可以使用HTML和CSS来创建一个表格,并使用JavaScript来将乐谱数据填充到表格中。例如: ```html <div id="sheet-music"></div> <style> table { border-collapse: collapse; } td { border: 1px solid black; width: 10px; height: 20px; } </style> <script> var sheetMusic = document.getElementById("sheet-music"); var table = document.createElement("table"); for (var i = 0; i < notes.length; i++) { var note = notes[i]; var tr = document.createElement("tr"); var td = document.createElement("td"); td.innerHTML = note.pitch; tr.appendChild(td); for (var j = 0; j < note.duration / 100; j++) { var td = document.createElement("td"); td.style.backgroundColor = "gray"; tr.appendChild(td); } table.appendChild(tr); } sheetMusic.appendChild(table); </script> ``` 以上代码将生成一个包含音符音高和持续时间的表格,每个音符的持续时间用灰色单元格表示。可以使用CSS样式来自定义乐谱的外观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值