MIDI






Midi converter : podman exec -ti NodeMidi /bin/bash ; cd /node

node run.js example.mid 1200
Result: example.txt
cp example.txt new.txt
node makeFromTXT.js new.txt
Result: _new.mid

Load Data in Editor podman exec -ti NodeMidi /bin/bash cp /node/new.txt data/demo.txt
* Changes: /home/podman/NodeMidi/html/Editor



MIDI Converter
  • Oracle Linux 8.6
  • nmtui : Network Address : set IP Address/subnetmask , default gw, dns
  • nmcli connection up enp0s3
    
    systemctl stop firewalld
    
    
    yum install -y podman
    
    mkdir -p /home/podman/NodeMidi
    mkdir -p /home/podman/NodeMidi/html
    chown -R 48:48 /home/podman/NodeMidi
    
    
  • vi /home/podman/Node/install.sh
    
    systemctl disable firewalld
    systemctl stop firewalld
    
    yum install -y epel-release
    yum install -y httpd
    yum install -y nodejs
    yum install -y python38
    npm install midi-note
    npm install @tonejs/midi
    yum install -y wget
    # ---
    echo "This should already be in the directory where you mount the /node onto "
    echo " TO BE DONE : #wget http://photoquesting.com/midi/midi.tar "
    echo "TO BE DONE : #tar xvf midi.tar  "
    echo "#cp 1.mid example.mid "
    
    
    mkdir -p /var/www/html/Node
    chown -R 48:48 /var/www/html/Node
    
    echo "
    
    
    const fs=require('fs');
    
    const { Midi } = require('@tonejs/midi')
    
    var note = require('midi-note')
    
    
    const midiData = fs.readFileSync('example.mid')
    const midi = new Midi(midiData)
    console.log('Midi read :', midi);
    console.log('Midi tracks/notes:', midi.tracks);
    for(t in midi.tracks){
            console.log('Track t:', midi.tracks[t]);
            for(n in midi.tracks[t].notes){
                    var midiNote=midi.tracks[t].notes[n];
                    console.log('note.midi', midiNote.midi);
                    console.log('converted:', note(midiNote.midi));
            }
    }
    
    " > /node/run_oldie.js
    
    
    cd /node
    
    echo "-----------------------"
    cat info.inf
    echo "-----------------------"
    
    ((httpd &) | sleep infinity)
    
    
    
    
  • vi ~/startNodeMidi.sh
    
    podman stop NodeMidi
    podman rm -f NodeMidi
    
    podman run --name=NodeMidi -v /home/podman/NodeMidi/html:/var/www/html/ -p 8011:80 -v /home/podman/NodeMidi:/node:Z  -t -d container-registry.oracle.com/os/oraclelinux:8 /bin/bash -c " sleep infinity "
    
    
    podman exec -i NodeMidi /bin/bash -c "sh /node/install.sh" &
    
    echo "interactive "
    echo "podman exec -ti NodeMidi /bin/bash "
    
    
    
    
    
  • sh ~/startNodeMidi.sh
  • podman exec -ti NodeMidi /bin/bash
  • cd /node
  • vi run.js
    
    
    //
    // Generate midi files
    //
    const fs=require('fs');
    const { Midi } = require('@tonejs/midi')
    var note = require('midi-note')
    
    const zeroPad = (num, places) => String(num).padStart(places, '0')
    
    function getFilesizeInBytes(filename) {
        var stats = fs.statSync(filename);
        var fileSizeInBytes = stats.size;
        return fileSizeInBytes;
    }
    
    
    console.log(" Process argv :" , process.argv.length, process.argv );
    
    if(process.argv.length < 3){
            console.log(" use run.js with midi file as argument : node run.js 1.mid [duration]");
            return;
    }
    var tempo=0;
    var inputMidi=process.argv[2];
    var txtOutputFile=inputMidi.replace(".mid", ".txt");
    
    var isSmallFile=getFilesizeInBytes(inputMidi) < 120;
    console.log(getFilesizeInBytes(inputMidi), isSmallFile);
    
    const midiData = fs.readFileSync(inputMidi)
    const midi = new Midi(midiData)
    if(isSmallFile ){
            tempo=parseInt(process.argv[3]);
    }else{
    console.log("---0-0-0--0-0");
    console.log("---------------------------------Source tempo: ", midi.header.tempos[0].bpm);
    console.log("---0-0-0--0-0");
            tempo=parseInt(midi.header.tempos[0].bpm)*100;
    }
    
    
    //console.log("txtOutputFile", txtOutputFile);
    
    console.log("input", tempo);
    if(isNaN(tempo)){
            console.log("Bad tempo", midi.header.tempos);
            return;
    }
    
    console.log("------------");
    
    var outnotes=[];
    for(t in midi.tracks){
            for(n in midi.tracks[t].notes){
                    var midiNote=midi.tracks[t].notes[n];
                    var duration=midiNote. durationTicks;
                    var _note=note(midiNote.midi);
                    var outnote="";
                    if(_note.length > 2){
                            outnote=_note.substring(0,1);
                            outnote+=_note.substring(2,3);
                    }else{
                            outnote=_note;
                    }
    
    //console.log("midiNote duration", duration, 'converted outnote :', outnote,"note()", _note);
                    outnotes.push({note:""+outnote,duration:duration});;
            }
    }
    
    var output="";
    fs.writeFileSync('/var/www/html/Node/index.html', output);
    
    var midiOut = new Midi()
    // add a track
    var track = midiOut.addTrack();
    var timer=0;
    var textOutput="";
    for(i=0; i < outnotes.length; i++){
            var outnote=outnotes[i];
            var duration=parseInt(outnote.duration)/(tempo);
            var name=outnote.note;
            var note={name:name, time:timer, duration:duration};
            var durationFormat=zeroPad(duration*100, 8);
            var timerFormat=zeroPad(timer*100, 8);
            textOutput+=""+name+":"+timerFormat+":"+durationFormat+" ";
            track = track.addNote(note);
            timer+=duration;
    }
    //console.log("textOutout", textOutput);
    
    console.log("------------");
    console.log(" Parse String/TextFile ");
    console.log("------------");
    
    
    var midiOutFile=new Midi();
    var outputTrack = midiOutFile.addTrack();
    var textSplit=textOutput.split(" ");
    var t=0;
    var outTimer=0;
    for(t=0; t < textSplit.length; t++){
            var name=textSplit[t].split(":")[0];
            var timer=parseInt(textSplit[t].split(":")[1])/100;
            var duration=parseInt(textSplit[t].split(":")[2])/100;
            var note={name:name, time:timer, duration:duration};
            if(!isNaN(duration) && !isNaN(timer)){
                    outputTrack = outputTrack.addNote(note);
            }
    }
    
    fs.writeFileSync("/var/www/html/Node/a.mid", new Buffer(midiOutFile.toArray()))
    fs.writeFileSync("/var/www/html/Node/"+txtOutputFile, textOutput)
    fs.writeFileSync(""+txtOutputFile, textOutput)
    
    
    
    ------ MidiEditor Download Midi Files : https://www.midiworld.com/ https://www.conversion-tool.com/audiotomidi/ * Music Editor: /home/podman/NodeMidi/html/Editor * Browser: http://photoquesting.com:8011/Editor/ * Midi converter : podman exec -ti NodeMidi /bin/bash ; cd /node node run.js example.mid 1200 Result: example.txt cp example.txt new.txt node makeFromTXT.js new.txt Result: _new.mid Load Data in Editor podman exec -ti NodeMidi /bin/bash cp /node/new.txt data/demo.txt * Changes: /home/podman/NodeMidi/html/Editor ---- podman exec -ti NodeMidi /bin/bash cd /node/html/Editor sh installInContainer.sh cd upload node server.js ----