概括
- 语境
- 问题
- 我试图修复这个错误是什么?
- 如何重现此错误(+ 所需数据)?
- 我的问题
- 来源
语境
感谢 MusicRNN chord_pitches_improv,我想生成一个新的 MIDI 文件音符序列。
问题
我的调用music_rnn.continueSequence
触发了以下错误:
未捕获(承诺中)错误:分割数必须均匀地划分轴。在 C (music:22) at split_ (music:22) at Module.split (music:22) at t.sampleRnn (music:83) at music:83 at music:22 at t.scopedRun (music:22) at t.tidy (music:22) at Module.$e (music:22) at t. (音乐:83)
我试图修复这个错误是什么?
什么都没有,因为我什至不明白这个错误。注意:我有 MuseScore。因此,如果必须在 MIDI 文件中更改某些内容,我可以做到。
如何重现此错误(+ 所需数据)?
下载以下 MIDI 文件:https : //a.uguu.se/kP1iJ4JVeTrD_b.mid 并将其重命名为“b.mid”
创建一个存储 MIDI 文件的目录
在同一目录中,创建一个文件,标题为
index.html
:在此 HTML 文件中复制/粘贴下面提供的代码(“源”部分)打开浏览器,打开这个 HTML 文件:我的脚本会自动执行,并且会触发错误。
我的问题
这个错误是什么意思?我该如何解决?我是否应该更改 MIDI 文件中的某些内容(如果是:什么?怎么做?我可以使用 MuseScore 来做吗?)?
来源
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Music</title>
<script src="https://cdn.jsdelivr.net/npm/@magenta/music"></script>
<script src="https://unpkg.com/@tonejs/midi"></script>
</head>
<body>
<script>
loadMidi = async function() {
const sequence = {'notes': []}
const midi = await Midi.fromUrl("b.mid")
midi.tracks.forEach(track => {
const notes = track.notes
notes.forEach(note => {
if(note.midi < 48) {
note.midi = 48
}
if(note.midi > 83) {
note.midi = 83
}
sequence['notes'].push(
{
pitch: note.midi,
velocity: note.velocity * 100,
startTime: note.time,
endTime: note.time + note.duration
}
)
})
})
try {
const quantizedSequence = mm.sequences.quantizeNoteSequence(sequence, 1)
const improvCheckpoint = 'https://storage.googleapis.com/magentadata/js/checkpoints/music_rnn/chord_pitches_improv'
const music_rnn = new mm.MusicRNN(improvCheckpoint)
const prepareMusic = async() => {
await music_rnn.initialize()
var improvisedMelody = await music_rnn.continueSequence(quantizedSequence, 60, 1.1, ['Bm', 'Bbm', 'Gb7', 'F7', 'Ab', 'Ab7', 'G7', 'Gb7', 'F7', 'Bb7', 'Eb7', 'AM7'])
improvisedMelody.notes.forEach(n => n.velocity = 100)
var midi_bytes_array = mm.sequenceProtoToMidi(improvisedMelody)
saveByteArray("generated_music.midi", midi_bytes_array);
}
prepareMusic()
} catch (error) {
console.error(error)
}
}
loadMidi();
function saveByteArray(reportName, byte) {
var blob = new Blob([byte], {type: "audio/midi"});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
var fileName = reportName;
link.download = fileName;
link.click();
};
</script>
</body>
</html>