diff --git a/midian/css/midian.css b/midian/css/midian.css index e996a4b..c8a1636 100755 --- a/midian/css/midian.css +++ b/midian/css/midian.css @@ -119,14 +119,13 @@ th { } td.midichan { - width: 28px; font-size: 14px; border: none; padding: none; } td.midiinst { - font-size: 14px; + font-size: 12px; border: none; padding: none; } diff --git a/midian/src/Midi/Track.js b/midian/src/Midi/Track.js index 5f55ce9..a6feb70 100644 --- a/midian/src/Midi/Track.js +++ b/midian/src/Midi/Track.js @@ -67,6 +67,7 @@ export class Track { const noteOff = noteOffs.splice(offIndex, 1)[0] this.addNote({ midi : currentNote.noteNumber, + channel: currentNote.channel, ticks : currentNote.absoluteTime, velocity : currentNote.velocity / 127, durationTicks : noteOff.absoluteTime - currentNote.absoluteTime, diff --git a/midian/src/MidiConversion.js b/midian/src/MidiConversion.js index 71e3401..a08877a 100644 --- a/midian/src/MidiConversion.js +++ b/midian/src/MidiConversion.js @@ -10,6 +10,19 @@ class MidiConversion { console.log("MidiPPQ= " + midiPPQ); let delugePPQ = 48; let track = midi.tracks[trackNum - 1]; + let chanMask = this.channelMasks[trackNum - 1]; + let chanNum = 0; + + // Output all the events in this track on the lowest channel number found in it. + // so we need to find the lowest-order one bit. + if (chanMask) { + let bit = 1; + while ((bit & chanMask) === 0) { + bit = bit << 1; + chanNum++; + } + } + let notes = track.notes; let noteCount = notes.length; let lanes = []; @@ -84,7 +97,7 @@ class MidiConversion { let noteData = {"y": i, "noteData": laneh} trout.noteRows.noteRow.push(noteData); } - // trout.midiChannel = midi.header. + trout.midiChannel = chanNum; trout.trackLength = clipMax; return trackOut; } @@ -97,8 +110,9 @@ class MidiConversion { let highTime = -100000000; let lowTicks = 100000000; let highTicks = -100000000; - + let maskList = []; for(let tn = 0; tn < midi.tracks.length; ++tn) { + let channelMask = 0; let track = midi.tracks[tn]; let notes = track.notes; let noteCount = notes.length; @@ -113,12 +127,18 @@ class MidiConversion { let ttend = tt + n.durationTicks; if (tt < lowTicks) lowTicks = tt; if (ttend > highTicks) highTicks = ttend; + let c = n.channel; + if (c !== undefined) { + channelMask |= (1 << c); + } } + maskList.push(channelMask); } this.lowTime = lowTime; this.highTime = highTime; this.lowTicks = lowTicks; this.highTicks = highTicks; + this.channelMasks = maskList; } calcTrackLowTick(track, start, end) { diff --git a/midian/src/MidiDoc.jsx b/midian/src/MidiDoc.jsx index b286a18..7f4907f 100644 --- a/midian/src/MidiDoc.jsx +++ b/midian/src/MidiDoc.jsx @@ -1,7 +1,7 @@ import React from 'react'; import ReactDOM from "react-dom"; import $ from'./js/jquery-3.2.1.min.js'; -import Midi from "./Midi/Midi.js"; +import {Midi} from "./Midi/Midi.js"; import {WedgeIndicator, PushButton, CopyToClipButton} from './GUIstuff.jsx'; import {MidiConversion} from "./MidiConversion.js"; import {pasteTrackJson, getFocusDoc} from "../../xmlView/lib/SongLib.js"; @@ -202,24 +202,45 @@ class MidiGrid extends React.Component { } } +class ChannelMask extends React.Component { + render() { + let mask = this.props.channelMask; + let moreThanOne = false; + let rotating = 1; + let chanText = ""; + for (let i = 1; i <= 16; ++ i) { + if ((mask & rotating) != 0) { + if (moreThanOne) { + chanText += ", "; + } else { + moreThanOne = true; + } + chanText += i.toString(10); + } + rotating <<= 1; + } + return chanText; + } +} + class MidiTrack extends React.Component { render() { let track = this.props.track; let trackNum = this.props.trackNum; + let trackIndex = trackNum - 1; let song = this.props.song; let tname = track.name; let inst = track.instrument; + let trackMask = this.props.converter.channelMasks[trackIndex]; return (
- - - - - - + + +
{trackNum}:{track.channel}{tname ? track.name : null}
{inst ? {inst.name} : null}
- - +
{trackNum}:
{tname ? track.name : null}
{inst ? {inst.name} : null}
+ +
this.grid = el} track={track} converter={this.props.converter} />