Tutorial

A musical piece must send midi over OSC according to the osmid format

import OSC from "osc-js";

//...

const options = { send: { port: 57200 } };

const osc = new OSC({ plugin: new OSC.DatagramPlugin(options) });

osc.open({ port: 9912 });

function send(midi) {
  osc.send(new OSC.Message("/IAC Driver Bus 1/note_on", 1, midi, 80));
}

Let's also produce a local sound for testing

import { AudioContext, OscillatorNode, GainNode } from "node-web-audio-api";
import { Midi } from "tonal";

//...

function play(midi) {
  const audioContext = new AudioContext();

  const frequency = Midi.midiToFreq(midi);

  const osc = new OscillatorNode(audioContext, { frequency });

  osc.connect(audioContext.destination);

  osc.start(now);

  osc.stop(now + 1);
}

To play notes in a loop, let's import a library for music theory

import { Midi } from "tonal";

//...

["C4", "G4", "F4", "G4"].map((note) => {
  const midi = Midi.toMidi(tone);
  
  play(midi);
  
  send(midi);
})

To learn about other ways to make music see the User Guides.