156b4dade8c789769e57580e29f.../midi2playsound.js

65 lines
1.8 KiB
JavaScript

mineflayer = require('mineflayer');
bot = mineflayer.createBot({
host: "localhost",
port: 25565,
username: "fookat",
});
// list of key pitches Fb1 - Fb2
pitches = [0.5];
for (let i = -11; i <= -1; i++)
pitches.push(Math.pow(2, i/12));
pitches.push(1);
for (let i = 1; i <= 11; i++)
pitches.push(Math.pow(2, i/12));
pitches.push(2);
noteHandler = function(noteNumber, velocity) {
//let cmd = `/playsound minecraft:block.note_block.harp record @a ~ ~ ~ 1 ${(event.noteNumber - 21) / 44}`
let npos = noteNumber - 21; // note position from 0 to 88
let opos; // octave start position
let inst;
if (npos > (opos = 8) && npos <= 32) {
inst = "minecraft:block.note_block.bass"
}
else if (npos > (opos = 32) && npos <= 56) {
inst = "minecraft:block.note_block.harp";
}
else if (npos > (opos = 56) && npos <= 80) {
inst = "minecraft:block.note_block.xylophone";
} else return;
//console.log(npos - opos - 1);
let pitch = pitches[npos - opos - 1];
if (!pitch) return;
let cmd = `/execute at @a run playsound ${inst} record @p ~ ~ ~ ${velocity / 127 || 1} ${pitch} 1`
//console.log(cmd);
bot.chat(cmd);
}
MidiPlayer = require('midi-player-js');
Player = new MidiPlayer.Player(function(event){
if (event.name == "Note off" || (event.name == "Note on" && event.velocity === 0)) {
} else if (event.name == "Note on") {
noteHandler(event.noteNumber, event.velocity);
} else if (event.name == "Set Tempo") {
Player.setTempo(event.data);
}
});
Player.sampleRate = 0;
Player.loadFile('./Note_sweep.mid');
bot.on('login', () => {
console.log("login")
Player.play()
var JZZ = require('JZZ');
JZZ().openMidiIn().connect(function(msg){
if (msg.isNoteOn()) noteHandler(msg.getNote(), msg.getVelocity());
});
});