From f104fc4e8a8694a73ec2beabe7b77d989d3d39d9 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Fri, 24 Mar 2017 23:43:36 -0300 Subject: [PATCH 01/44] initial commit --- .gitignore | 0 README.md | 21 + index.html | 59 ++ src/editor/editor.js | 690 ++++++++++++++++++++++ src/editor/editor_interaction.js | 963 +++++++++++++++++++++++++++++++ src/main.js | 54 ++ src/song/chord.js | 20 + src/song/key.js | 22 + src/song/meter.js | 40 ++ src/song/note.js | 14 + src/song/song.js | 73 +++ src/synth/instrument_piano.js | 38 ++ src/synth/instrument_square.js | 32 + src/synth/instrument_triangle.js | 32 + src/synth/synth.js | 228 ++++++++ src/util/list_by_point.js | 142 +++++ src/util/list_by_range.js | 143 +++++ src/util/math.js | 41 ++ src/util/rational.js | 248 ++++++++ src/util/theory.js | 327 +++++++++++ style.css | 349 +++++++++++ 21 files changed, 3536 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 src/editor/editor.js create mode 100644 src/editor/editor_interaction.js create mode 100644 src/main.js create mode 100644 src/song/chord.js create mode 100644 src/song/key.js create mode 100644 src/song/meter.js create mode 100644 src/song/note.js create mode 100644 src/song/song.js create mode 100644 src/synth/instrument_piano.js create mode 100644 src/synth/instrument_square.js create mode 100644 src/synth/instrument_triangle.js create mode 100644 src/synth/synth.js create mode 100644 src/util/list_by_point.js create mode 100644 src/util/list_by_range.js create mode 100644 src/util/math.js create mode 100644 src/util/rational.js create mode 100644 src/util/theory.js create mode 100644 style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..cb117f9 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Music Analysis + +[Try it now!](https://hlorenzi.github.io/musicanalysis/) + +This is a tool for composing or analyzing music. + +It's currently a proof-of-concept, and, as such, it is +very unoptimized performance-wise. + +Most editing tools are currently keyboard-only. +Play around with the Ctrl, Alt, and Shift key modifiers. + +In the future, it should support: + +- [ ] Full roman numeral harmony analysis +- [ ] Save/Load from Dropbox, URL, or local files +- [ ] Import/Export from MIDI, tracker, and other formats +- [ ] Song parameter changes, such as tempo +- [ ] Note pitch bending +- [ ] Multiple tracks and instruments +- [ ] Note/Track parameter changes, such as note velocity \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..cdcefa3 --- /dev/null +++ b/index.html @@ -0,0 +1,59 @@ + + + + + + + Music Analysis + + + + + + + + +
+ +
+ +
+ + + + +
+ + +
+ Tempo: + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/editor/editor.js b/src/editor/editor.js new file mode 100644 index 0000000..9da7ca5 --- /dev/null +++ b/src/editor/editor.js @@ -0,0 +1,690 @@ +function Editor(svg, synth) +{ + this.svg = svg; + this.synth = synth; + + this.svgCursor1 = null; + this.svgCursor2 = null; + this.svgCursorPlayback = null; + + this.song = null; + this.isPlaying = false; + + this.blocks = []; + this.elements = []; + + this.mouseIsDown = false; + this.newElementDuration = new Rational(0, 1, 4); + + this.cursorSnap = new Rational(0, 1, 16); + this.cursorVisible = true; + this.cursorTick1 = new Rational(0); + this.cursorTrack1 = 0; + this.cursorTick2 = new Rational(0); + this.cursorTrack2 = 0; + this.cursorTickPlayback = new Rational(0); + + this.width = 0; + this.height = 0; + + this.defaultNoteMidiPitchMin = 60; + this.defaultNoteMidiPitchMax = 71; + + this.margin = 10; + this.marginBetweenRows = 10; + this.wholeTickWidth = 100; + this.noteHeight = 5; + this.noteSideMargin = 0.5; + this.chordHeight = 50; + this.chordSideMargin = 0.5; + this.chordOrnamentHeight = 5; + + this.eventInit(); + + this.callbackTogglePlay = null; + this.callbackCursorChange = null; +} + + +Editor.prototype.setSong = function(song) +{ + this.song = song; + this.refresh(); +} + + +Editor.prototype.togglePlay = function() +{ + this.isPlaying = !this.isPlaying; + + if (this.isPlaying) + { + var startAtTick = this.cursorTick1.clone().min(this.cursorTick2); + startAtTick.subtract(new Rational(1)); + startAtTick.max(new Rational(0)); + + this.play(startAtTick); + } + else + { + this.synth.clear(); + this.synth.stop(); + this.cursorHidePlayback(); + this.cursorVisible = true; + this.refresh(); + } + + if (this.callbackTogglePlay != null) + this.callbackTogglePlay(this.isPlaying); +} + + +Editor.prototype.play = function(startAtTick) +{ + this.synth.clear(); + this.synth.stop(); + + if (this.song != null) + this.song.feedSynth(this.synth, startAtTick); + + this.selectNone(); + this.cursorHide(); + this.cursorSetTickPlayback(startAtTick); + this.refresh(); + + var that = this; + this.synth.play(function(time) + { + // NOTE: Watch out for fixed song tempo, + // if that changes in the future. + + // Convert time from seconds to ticks. + var percentageOfWholeNote = time / (1000 / that.song.bpm / 4); + var tick = Rational.fromFloat(percentageOfWholeNote, new Rational(0, 1, 64)); + tick.add(startAtTick); + + that.cursorSetTickPlayback(tick); + + if (tick.compare(that.song.length) >= 0) + that.togglePlay(); + }); +} + + +Editor.prototype.rewind = function() +{ + if (this.isPlaying) + this.togglePlay(); + + this.selectNone(); + this.cursorSetTickBoth(new Rational(0)); + + this.refresh(); +} + + +Editor.prototype.updateSvgCursor = function(node, visible, tick, track1, track2) +{ + if (!visible) + { + editSvgNode(node, { x1: 0, y1: 0, x2: 0, y2: 0 }); + return; + } + + var block = this.getBlockAtTick(tick); + if (block == null) + { + editSvgNode(node, { x1: 0, y1: 0, x2: 0, y2: 0 }); + return; + } + + var tickOffset = tick.clone().subtract(block.tickStart); + var xOffset = tickOffset.asFloat() * this.wholeTickWidth; + + var trackMin = Math.min(track1, track2); + var trackMax = Math.max(track1, track2); + + var yOffset1 = block.trackNoteYStart; + if (trackMin == 1) + yOffset1 = block.trackChordYStart; + + var yOffset2 = block.trackNoteYEnd; + if (trackMax == 1) + yOffset2 = block.trackChordYEnd; + + editSvgNode(node, + { + x1: block.x + xOffset, + y1: block.y + yOffset1 - 5, + x2: block.x + xOffset, + y2: block.y + yOffset2 + 5 + }); +} + + +Editor.prototype.getBlockAt = function(x, y) +{ + // TODO: Optimize block search. + for (var i = 0; i < this.blocks.length; i++) + { + var block = this.blocks[i]; + + // Only check the right and bottom boundaries, + // as to recognize the left and top margin space + // as part of the block. + // It works because this is a linear search loop. + if (x < block.x + block.width && + y < block.y + block.height) + { + return block; + } + } + + return null; +} + + +Editor.prototype.getBlockAtTick = function(tick) +{ + // TODO: Optimize block search. + for (var i = 0; i < this.blocks.length; i++) + { + var block = this.blocks[i]; + + if (tick.compare(block.tickEnd) < 0) + return block; + } + + return null; +} + + +Editor.prototype.getElementAt = function(x, y) +{ + var block = this.getBlockAt(x, y); + if (block == null) + return null; + + for (var i = 0; i < block.elements.length; i++) + { + var elem = block.elements[i]; + + if (x >= elem.x && y >= elem.y && + x <= elem.x + elem.width && + y <= elem.y + elem.height) + return elem; + } + + return null; +} + + +Editor.prototype.getTickOffset = function(x, snap) +{ + var offset = new Rational(0); + + while (offset.asFloat() * this.wholeTickWidth < x) + offset.add(snap); + + if (offset.compare(snap) >= 0) + offset.subtract(snap); + + return offset; +} + + +Editor.prototype.refresh = function() +{ + // Update dimensions. + this.width = this.svg.clientWidth; + this.height = this.svg.clientHeight; + + // Clear SVG elements. + while (this.svg.lastChild) + this.svg.removeChild(this.svg.lastChild); + + // Clear layout blocks. + this.blocks = []; + + // Early return if no song. + if (this.song == null) + return; + + // Keep creating rows while song is not over. + var tick = new Rational(0); + var y = this.margin; + while (tick.compare(this.song.length) < 0) + { + var row = this.refreshRow(tick, y); + tick = row.tickEnd; + y = row.yEnd; + } + + // Resize SVG element for vertical scrolling to work. + this.svg.style.height = y + this.margin; + + // Render cursors. + this.svgCursor1 = this.addSvgNode("viewerCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + this.svgCursor2 = this.addSvgNode("viewerCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + this.svgCursorPlayback = this.addSvgNode("viewerCursorPlayback", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + + if (this.cursorVisible) + { + this.updateSvgCursor(this.svgCursor1, true, this.cursorTick1, this.cursorTrack1, this.cursorTrack2); + this.updateSvgCursor(this.svgCursor2, true, this.cursorTick2, this.cursorTrack1, this.cursorTrack2); + } +} + + +Editor.prototype.refreshRow = function(rowTickStart, rowYStart) +{ + // Calculate blocks. + // Break row only at measure separators or key/meter changes. + var calculatedBlocks = []; + + var currentBlockStart = rowTickStart.clone(); + var currentKeyChange = this.song.keyChanges.findPrevious(rowTickStart); + var currentMeterChange = this.song.meterChanges.findPrevious(rowTickStart); + + var x = this.margin; + while (true) + { + var nextBlockEnd = currentBlockStart.clone().add(currentMeterChange.getMeasureLength()); + + var nextKeyChange = this.song.keyChanges.findNext(currentBlockStart); + var nextMeterChange = this.song.meterChanges.findNext(currentBlockStart); + + if (nextKeyChange != null && nextKeyChange.tick.compare(nextBlockEnd) < 0) + nextBlockEnd = nextKeyChange.tick.clone(); + + if (nextMeterChange != null && nextMeterChange.tick.compare(nextBlockEnd) < 0) + nextBlockEnd = nextMeterChange.tick.clone(); + + if (this.song.length.compare(nextBlockEnd) < 0) + nextBlockEnd = this.song.length.clone(); + + var width = (nextBlockEnd.asFloat() - currentBlockStart.asFloat()) * this.wholeTickWidth; + + if (x + width + this.margin > this.width) + break; + + var block = + { + tickStart: currentBlockStart.clone(), + tickEnd: nextBlockEnd.clone(), + measureStartTick: currentMeterChange.tick.clone(), + x: x, + y: rowYStart, + width: width, + key: currentKeyChange, + meter: currentMeterChange + }; + + calculatedBlocks.push(block); + + x += width; + + currentBlockStart = nextBlockEnd; + + if (nextKeyChange != null && nextKeyChange.tick.compare(nextBlockEnd) == 0) + currentKeyChange = nextKeyChange; + + if (nextMeterChange != null && nextMeterChange.tick.compare(nextBlockEnd) == 0) + currentMeterChange = nextMeterChange; + + if (this.song.length.compare(nextBlockEnd) == 0) + break; + } + + var rowTickEnd = currentBlockStart; + var rowTickLength = rowTickEnd.clone().subtract(rowTickStart); + + // Find the lowest and highest pitches for notes in this row. + var midiPitchMin = this.defaultNoteMidiPitchMin; + var midiPitchMax = this.defaultNoteMidiPitchMax; + + this.song.notes.enumerateOverlappingRange(rowTickStart, rowTickEnd, function (note) + { + midiPitchMin = Math.min(note.midiPitch, midiPitchMin); + midiPitchMax = Math.max(note.midiPitch, midiPitchMax); + }); + + // Check if there are any key changes in this row. + var rowHasKeyChange = false; + this.song.keyChanges.enumerateOverlappingRange(rowTickStart, rowTickEnd, function (keyCh) + { + rowHasKeyChange = true; + }); + + // Check if there are any meter changes in this row. + var rowHasMeterChange = false; + this.song.meterChanges.enumerateOverlappingRange(rowTickStart, rowTickEnd, function (meterCh) + { + rowHasMeterChange = true; + }); + + // Render blocks. + for (var i = 0; i < calculatedBlocks.length; i++) + { + var block = this.refreshBlock( + calculatedBlocks[i], + midiPitchMin, midiPitchMax, + rowHasKeyChange, rowHasMeterChange); + + this.blocks.push(block); + } + + if (calculatedBlocks.length > 0) + { + return { + tickEnd: rowTickEnd.clone(), + yEnd: rowYStart + calculatedBlocks[0].height + this.marginBetweenRows + }; + } + else + { + return { + tickEnd: rowTickEnd.clone(), + yEnd: rowYStart + }; + } +} + + +Editor.prototype.refreshBlock = function( + block, + midiPitchMin, midiPitchMax, + rowHasKeyChange, rowHasMeterChange) +{ + var that = this; + + // Add block layout to master list. + // This is used for mouse interaction. + block.elements = []; + + block.trackKeyChangeYStart = 0; + block.trackKeyChangeYEnd = block.trackKeyChangeYStart + (rowHasKeyChange ? 20 : 0); + + block.trackMeterChangeYStart = block.trackKeyChangeYEnd; + block.trackMeterChangeYEnd = block.trackMeterChangeYStart + (rowHasMeterChange ? 20 : 0); + + block.trackNoteYStart = block.trackMeterChangeYEnd; + block.trackNoteYEnd = block.trackNoteYStart + (midiPitchMax + 1 - midiPitchMin) * this.noteHeight; + + block.trackChordYStart = block.trackNoteYEnd; + block.trackChordYEnd = block.trackChordYStart + this.chordHeight; + + block.height = block.trackChordYEnd; + + // Render the row's background. + this.addSvgNode("viewerBlockBackground", "rect", + { + x: block.x, + y: block.y + block.trackNoteYStart, + width: block.width, + height: block.trackChordYEnd - block.trackNoteYStart + }); + + // Render the beat indicators. + var beatTick = block.measureStartTick.clone(); + while (true) + { + beatTick.add(block.meter.getBeatLength()); + + if (beatTick.compare(block.tickStart) <= 0) + continue; + + if (beatTick.compare(block.tickEnd) >= 0) + break; + + var xBeat = (beatTick.asFloat() - block.tickStart.asFloat()) * this.wholeTickWidth; + + var svgBeat = this.addSvgNode("viewerBeat", "line", + { + x1: block.x + xBeat, + y1: block.y + block.trackNoteYStart, + x2: block.x + xBeat, + y2: block.y + block.trackChordYEnd + }); + } + + // Render the note track's frame. + this.addSvgNode("viewerBlockFrame", "rect", + { + x: block.x, + y: block.y + block.trackNoteYStart, + width: block.width, + height: block.trackNoteYEnd - block.trackNoteYStart + }); + + // Render the chord track's frame. + this.addSvgNode("viewerBlockFrame", "rect", + { + x: block.x, + y: block.y + block.trackChordYStart, + width: block.width, + height: block.trackChordYEnd - block.trackChordYStart + }); + + // Render notes. + this.song.notes.enumerateOverlappingRange(block.tickStart, block.tickEnd, function (note) + { + var noteXStart = note.startTick.clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; + var noteXEnd = note.endTick .clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; + + noteXStart = Math.max(noteXStart, 0); + noteXEnd = Math.min(noteXEnd, block.width); + + var midiPitchOffset = note.midiPitch - midiPitchMin; + var noteYTop = block.trackNoteYEnd - (midiPitchOffset + 1) * that.noteHeight; + + var noteDegree = Theory.getTruncatedPitchFromPitch(note.midiPitch); + + var noteX = block.x + noteXStart + that.noteSideMargin; + var noteY = block.y + noteYTop; + var noteW = noteXEnd - noteXStart - that.noteSideMargin * 2; + var noteH = that.noteHeight; + + var svgNote = that.addSvgNode( + "viewerDegree" + noteDegree + (note.editorData.selected ? "Selected" : ""), + "rect", { x: noteX, y: noteY, width: noteW, height: noteH }); + + block.elements.push({ note: note, x: noteX, y: noteY, width: noteW, height: noteH }); + }); + + // Render chords. + this.song.chords.enumerateOverlappingRange(block.tickStart, block.tickEnd, function (chord) + { + var chordXStart = chord.startTick.clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; + var chordXEnd = chord.endTick .clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; + + chordXStart = Math.max(chordXStart, 0); + chordXEnd = Math.min(chordXEnd, block.width); + + var chordDegree = Theory.getTruncatedPitchFromPitch(chord.rootMidiPitch); + + var chordX = block.x + chordXStart + that.chordSideMargin; + var chordY = block.y + block.trackChordYStart; + var chordW = chordXEnd - chordXStart - that.chordSideMargin * 2; + var chordH = block.trackChordYEnd - block.trackChordYStart; + + that.addSvgNode("viewerChordBackground", "rect", + { x: chordX, y: chordY, width: chordW, height: chordH }); + + block.elements.push({ chord: chord, x: chordX, y: chordY, width: chordW, height: chordH }); + + that.addSvgNode("viewerDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + "rect", + { + x: block.x + chordXStart + that.chordSideMargin, + y: block.y + block.trackChordYStart, + width: chordXEnd - chordXStart - that.chordSideMargin * 2, + height: that.chordOrnamentHeight + }); + + that.addSvgNode("viewerDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + "rect", + { + x: block.x + chordXStart + that.chordSideMargin, + y: block.y + block.trackChordYEnd - that.chordOrnamentHeight, + width: chordXEnd - chordXStart - that.chordSideMargin * 2, + height: that.chordOrnamentHeight + }); + + // Build and add the chord label. + var chordLabel = Theory.getChordRootLabel(null, chordDegree); + if (Theory.chordKinds[chord.chordKindIndex].symbol[0]) + chordLabel = chordLabel.toLowerCase(); + + chordLabel += Theory.chordKinds[chord.chordKindIndex].symbol[1]; + + var chordLabelSuperscript = Theory.chordKinds[chord.chordKindIndex].symbol[2]; + + var svgChordLabel = that.addSvgTextComplemented( + "viewerChordLabel", + "viewerChordLabelSuperscript", + chordLabel, + chordLabelSuperscript, + { + x: block.x + chordXStart + (chordXEnd - chordXStart) / 2, + y: block.y + (block.trackChordYStart + block.trackChordYEnd) / 2 + }); + + // Narrow text if it overflows the space. + if (svgChordLabel.getComputedTextLength() > chordXEnd - chordXStart) + { + editSvgNode(svgChordLabel, + { + textLength: chordXEnd - chordXStart, + lengthAdjust: "spacingAndGlyphs" + }); + } + }); + + // Render cursor selection. + var cursorTickMin = this.cursorTick1.clone().min(this.cursorTick2); + var cursorTickMax = this.cursorTick1.clone().max(this.cursorTick2); + var cursorTrackMin = Math.min(this.cursorTrack1, this.cursorTrack2); + var cursorTrackMax = Math.max(this.cursorTrack1, this.cursorTrack2); + + if (this.cursorVisible && + cursorTickMin.compare(block.tickEnd) < 0 && + cursorTickMax.compare(block.tickStart) > 0) + { + var selectionXStart = cursorTickMin.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; + var selectionXEnd = cursorTickMax.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; + + selectionXStart = Math.max(selectionXStart, 0); + selectionXEnd = Math.min(selectionXEnd, block.width); + + var selectionYStart = block.trackNoteYStart; + if (cursorTrackMin == 1) + selectionYStart = block.trackChordYStart; + + var selectionYEnd = block.trackNoteYEnd; + if (cursorTrackMax == 1) + selectionYEnd = block.trackChordYEnd; + + this.addSvgNode("viewerBlockSelection", "rect", + { + x: block.x + selectionXStart, + y: block.y + selectionYStart, + width: selectionXEnd - selectionXStart, + height: selectionYEnd - selectionYStart + }); + } + + // Render key change. + if (block.key.tick.compare(block.tickStart) == 0) + { + var keyChX = block.key.tick.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; + + that.addSvgNode("viewerKeyLine", "line", + { + x1: block.x + keyChX, + y1: block.y + block.trackKeyChangeYStart, + x2: block.x + keyChX, + y2: block.y + block.trackChordYEnd + }); + + that.addSvgText("viewerKeyLabel", block.key.getLabel(), + { + x: block.x + keyChX + 5, + y: block.y + (block.trackKeyChangeYStart + block.trackKeyChangeYEnd) / 2 + }); + } + + // Render meter change. + if (block.meter.tick.compare(block.tickStart) == 0) + { + var meterChX = block.meter.tick.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; + + that.addSvgNode("viewerMeterLine", "line", + { + x1: block.x + meterChX, + y1: block.y + block.trackMeterChangeYStart, + x2: block.x + meterChX, + y2: block.y + block.trackChordYEnd + }); + + that.addSvgText("viewerMeterLabel", block.meter.getLabel(), + { + x: block.x + meterChX + 5, + y: block.y + (block.trackMeterChangeYStart + block.trackMeterChangeYEnd) / 2 + }); + } + + + return block; +} + + +Editor.prototype.addSvgNode = function(cl, kind, attributes) +{ + var node = makeSvgNode(kind, attributes); + node.setAttribute("class", cl); + this.svg.appendChild(node); + return node; +} + + +Editor.prototype.addSvgText = function(cl, text, attributes) +{ + var node = makeSvgNode("text", attributes); + node.setAttribute("class", cl); + node.innerHTML = text; + this.svg.appendChild(node); + return node; +} + + +Editor.prototype.addSvgTextComplemented = function(cl, clSuperscript, text, textSuperscript, attributes) +{ + var nodeSuperscript = makeSvgNode("tspan", { "baseline-shift": "super" }); + nodeSuperscript.setAttribute("class", clSuperscript); + nodeSuperscript.innerHTML = textSuperscript; + + var node = makeSvgNode("text", attributes); + node.setAttribute("class", cl); + node.innerHTML = text; + + node.appendChild(nodeSuperscript); + this.svg.appendChild(node); + return node; +} + + +function makeSvgNode(kind, attributes) +{ + var node = document.createElementNS("http://www.w3.org/2000/svg", kind); + for (var attr in attributes) + node.setAttributeNS(null, attr, attributes[attr]); + return node; +} + + +function editSvgNode(node, attributes) +{ + for (var attr in attributes) + node.setAttributeNS(null, attr, attributes[attr]); +} \ No newline at end of file diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js new file mode 100644 index 0000000..52d31fc --- /dev/null +++ b/src/editor/editor_interaction.js @@ -0,0 +1,963 @@ +Editor.prototype.eventInit = function() +{ + var that = this; + + this.svg.onmousemove = function(ev) { that.eventMouseMove(ev); }; + this.svg.onmousedown = function(ev) { that.eventMouseDown(ev); }; + this.svg.onmouseout = function(ev) { that.eventMouseOut (ev); }; + + window.onmouseup = function(ev) { that.eventMouseUp(ev); }; + window.onkeydown = function(ev) { that.eventKeyDown(ev); }; +} + + +Editor.prototype.isAnySelected = function() +{ + // TODO: Optimize. + var anySelected = false; + this.song.notes .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.chords.enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + return anySelected; +} + + +Editor.prototype.selectNone = function() +{ + // TODO: Optimize. + this.song.notes .enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.chords.enumerateAll(function (item) { item.editorData.selected = false; }); +} + + +Editor.prototype.selectBetweenCursors = function() +{ + var tickMin = this.cursorTick1.clone().min(this.cursorTick2); + var tickMax = this.cursorTick1.clone().max(this.cursorTick2); + var trackMin = Math.min(this.cursorTrack1, this.cursorTrack2); + var trackMax = Math.max(this.cursorTrack1, this.cursorTrack2); + + if (tickMin.compare(tickMax) == 0) + { + this.selectNone(); + return; + } + + // TODO: Optimize. + this.song.notes.enumerateAll(function (item) + { + item.editorData.selected = + trackMin <= 0 && trackMax >= 0 && + item.startTick.compare(tickMax) < 0 && + item.endTick .compare(tickMin) > 0; + }); + + this.song.chords.enumerateAll(function (item) + { + item.editorData.selected = + trackMin <= 1 && trackMax >= 1 && + item.startTick.compare(tickMax) < 0 && + item.endTick .compare(tickMin) > 0; + }); +} + + +Editor.prototype.enumerateSelectedNotes = function(callback) +{ + // TODO: Optimize. + this.song.notes.enumerateAll(function(note) + { + if (note.editorData.selected) + callback(note); + }); +} + + +Editor.prototype.enumerateSelectedChords = function(callback) +{ + // TODO: Optimize. + this.song.chords.enumerateAll(function(chord) + { + if (chord.editorData.selected) + callback(chord); + }); +} + + +Editor.prototype.cursorIsRangeSelection = function() +{ + return this.cursorTick1.compare(this.cursorTick2) != 0; +} + + +Editor.prototype.cursorHide = function() +{ + this.cursorVisible = false; +} + + +Editor.prototype.cursorSetTickBoth = function(tick) +{ + this.cursorTick1 = tick.clone(); + this.cursorTick2 = tick.clone(); +} + + +Editor.prototype.cursorSetTick2 = function(tick) +{ + this.cursorTick2 = tick.clone(); +} + + +Editor.prototype.cursorSetTrackBoth = function(track) +{ + this.cursorTrack1 = track; + this.cursorTrack2 = track; +} + + +Editor.prototype.cursorSetTrack2 = function(track) +{ + this.cursorTrack2 = track; +} + + +Editor.prototype.cursorSetTickAtSelectionStart = function() +{ + if (this.isAnySelected()) + { + var tick = this.song.length.clone(); + + this.enumerateSelectedNotes(function(note) + { + if (note.startTick.compare(tick) < 0) + tick = note.startTick.clone(); + }); + + this.enumerateSelectedChords(function(chord) + { + if (chord.startTick.compare(tick) < 0) + tick = chord.startTick.clone(); + }); + + this.cursorSetTickBoth(tick); + } +} + + +Editor.prototype.cursorSetTickAtSelectionEnd = function() +{ + if (this.isAnySelected()) + { + var tick = new Rational(0); + + this.enumerateSelectedNotes(function(note) + { + if (note.endTick.compare(tick) > 0) + tick = note.endTick.clone(); + }); + + this.enumerateSelectedChords(function(chord) + { + if (chord.endTick.compare(tick) > 0) + tick = chord.endTick.clone(); + }); + + this.cursorSetTickBoth(tick); + } +} + + +Editor.prototype.cursorHidePlayback = function() +{ + this.updateSvgCursor(this.svgCursorPlayback, false, this.cursorTickPlayback, 0, 1); +} + + +Editor.prototype.cursorSetTickPlayback = function(tick) +{ + this.cursorTickPlayback = tick.clone(); + this.updateSvgCursor(this.svgCursorPlayback, true, this.cursorTickPlayback, 0, 1); +} + + +Editor.prototype.autoExtendSongLength = function() +{ + var newLength = this.cursorTick1.clone().add(new Rational(1)); + + if (this.song.length.compare(newLength) < 0) + this.song.length = newLength; + + var newLength = this.cursorTick2.clone().add(new Rational(1)); + + if (this.song.length.compare(newLength) < 0) + this.song.length = newLength; +} + + +Editor.prototype.eventMouseMove = function(ev) +{ + ev.preventDefault(); + + if (this.isPlaying) + return; + + var elemRect = this.svg.getBoundingClientRect(); + var mouseX = ev.clientX - elemRect.left; + var mouseY = ev.clientY - elemRect.top; + + this.svg.style.cursor = "text"; + + // Handle range selection. + if (this.mouseIsDown && this.cursorVisible) + { + // Set cursor tick. + var blockAtMouse = this.getBlockAt(mouseX, mouseY); + + var newCursorTick = new Rational(0); + if (blockAtMouse != null) + newCursorTick = this.getTickOffset(mouseX - blockAtMouse.x, this.cursorSnap).add(blockAtMouse.tickStart); + + this.cursorSetTick2(newCursorTick); + + // Set cursor track. + var newCursorTrack = 0; + if (blockAtMouse != null && mouseY > blockAtMouse.y + blockAtMouse.trackNoteYEnd) + newCursorTrack = 1; + + this.cursorSetTrack2(newCursorTrack); + + + this.selectBetweenCursors(); + this.autoExtendSongLength(); + this.refresh(); + } + + // Else, handle hovering cursor. + else + { + var elementAtMouse = this.getElementAt(mouseX, mouseY); + if (elementAtMouse != null) + { + if (elementAtMouse.note != undefined) + this.svg.style.cursor = "pointer"; + + else if (elementAtMouse.chord != undefined) + this.svg.style.cursor = "pointer"; + } + } +} + + +Editor.prototype.eventMouseDown = function(ev) +{ + ev.preventDefault(); + document.activeElement.blur(); + + if (this.isPlaying) + return; + + var elemRect = this.svg.getBoundingClientRect(); + var mouseX = ev.clientX - elemRect.left; + var mouseY = ev.clientY - elemRect.top; + + this.cursorVisible = true; + + // Select elements. + this.sliceOverlapping(); + + var elementAtMouse = this.getElementAt(mouseX, mouseY); + + if (!ev.ctrlKey) + this.selectNone(); + + if (!ev.shiftKey && elementAtMouse != null) + { + this.cursorVisible = false; + + if (elementAtMouse.note != undefined) + { + elementAtMouse.note.editorData.selected = !elementAtMouse.note.editorData.selected; + Theory.playSampleNote(this.synth, elementAtMouse.note.midiPitch); + } + + else if (elementAtMouse.chord != undefined) + { + elementAtMouse.chord.editorData.selected = !elementAtMouse.chord.editorData.selected; + Theory.playSampleChord( + this.synth, + elementAtMouse.chord.chordKindIndex, + elementAtMouse.chord.rootMidiPitch, + elementAtMouse.chord.embelishments); + } + } + + // Set cursor tick. + var blockAtMouse = this.getBlockAt(mouseX, mouseY); + + var newCursorTick = new Rational(0); + if (blockAtMouse != null) + newCursorTick = this.getTickOffset(mouseX - blockAtMouse.x, this.cursorSnap).add(blockAtMouse.tickStart); + + this.cursorSetTickBoth(newCursorTick); + + // Set cursor track. + var newCursorTrack = 0; + if (blockAtMouse != null && mouseY > blockAtMouse.y + blockAtMouse.trackNoteYEnd) + newCursorTrack = 1; + + this.cursorSetTrackBoth(newCursorTrack); + + + this.mouseIsDown = true; + this.refresh(); +} + + +Editor.prototype.eventMouseUp = function(ev) +{ + ev.preventDefault(); + + if (this.isPlaying) + return; + + var elemRect = this.svg.getBoundingClientRect(); + var mouseX = ev.clientX - elemRect.left; + var mouseY = ev.clientY - elemRect.top; + + this.mouseIsDown = false; +} + + +Editor.prototype.eventMouseOut = function(ev) +{ + ev.preventDefault(); + + if (this.isPlaying) + return; +} + + +Editor.prototype.eventKeyDown = function(ev) +{ + var actionSelect = ev.shiftKey; + var actionSpeedUp = ev.altKey; + var actionStretch = ev.ctrlKey; + + if (this.isPlaying) + { + switch (ev.keyCode) + { + // Space + case 32: + { + this.togglePlay(); + break; + } + + // Left arrow + case 37: + { + this.play(this.cursorTickPlayback.clone().subtract(new Rational(1)).max(new Rational(0))); + break; + } + + // Right arrow + case 39: + { + this.play(this.cursorTickPlayback.clone().add(new Rational(1))); + break; + } + + // Else, skip preventDefault() below. + default: { return; } + } + } + + else + { + switch (ev.keyCode) + { + // Enter + case 13: + // Esc + case 27: + { + this.performUnselectAction(); + break; + } + + // Space + case 32: + { + this.togglePlay(); + break; + } + + // Backspace + case 8: + { + this.performBackEraseAction(); + break; + } + + // Delete + case 46: + { + this.performDeleteAction(); + break; + } + + // Left arrow + case 37: + { + if (this.isAnySelected() && !actionSelect) + { + this.cursorHide(); + + if (actionStretch) + this.performElementDurationChange((actionSpeedUp ? new Rational(1) : this.cursorSnap.clone()).negate()); + else + this.performElementTimeChange((actionSpeedUp ? new Rational(1) : this.cursorSnap.clone()).negate()); + } + else if (this.cursorVisible) + { + this.performCursorTimeChange((actionSpeedUp ? new Rational(1) : this.cursorSnap.clone()).negate(), !actionSelect); + } + + break; + } + + // Right arrow + case 39: + { + if (this.isAnySelected() && !actionSelect) + { + this.cursorHide(); + + if (actionStretch) + this.performElementDurationChange(actionSpeedUp ? new Rational(1) : this.cursorSnap.clone()); + else + this.performElementTimeChange(actionSpeedUp ? new Rational(1) : this.cursorSnap.clone()); + } + else if (this.cursorVisible) + { + this.performCursorTimeChange(actionSpeedUp ? new Rational(1) : this.cursorSnap.clone(), !actionSelect); + } + + break; + } + + // Up arrow + case 38: + { + if (this.isAnySelected() && !actionSelect) + { + this.cursorHide(); + this.performElementPitchChange(actionSpeedUp ? 12 : 1); + } + else if (this.cursorVisible) + { + this.performCursorTrackChange(-1, !actionSelect); + } + + break; + } + + // Down arrow + case 40: + { + if (this.isAnySelected() && !actionSelect) + { + this.cursorHide(); + this.performElementPitchChange(actionSpeedUp ? -12 : -1); + } + else if (this.cursorVisible) + { + this.performCursorTrackChange(1, !actionSelect); + } + + break; + } + + // S, D, G, H, J, + // Z, X, C, V, B, N, M + case 90: { this.performInsertPitchAction(0); break; } + case 83: { this.performInsertPitchAction(1); break; } + case 88: { this.performInsertPitchAction(2); break; } + case 68: { this.performInsertPitchAction(3); break; } + case 67: { this.performInsertPitchAction(4); break; } + case 86: { this.performInsertPitchAction(5); break; } + case 71: { this.performInsertPitchAction(6); break; } + case 66: { this.performInsertPitchAction(7); break; } + case 72: { this.performInsertPitchAction(8); break; } + case 78: { this.performInsertPitchAction(9); break; } + case 74: { this.performInsertPitchAction(10); break; } + case 77: { this.performInsertPitchAction(11); break; } + + // Else, skip preventDefault() below. + default: { return; } + } + } + + ev.preventDefault(); +} + + +Editor.prototype.performUnselectAction = function() +{ + this.cursorVisible = true; + this.cursorSetTickAtSelectionEnd(); + + this.sliceOverlapping(); + this.selectNone(); + this.autoExtendSongLength(); + this.refresh(); +} + + +Editor.prototype.performDeleteAction = function() +{ + this.cursorVisible = true; + this.cursorSetTickAtSelectionStart(); + + var notesToDelete = []; + this.enumerateSelectedNotes(function (note) { notesToDelete.push(note); }); + + for (var i = 0; i < notesToDelete.length; i++) + this.song.notes.remove(notesToDelete[i]); + + var chordsToDelete = []; + this.enumerateSelectedChords(function (chord) { chordsToDelete.push(chord); }); + + for (var i = 0; i < chordsToDelete.length; i++) + this.song.chords.remove(chordsToDelete[i]); + + this.selectNone(); + this.refresh(); +} + + +Editor.prototype.performBackEraseAction = function() +{ + this.cursorVisible = true; + + var that = this; + var tickMin = this.cursorTick1.clone().min(this.cursorTick2); + var tickMax = this.cursorTick1.clone().max(this.cursorTick2); + var trackMin = Math.min(this.cursorTrack1, this.cursorTrack2); + var trackMax = Math.max(this.cursorTrack1, this.cursorTrack2); + + if (this.cursorIsRangeSelection()) + { + // Erase selected section. + if (trackMin <= 0 && trackMax >= 0) + this.eraseNotesAt(tickMin, tickMax); + + if (trackMin <= 1 && trackMax >= 1) + this.eraseChordsAt(tickMin, tickMax); + + this.cursorSetTickBoth(tickMin); + } + else + { + // Find out where to move the cursor. + var moveToTick = new Rational(0); + + if (trackMin <= 0 && trackMax >= 0) + { + var prevNote = this.song.notes.findPrevious(this.cursorTick1); + if (prevNote != null) + { + if (prevNote.endTick.compare(this.cursorTick1) != 0) + moveToTick.max(prevNote.endTick); + + else + { + this.song.notes.enumerateAll(function (note) + { + if (note.endTick.compare(that.cursorTick1) != 0) + return; + + moveToTick.max(note.startTick); + }); + } + } + } + + if (trackMin <= 1 && trackMax >= 1) + { + var prevChord = this.song.chords.findPrevious(this.cursorTick1); + if (prevChord != null) + { + if (prevChord.endTick.compare(this.cursorTick1) != 0) + moveToTick.max(prevChord.endTick); + + else + { + this.song.chords.enumerateAll(function (chord) + { + if (chord.endTick.compare(that.cursorTick1) != 0) + return; + + moveToTick.max(chord.startTick); + }); + } + } + } + + moveToTick.min(this.cursorTick1); + + // Erase section. + if (trackMin <= 0 && trackMax >= 0) + this.eraseNotesAt(moveToTick, this.cursorTick1); + + if (trackMin <= 1 && trackMax >= 1) + this.eraseChordsAt(moveToTick, this.cursorTick1); + + this.cursorSetTickBoth(moveToTick); + } + + this.selectNone(); + this.refresh(); +} + + +Editor.prototype.performCursorTimeChange = function(amount, both) +{ + var referenceTick = this.cursorTick2.clone(); + + // Cap amount, in case cursor would fall + // out of bounds. + if (both) + { + if (amount.compare(new Rational(0)) < 0) + referenceTick.min(this.cursorTick1); + else + referenceTick.max(this.cursorTick1); + + var minCap = referenceTick.clone().negate(); + if (minCap.compare(amount) > 0) + amount = minCap; + } + else + { + var minCap = referenceTick.clone().negate(); + if (minCap.compare(amount) > 0) + amount = minCap; + } + + // Apply cursor movement. + if (both) + this.cursorSetTickBoth(referenceTick.add(amount)); + else + this.cursorSetTick2(this.cursorTick2.clone().add(amount)); + + if (!both) + this.selectBetweenCursors(); + + + this.autoExtendSongLength(); + this.refresh(); +} + + +Editor.prototype.performCursorTrackChange = function(amount, both) +{ + var referenceTrack = this.cursorTrack2; + + // Cap amount, in case cursor would fall + // out of bounds. + if (both) + { + if (amount < 0) + referenceTrack = Math.min(referenceTrack, this.cursorTrack1); + else + referenceTrack = Math.max(referenceTrack, this.cursorTrack1); + + var minCap = -referenceTrack; + var maxCap = 1 - referenceTrack; + amount = Math.min(maxCap, Math.max(minCap, amount)); + } + else + { + var minCap = -referenceTrack; + var maxCap = 1 - referenceTrack; + amount = Math.min(maxCap, Math.max(minCap, amount)); + } + + // Apply cursor movement. + if (both) + this.cursorSetTrackBoth(referenceTrack + amount); + else + this.cursorSetTrack2(this.cursorTrack2 + amount); + + if (!both) + this.selectBetweenCursors(); + + + this.refresh(); +} + + +Editor.prototype.performInsertPitchAction = function(midiPitch) +{ + this.cursorSetTickAtSelectionEnd(); + this.sliceOverlapping(); + this.selectNone(); + + // Add a note. + if (this.cursorTrack1 != this.cursorTrack2 || + this.cursorTrack1 == 0) + { + var note = new SongNote( + this.cursorTick1.clone(), + this.cursorTick1.clone().add(this.newElementDuration), + 0, + midiPitch + 60, + { selected: true }); + + this.song.notes.insert(note); + + this.synth.clear(); + this.synth.stop(); + Theory.playSampleNote(this.synth, midiPitch + 60); + this.synth.play(); + + this.cursorSetTrackBoth(0); + } + + // Else, add a chord. + else + { + var chord = new SongChord( + this.cursorTick1.clone(), + this.cursorTick1.clone().add(this.newElementDuration), + 0, + midiPitch, + [], + { selected: true }); + + this.song.chords.insert(chord); + + this.synth.clear(); + this.synth.stop(); + Theory.playSampleChord(this.synth, 0, midiPitch, []); + this.synth.play(); + + this.cursorSetTrackBoth(1); + } + + this.cursorSetTickBoth(this.cursorTick1.clone().add(this.newElementDuration)); + + + this.autoExtendSongLength(); + this.refresh(); +} + + +Editor.prototype.performElementPitchChange = function(amount) +{ + // Cap amount, in case notes would fall + // out of bounds. + this.enumerateSelectedNotes(function(note) + { + if (note.midiPitch + amount > Theory.midiPitchMax) + amount = Theory.midiPitchMax - note.midiPitch; + + else if (note.midiPitch + amount < Theory.midiPitchMin) + amount = Theory.midiPitchMin - note.midiPitch; + }); + + // Apply changes to elements. + var noteToSample = null; + this.enumerateSelectedNotes(function(note) + { + note.midiPitch += amount; + noteToSample = note; + }); + + var chordToSample = null; + this.enumerateSelectedChords(function(chord) + { + chord.rootMidiPitch = (chord.rootMidiPitch + 12 + amount) % 12; + chordToSample = chord; + }); + + if (chordToSample == null) + Theory.playSampleNote(this.synth, noteToSample.midiPitch); + + if (noteToSample == null) + Theory.playSampleChord( + this.synth, + chordToSample.chordKindIndex, + chordToSample.rootMidiPitch, + chordToSample.embelishments); + + this.refresh(); +} + + +Editor.prototype.performElementTimeChange = function(amount) +{ + // Cap amount, in case notes would fall + // out of bounds. + this.enumerateSelectedNotes(function(note) + { + var minCap = note.startTick.clone().negate(); + + if (minCap.compare(amount) > 0) + amount = minCap; + }); + + this.enumerateSelectedChords(function(chord) + { + var minCap = chord.startTick.clone().negate(); + + if (minCap.compare(amount) > 0) + amount = minCap; + }); + + // Apply changes to elements. + this.enumerateSelectedNotes(function(note) + { + note.startTick.add(amount); + note.endTick.add(amount); + }); + + this.enumerateSelectedChords(function(chord) + { + chord.startTick.add(amount); + chord.endTick.add(amount); + }); + + + this.refresh(); +} + + +Editor.prototype.performElementDurationChange = function(amount) +{ + var that = this; + + // Apply changes to elements. + this.enumerateSelectedNotes(function(note) + { + var newEndTick = note.endTick.clone().add(amount); + + if (newEndTick.compare(note.startTick) > 0) + { + note.endTick = newEndTick; + that.newElementDuration = note.endTick.clone().subtract(note.startTick); + } + }); + + this.enumerateSelectedChords(function(chord) + { + var newEndTick = chord.endTick.clone().add(amount); + + if (newEndTick.compare(chord.startTick) > 0) + { + chord.endTick = newEndTick; + that.newElementDuration = chord.endTick.clone().subtract(chord.startTick); + } + }); + + + this.refresh(); +} + + +Editor.prototype.sliceOverlapping = function() +{ + // Remove selected elements temporarily from song. + var selectedNotes = []; + this.enumerateSelectedNotes(function(note) { selectedNotes.push(note); }); + this.song.notes.removeList(selectedNotes); + + var selectedChords = []; + this.enumerateSelectedChords(function(chord) { selectedChords.push(chord); }); + this.song.chords.removeList(selectedChords); + + // Remove overlapping parts from song. + for (var i = 0; i < selectedNotes.length; i++) + this.eraseNotesAt( + selectedNotes[i].startTick, + selectedNotes[i].endTick, + selectedNotes[i].midiPitch); + + for (var i = 0; i < selectedChords.length; i++) + this.eraseChordsAt( + selectedChords[i].startTick, + selectedChords[i].endTick); + + // Reinsert selected elements. + this.song.notes .insertList(selectedNotes); + this.song.chords.insertList(selectedChords); +} + + +Editor.prototype.eraseNotesAt = function(start, end, atMidiPitch = null) +{ + var overlappingNotes = []; + var slicedNotes = []; + + this.song.notes.enumerateOverlappingRange( + start, end, + function (note) + { + if (atMidiPitch != null && atMidiPitch != note.midiPitch) + return; + + overlappingNotes.push(note); + + var parts = sliceparts( + note.startTick, + note.endTick, + start, + end); + + for (var j = 0; j < parts.length; j++) + { + var newNote = note.clone(); + newNote.startTick = parts[j].start.clone(); + newNote.endTick = parts[j].end.clone(); + newNote.editorData = { selected: false }; + slicedNotes.push(newNote); + } + }); + + this.song.notes.removeList(overlappingNotes); + this.song.notes.insertList(slicedNotes); +} + + +Editor.prototype.eraseChordsAt = function(start, end) +{ + var overlappingChords = []; + var slicedChords = []; + + this.song.chords.enumerateOverlappingRange( + start, end, + function (chord) + { + overlappingChords.push(chord); + + var parts = sliceparts( + chord.startTick, + chord.endTick, + start, + end); + + for (var j = 0; j < parts.length; j++) + { + var newChord = chord.clone(); + newChord.startTick = parts[j].start.clone(); + newChord.endTick = parts[j].end.clone(); + newChord.editorData = { selected: false }; + slicedChords.push(newChord); + } + }); + + this.song.chords.removeList(overlappingChords); + this.song.chords.insertList(slicedChords); +} \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..bc4ca80 --- /dev/null +++ b/src/main.js @@ -0,0 +1,54 @@ +var g_Editor = null; +var g_Song = null; +var g_Synth = null; + +var songPlaying = false; + + +function main() +{ + g_Synth = new Synth(); + + var elemSvgEditor = document.getElementById("svgEditor"); + g_Editor = new Editor(elemSvgEditor, g_Synth); + + g_Song = new Song(); + g_Editor.setSong(g_Song); + g_Editor.refresh(); + + g_Editor.callbackTogglePlay = refreshButtonPlay; + + window.onresize = function() { g_Editor.refresh(); }; + document.getElementById("inputTempo").onkeydown = function(ev) { ev.stopPropagation(); }; + + refreshButtonPlay(false); +} + + +function refreshButtonPlay(isPlaying) +{ + var button = document.getElementById("buttonPlay"); + button.innerHTML = isPlaying ? "◼ Stop" : "► Play"; +} + + +function handleButtonPlay() +{ + g_Editor.togglePlay(); +} + + +function handleButtonRewind() +{ + g_Editor.rewind(); +} + + +function handleInputTempo() +{ + var input = document.getElementById("inputTempo"); + var tempo = parseInt(input.value); + + if (Theory.isValidBpm(tempo)) + g_Song.bpm = tempo; +} \ No newline at end of file diff --git a/src/song/chord.js b/src/song/chord.js new file mode 100644 index 0000000..61ddb9c --- /dev/null +++ b/src/song/chord.js @@ -0,0 +1,20 @@ +function SongChord(startTick, endTick, chordKindIndex, rootMidiPitch, embelishments, editorData = null) +{ + this.startTick = startTick; + this.endTick = endTick; + this.chordKindIndex = chordKindIndex; + this.rootMidiPitch = rootMidiPitch; + this.embelishments = embelishments; + this.editorData = editorData; +} + + +SongChord.prototype.clone = function() +{ + return new SongChord( + this.startTick.clone(), + this.endTick.clone(), + this.chordKindIndex, + this.rootMidiPitch, + this.embelishments); +} \ No newline at end of file diff --git a/src/song/key.js b/src/song/key.js new file mode 100644 index 0000000..42d55c0 --- /dev/null +++ b/src/song/key.js @@ -0,0 +1,22 @@ +function SongKeyChange(tick, scaleIndex, tonicMidiPitch) +{ + this.tick = tick; + this.scaleIndex = scaleIndex; + this.tonicMidiPitch = tonicMidiPitch; + this.editorData = null; +} + + +SongKeyChange.prototype.clone = function() +{ + return new SongKeyChange( + this.tick.clone(), + this.scaleIndex, + this.tonicMidiPitch); +} + + +SongKeyChange.prototype.getLabel = function() +{ + return Theory.getKeyLabel(this.scaleIndex, this.tonicMidiPitch); +} \ No newline at end of file diff --git a/src/song/meter.js b/src/song/meter.js new file mode 100644 index 0000000..0892593 --- /dev/null +++ b/src/song/meter.js @@ -0,0 +1,40 @@ +function SongMeterChange(tick, numerator, denominator) +{ + this.tick = tick; + this.numerator = numerator; + this.denominator = denominator; + this.editorData = null; +} + + +SongMeterChange.prototype.clone = function() +{ + return new SongMeterChange( + this.tick.clone(), + this.numerator, + this.denominator); +} + + +SongMeterChange.prototype.getMeasureLength = function() +{ + return new Rational( + 0, + this.numerator, + this.denominator); +} + + +SongMeterChange.prototype.getBeatLength = function() +{ + return new Rational( + 0, + 1, + this.denominator); +} + + +SongMeterChange.prototype.getLabel = function() +{ + return Theory.getMeterLabel(this.numerator, this.denominator); +} \ No newline at end of file diff --git a/src/song/note.js b/src/song/note.js new file mode 100644 index 0000000..d586748 --- /dev/null +++ b/src/song/note.js @@ -0,0 +1,14 @@ +function SongNote(startTick, endTick, trackIndex, midiPitch, editorData = null) +{ + this.startTick = startTick; + this.endTick = endTick; + this.trackIndex = trackIndex; + this.midiPitch = midiPitch; + this.editorData = editorData; +} + + +SongNote.prototype.clone = function() +{ + return new SongNote(this.startTick.clone(), this.endTick.clone(), this.trackIndex, this.midiPitch); +} \ No newline at end of file diff --git a/src/song/song.js b/src/song/song.js new file mode 100644 index 0000000..7e921eb --- /dev/null +++ b/src/song/song.js @@ -0,0 +1,73 @@ +function Song() +{ + this.length = new Rational(1); + + this.notes = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); + this.chords = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); + this.keyChanges = new ListByPoint(function(item) { return item.tick; }); + this.meterChanges = new ListByPoint(function(item) { return item.tick; }); + this.measures = new ListByPoint(function(item) { return item.tick; }); + + // TODO: Should be changeable + // throughout the music. + this.bpm = 120; + + this.sanitize(); +} + + +Song.prototype.sanitize = function() +{ + if (this.length.compare(new Rational(1)) <= 0) + this.length = new Rational(1); + + if (this.keyChanges.findPrevious(new Rational(0)) == null) + this.keyChanges.insert(new SongKeyChange(new Rational(0), null, 0)); + + if (this.meterChanges.findPrevious(new Rational(0)) == null) + this.meterChanges.insert(new SongMeterChange(new Rational(0), 4, 4)); +} + + +Song.prototype.feedSynth = function(synth, startTick) +{ + var that = this; + + // Register notes. + this.notes.enumerateAll(function (note) + { + if (note.endTick.compare(startTick) <= 0) + return; + + var offsetStart = note.startTick.clone().subtract(startTick); + var offsetEnd = note.endTick.clone().subtract(startTick); + + var timeStart = offsetStart.asFloat() * (1000 / that.bpm / 4); + var timeEnd = offsetEnd.asFloat() * (1000 / that.bpm / 4); + + synth.addNoteOn(timeStart, 0, note.midiPitch, 1); + synth.addNoteOff(timeEnd - 0.01, 0, note.midiPitch); + }); + + // Register chords. + this.chords.enumerateAll(function (chord) + { + if (chord.endTick.compare(startTick) <= 0) + return; + + var pitches = Theory.calculateChordPitches( + chord.chordKindIndex, chord.rootMidiPitch, chord.embelishments); + + for (var j = 0; j < pitches.length; j++) + { + var offsetStart = chord.startTick.clone().subtract(startTick); + var offsetEnd = chord.endTick.clone().subtract(startTick); + + var timeStart = offsetStart.asFloat() * (1000 / that.bpm / 4); + var timeEnd = offsetEnd.asFloat() * (1000 / that.bpm / 4); + + synth.addNoteOn(timeStart, 1, pitches[j], 1); + synth.addNoteOff(timeEnd - 0.01, 1, pitches[j], 1); + } + }); +} \ No newline at end of file diff --git a/src/synth/instrument_piano.js b/src/synth/instrument_piano.js new file mode 100644 index 0000000..16d033a --- /dev/null +++ b/src/synth/instrument_piano.js @@ -0,0 +1,38 @@ +var InstrumentPiano = {}; + + +InstrumentPiano.generate = function(time, timeReleased, midiPitch) +{ + var envelope = 1; + + if (time < 0.1) + envelope = Math.max(1, 1.5 - time / 0.1 * 0.5); + else + envelope = Math.max(0, 1 / (0.9 + time) / (0.9 + time)); + + if (timeReleased > 0) + envelope *= Math.max(0, 1 - timeReleased / 0.1); + + + if (envelope == 0) + return null; + + // Frequencies from + // physics.stackexchange.com/questions/268568 + + // TODO: Does not yet sound like a real piano... + return [ + [440/440, envelope * 1/1], + [880/440, envelope * 1/4], + [1330/440, envelope * 1/6], + [1780/440, envelope * 1/7], + [2230/440, envelope * 1/11], + [2680/440, envelope * 1/12], + [3140/440, envelope * 1/13], + [3610/440, envelope * 1/14], + [4090/440, envelope * 1/15], + [4570/440, envelope * 1/16], + [5060/440, envelope * 1/17], + [5570/440, envelope * 1/18] + ]; +} \ No newline at end of file diff --git a/src/synth/instrument_square.js b/src/synth/instrument_square.js new file mode 100644 index 0000000..500f460 --- /dev/null +++ b/src/synth/instrument_square.js @@ -0,0 +1,32 @@ +var InstrumentSquareWave = {}; + + +InstrumentSquareWave.generate = function(time, timeReleased, midiPitch) +{ + var envelope = 1; + + if (time < 0.1) + envelope = Math.max(1, 1.75 - time / 0.2); + else + envelope = Math.max(0.5, 1 - time / 0.5); + + if (timeReleased > 0) + envelope *= Math.max(0, 1 - timeReleased / 0.1); + + + if (envelope == 0) + return null; + + return [ + [1, envelope * 1/1], + [3, envelope * 1/3], + [5, envelope * 1/5], + [7, envelope * 1/7], + [9, envelope * 1/9], + [11, envelope * 1/11], + [13, envelope * 1/13], + [15, envelope * 1/15], + [17, envelope * 1/17], + [19, envelope * 1/19] + ]; +} \ No newline at end of file diff --git a/src/synth/instrument_triangle.js b/src/synth/instrument_triangle.js new file mode 100644 index 0000000..0b38346 --- /dev/null +++ b/src/synth/instrument_triangle.js @@ -0,0 +1,32 @@ +var InstrumentTriangleWave = {}; + + +InstrumentTriangleWave.generate = function(time, timeReleased, midiPitch) +{ + var envelope = 1; + + if (time < 0.1) + envelope = Math.max(1, 1.75 - time / 0.2); + else + envelope = Math.max(0.5, 1 - time / 0.5); + + if (timeReleased > 0) + envelope *= Math.max(0, 1 - timeReleased / 0.1); + + + if (envelope == 0) + return null; + + return [ + [1, envelope * 1/1/1], + [3, envelope * 1/3/3], + [5, envelope * 1/5/5], + [7, envelope * 1/7/7], + [9, envelope * 1/9/9], + [11, envelope * 1/11/11], + [13, envelope * 1/13/13], + [15, envelope * 1/15/15], + [17, envelope * 1/17/17], + [19, envelope * 1/19/19] + ]; +} \ No newline at end of file diff --git a/src/synth/synth.js b/src/synth/synth.js new file mode 100644 index 0000000..98ce44d --- /dev/null +++ b/src/synth/synth.js @@ -0,0 +1,228 @@ +function Synth() +{ + this.audioCtx = new AudioContext(); + this.interval = null; + this.globalVolume = 0.1; + this.time = 0; + this.noteOnEvents = []; + this.noteOffEvents = []; + this.voices = []; + this.processCallback = null; + + this.instruments = [InstrumentPiano, InstrumentPiano]; +} + + +Synth.prototype.play = function(callback) +{ + if (this.interval != null) + clearInterval(this.interval); + + this.processCallback = callback; + + this.sortEvents(); + + var that = this; + this.interval = setInterval(function() { that.process(1 / 60); }, 1000 / 60); +} + + +Synth.prototype.stop = function() +{ + if (this.interval != null) + clearInterval(this.interval); + + this.interval = null; +} + + +Synth.prototype.clear = function() +{ + for (var i = this.voices.length - 1; i >= 0; i--) + this.voiceStop(i); + + this.voices = []; + this.noteOnEvents = []; + this.noteOffEvents = []; + + this.time = 0; +} + + +Synth.prototype.process = function(deltaTime) +{ + this.time += deltaTime; + + if (this.processCallback != null) + this.processCallback(this.time); + + // Process note events. + var noteOnProcessed = 0; + var noteOffProcessed = 0; + + while (true) + { + // Handle pending note on events up to the current time. + if (noteOnProcessed < this.noteOnEvents.length && + this.noteOnEvents[noteOnProcessed].time <= this.time) + { + var ev = this.noteOnEvents[noteOnProcessed]; + noteOnProcessed++; + + this.voiceStart(ev.instrumentIndex, ev.midiPitch, ev.volume); + } + + // Handle pending note off events up to the current time. + else if (noteOffProcessed < this.noteOffEvents.length && + this.noteOffEvents[noteOffProcessed].time <= this.time) + { + var ev = this.noteOffEvents[noteOffProcessed]; + noteOffProcessed++; + + for (var j = 0; j < this.voices.length; j++) + { + var voice = this.voices[j]; + if (voice.instrumentIndex == ev.instrumentIndex && + voice.midiPitch == ev.midiPitch) + { + this.voiceRelease(j); + } + } + } + + // Else, there are no more events up to the current time. + else + break; + } + + // Remove processed events. + this.noteOnEvents.splice(0, noteOnProcessed); + this.noteOffEvents.splice(0, noteOffProcessed); + + // Update audio output. + for (var i = this.voices.length - 1; i >= 0; i--) + { + var voice = this.voices[i]; + + voice.time += deltaTime; + if (voice.released) + voice.timeReleased += deltaTime; + + var frequencies = this.instruments[voice.instrumentIndex].generate( + voice.time, voice.timeReleased, voice.midiPitch); + + if (frequencies == null) + { + this.voiceStop(i); + this.voices.splice(i, 1); + } + else + { + for (var j = 0; j < frequencies.length; j++) + { + voice.oscillators[j].frequency.value = + Math.min(24000, frequencies[j][0] * voice.frequencyInHertz); + + voice.gainNodes[j].gain.value = frequencies[j][1] * voice.volume * this.globalVolume; + } + } + } +} + + +Synth.prototype.addNoteOn = function(time, instrumentIndex, midiPitch, volume) +{ + this.noteOnEvents.push({ + time: time + this.time, + instrumentIndex: instrumentIndex, + midiPitch: midiPitch, + volume: volume + }); +} + + +Synth.prototype.addNoteOff = function(time, instrumentIndex, midiPitch) +{ + this.noteOffEvents.push({ + time: time + this.time, + instrumentIndex: instrumentIndex, + midiPitch: midiPitch + }); +} + + +Synth.prototype.sortEvents = function() +{ + this.noteOnEvents.sort(function (a, b) + { return a.time - b.time; }); + + this.noteOffEvents.sort(function (a, b) + { return a.time - b.time; }); +} + + +Synth.prototype.voiceStart = function(instrumentIndex, midiPitch, volume) +{ + for (var i = this.voices.length - 1; i >= 0; i--) + { + var otherVoice = this.voices[i]; + if (otherVoice.instrumentIndex == instrumentIndex && + otherVoice.midiPitch == midiPitch) + { + this.voiceStop(i); + this.voices.splice(i, 1); + } + } + + var frequencyInHertz = Math.pow(2, (midiPitch - 69) / 12) * 440; + + var voice = { + instrumentIndex: instrumentIndex, + midiPitch: midiPitch, + frequencyInHertz: frequencyInHertz, + volume: volume, + time: 0, + timeReleased: 0, + released: false, + oscillators: [], + gainNodes: [] + }; + + var frequencies = this.instruments[instrumentIndex].generate(0, 0, midiPitch); + if (frequencies == null) + return; + + for (var i = 0; i < frequencies.length; i++) + { + var oscillator = this.audioCtx.createOscillator(); + oscillator.frequency.value = Math.min(24000, frequencies[i][0] * frequencyInHertz); + oscillator.type = "sine"; + + var gainNode = this.audioCtx.createGain(); + oscillator.connect(gainNode); + gainNode.connect(this.audioCtx.destination); + gainNode.gain.value = frequencies[i][1] * volume * this.globalVolume; + + oscillator.start(0); + + voice.oscillators.push(oscillator); + voice.gainNodes.push(gainNode); + } + + this.voices.push(voice); +} + + +Synth.prototype.voiceRelease = function(index) +{ + var voice = this.voices[index]; + voice.released = true; +} + + +Synth.prototype.voiceStop = function(index) +{ + var voice = this.voices[index]; + for (var i = 0; i < voice.oscillators.length; i++) + voice.oscillators[i].stop(0); +} \ No newline at end of file diff --git a/src/util/list_by_point.js b/src/util/list_by_point.js new file mode 100644 index 0000000..e34547f --- /dev/null +++ b/src/util/list_by_point.js @@ -0,0 +1,142 @@ +// TODO: Optimize with better data structures. +// +// Querying items contained in a given range +// should be fast. +// +// `getItemPointFunc` is a function that returns +// the point of the given item. +function ListByPoint(getItemPointFunc) +{ + this.items = []; + this.getItemPointFunc = getItemPointFunc; +} + + +ListByPoint.prototype.clear = function() +{ + this.items = []; +} + + +ListByPoint.prototype.insert = function(item) +{ + this.items.push(item); +} + + +ListByPoint.prototype.insertList = function(list) +{ + for (var i = 0; i < list.length; i++) + this.insert(list[i]); +} + + +ListByPoint.prototype.remove = function(item) +{ + var index = this.items.indexOf(item); + + if (index != -1) + this.items.splice(index, 1); +} + + +ListByPoint.prototype.removeList = function(list) +{ + for (var i = 0; i < list.length; i++) + this.remove(list[i]); +} + + +ListByPoint.prototype.getTotalRange = function() +{ + var start = new Rational(0); + var end = new Rational(0); + + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(item); + + if (itemPoint.compare(start) < 0) + start = itemPoint.clone(); + + if (itemPoint.compare(end) > 0) + end = itemPoint.clone(); + } + + return { start: start, end: end }; +} + + +ListByPoint.prototype.enumerateAll = function(callback) +{ + for (var i = 0; i < this.items.length; i++) + { + callback(this.items[i]); + } +} + + +ListByPoint.prototype.enumerateOverlappingPoint = function(point, callback) +{ + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(this.items[i]); + + if (itemPoint.compare(point) == 0) + callback(this.items[i]); + } +} + + +ListByPoint.prototype.enumerateOverlappingRange = function(rangeStart, rangeEnd, callback) +{ + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(this.items[i]); + + if (itemPoint.compare(rangeEnd) < 0 && itemPoint.compare(rangeStart) >= 0) + callback(this.items[i]); + } +} + + +ListByPoint.prototype.findPrevious = function(beforePoint) +{ + var nearestItem = null; + var nearestPoint = null; + + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(this.items[i]); + + if ((nearestPoint == null || itemPoint.compare(nearestPoint) > 0) && + itemPoint.compare(beforePoint) <= 0) + { + nearestItem = this.items[i]; + nearestPoint = itemPoint; + } + } + + return nearestItem; +} + + +ListByPoint.prototype.findNext = function(afterPoint) +{ + var nearestItem = null; + var nearestPoint = null; + + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(this.items[i]); + + if ((nearestPoint == null || itemPoint.compare(nearestPoint) < 0) && + itemPoint.compare(afterPoint) > 0) + { + nearestItem = this.items[i]; + nearestPoint = itemPoint; + } + } + + return nearestItem; +} \ No newline at end of file diff --git a/src/util/list_by_range.js b/src/util/list_by_range.js new file mode 100644 index 0000000..bffe501 --- /dev/null +++ b/src/util/list_by_range.js @@ -0,0 +1,143 @@ +// TODO: Optimize with better data structures. +// +// Querying items contained in a given range +// should be fast. +// +// `getItemRangeFunc` is a function that returns +// an object containing the `start` and `end` +// points of the given item. +function ListByRange(getItemRangeFunc) +{ + this.items = []; + this.getItemRangeFunc = getItemRangeFunc; +} + + +ListByRange.prototype.clear = function() +{ + this.items = []; +} + + +ListByRange.prototype.insert = function(item) +{ + this.items.push(item); +} + + +ListByRange.prototype.insertList = function(list) +{ + for (var i = 0; i < list.length; i++) + this.insert(list[i]); +} + + +ListByRange.prototype.remove = function(item) +{ + var index = this.items.indexOf(item); + + if (index != -1) + this.items.splice(index, 1); +} + + +ListByRange.prototype.removeList = function(list) +{ + for (var i = 0; i < list.length; i++) + this.remove(list[i]); +} + + +ListByRange.prototype.getTotalRange = function() +{ + var start = new Rational(0); + var end = new Rational(0); + + for (var i = 0; i < this.items.length; i++) + { + var itemRange = this.getItemRangeFunc(item); + + if (itemRange.start.compare(start) < 0) + start = itemRange.start.clone(); + + if (itemRange.end.compare(end) > 0) + end = itemRange.end.clone(); + } + + return { start: start, end: end }; +} + + +ListByRange.prototype.enumerateAll = function(callback) +{ + for (var i = 0; i < this.items.length; i++) + { + callback(this.items[i]); + } +} + + +ListByRange.prototype.enumerateOverlappingPoint = function(point, callback) +{ + for (var i = 0; i < this.items.length; i++) + { + var itemRange = this.getItemRangeFunc(this.items[i]); + + if (itemRange.start.compare(point) < 0 && itemRange.end.compare(point) > 0) + callback(this.items[i]); + } +} + + +ListByRange.prototype.enumerateOverlappingRange = function(rangeStart, rangeEnd, callback) +{ + for (var i = 0; i < this.items.length; i++) + { + var itemRange = this.getItemRangeFunc(this.items[i]); + + if (itemRange.start.compare(rangeEnd) < 0 && itemRange.end.compare(rangeStart) > 0) + callback(this.items[i]); + } +} + + +ListByRange.prototype.findPrevious = function(beforePoint) +{ + var nearestItem = null; + var nearestPoint = null; + + for (var i = 0; i < this.items.length; i++) + { + var itemRange = this.getItemRangeFunc(this.items[i]); + + if ((nearestPoint == null || itemRange.end.compare(nearestPoint) > 0) && + itemRange.end.compare(beforePoint) <= 0) + { + nearestItem = this.items[i]; + nearestPoint = itemRange.end; + } + } + + return nearestItem; +} + + +ListByRange.prototype.findNext = function(afterPoint) +{ + var nearestItem = null; + var nearestPoint = null; + + for (var i = 0; i < this.items.length; i++) + { + var itemRange = this.getItemRangeFunc(this.items[i]); + + if ((nearestPoint == null || itemRange.start.compare(nearestPoint) < 0) && + itemRange.start.compare(afterPoint) > 0) + { + nearestItem = this.items[i]; + nearestPoint = itemRange.start; + } + } + + return nearestItem; +} \ No newline at end of file diff --git a/src/util/math.js b/src/util/math.js new file mode 100644 index 0000000..0266caf --- /dev/null +++ b/src/util/math.js @@ -0,0 +1,41 @@ +function snap(x, step) +{ + return Math.round(x / step) * step; +} + + +function mod(x, m) +{ + return (x % m + m) % m; +} + + +function stretch(x, pivot, origin, delta) +{ + var dist = (origin - pivot); + var p = (x - pivot) / dist; + var move = (origin + delta - pivot) / dist; + + return Math.round(pivot + dist * (p * move)); +} + + +function sliceparts(start, end, sliceStart, sliceEnd) +{ + if (sliceStart.compare(start) <= 0) + { + if (sliceEnd.compare(end) < 0) + return [{ start: sliceEnd, end: end }]; + else + return []; + } + else + { + if (sliceEnd.compare(end) >= 0) + return [{ start: start, end: sliceStart }]; + else + return [ + { start: start, end: sliceStart }, + { start: sliceEnd, end: end }]; + } +} \ No newline at end of file diff --git a/src/util/rational.js b/src/util/rational.js new file mode 100644 index 0000000..c561ce2 --- /dev/null +++ b/src/util/rational.js @@ -0,0 +1,248 @@ +function Rational(integer = 0, numerator = 0, denominator = 1) +{ + this.integer = integer; + this.numerator = numerator; + this.denominator = denominator; + this.normalize(); +} + + +Rational.prototype.clone = function() +{ + return new Rational(this.integer, this.numerator, this.denominator); +} + + +Rational.fromFloat = function(value, step) +{ + var rational = new Rational(Math.floor(value)); + + while (rational.asFloat() < value) + rational.add(step); + + return rational; +} + + +Rational.prototype.toString = function() +{ + if (this.integer == 0 && this.numerator == 0) + return "0"; + + var string = ""; + if (this.integer != 0) + string += this.integer.toString(); + + if (this.numerator != 0) + { + if (this.integer != 0) + string += "+"; + + string += this.numerator.toString() + "/" + this.denominator.toString(); + } + + return string; +} + + +Rational.prototype.normalize = function() +{ + while (this.numerator < 0) + { + this.numerator += this.denominator; + this.integer -= 1; + } + + while (this.numerator >= this.denominator) + { + this.numerator -= this.denominator; + this.integer += 1; + } + + this.trySimplifyBy(2); + this.trySimplifyBy(3); + this.trySimplifyBy(5); + this.trySimplifyBy(7); + this.trySimplifyBy(11); + this.trySimplifyBy(13); +} + + +Rational.prototype.trySimplifyBy = function(divider) +{ + while ((this.numerator % divider) == 0 && (this.denominator % divider) == 0) + { + this.numerator /= divider; + this.denominator /= divider; + } +} + + +Rational.prototype.asFloat = function() +{ + return this.integer + this.numerator / this.denominator; +} + + +Rational.prototype.getAsNumerator = function(denominator) +{ + return (this.integer * denominator) + (this.numerator * (denominator / this.denominator)); +} + + +Rational.prototype.negate = function() +{ + this.integer = -this.integer - 1; + this.numerator = this.denominator - this.numerator; + + this.normalize(); + + return this; +} + + +Rational.prototype.add = function(other) +{ + this.addInteger(other.integer); + this.addFraction(other.numerator, other.denominator); + + return this; +} + + +Rational.prototype.subtract = function(other) +{ + var commonDenominator = other.denominator * this.denominator; + + this.numerator = this.getAsNumerator(commonDenominator) - other.getAsNumerator(commonDenominator); + this.denominator = commonDenominator; + this.integer = 0; + + this.normalize(); + + return this; +} + + +Rational.prototype.subtractFrom = function(other) +{ + var commonDenominator = other.denominator * this.denominator; + + this.numerator = other.getAsNumerator(commonDenominator) - this.getAsNumerator(commonDenominator); + this.denominator = commonDenominator; + this.integer = 0; + + this.normalize(); + + return this; +} + + +Rational.prototype.multiply = function(other) +{ + var numerator = this.integer * this.denominator + this.numerator; + var otherNumerator = other.integer * other.denominator + other.numerator; + + this.integer = 0; + this.numerator = numerator * otherNumerator; + this.denominator = this.denominator * other.denominator; + + this.normalize(); + + return this; +} + + +Rational.prototype.addInteger = function(value) +{ + this.integer += value; + + return this; +} + + +Rational.prototype.addFraction = function(numerator, denominator) +{ + if ((denominator % this.denominator) == 0) + { + var scale = denominator / this.denominator; + this.numerator *= scale; + this.denominator *= scale; + } + + if (denominator == this.denominator) + this.numerator += numerator; + + else + { + var commonDenominator = denominator * this.denominator; + + var scale1 = commonDenominator / this.denominator; + var scale2 = commonDenominator / denominator; + + this.numerator *= scale1; + this.numerator += scale2 * numerator; + + this.denominator = commonDenominator; + } + + this.normalize(); + + return this; +} + + +Rational.prototype.max = function(other) +{ + if (this.compare(other) < 0) + { + this.integer = other.integer; + this.numerator = other.numerator; + this.denominator = other.denominator; + } + + return this; +} + + +Rational.prototype.min = function(other) +{ + if (this.compare(other) > 0) + { + this.integer = other.integer; + this.numerator = other.numerator; + this.denominator = other.denominator; + } + + return this; +} + + +Rational.prototype.compare = function(other) +{ + if (this.integer != other.integer) + { + if (this.integer < other.integer) + return -1; + else + return 1; + } + + else + { + var commonDenominator = other.denominator * this.denominator; + + var scale1 = commonDenominator / this.denominator; + var scale2 = commonDenominator / other.denominator; + + var numerator1 = this.numerator * scale1; + var numerator2 = other.numerator * scale2; + + if (numerator1 < numerator2) + return -1; + else if (numerator1 > numerator2) + return 1; + else + return 0; + } +} \ No newline at end of file diff --git a/src/util/theory.js b/src/util/theory.js new file mode 100644 index 0000000..c3fd199 --- /dev/null +++ b/src/util/theory.js @@ -0,0 +1,327 @@ +var Theory = {}; + + +Theory.chordKinds = +[ + /* + `code` is what the compiler expects to parse. + `symbol` dictates roman numeral analysis representation as follows: + [isLowercase, complement, superscriptComplement] + */ + + { pitches: [0, 4, 7], code: "", symbol: [false, "", "" ], name: "Major" }, + { pitches: [0, 3, 7], code: "m", symbol: [true, "", "" ], name: "Minor" }, + { pitches: [0, 4, 8], code: "+", symbol: [false, "+", "" ], name: "Augmented" }, + { pitches: [0, 3, 6], code: "o", symbol: [true, "", "o"], name: "Diminished" }, + { pitches: [0, 2, 7], code: "sus2", symbol: [false, "sus2", "" ], name: "Suspended Second" }, + { pitches: [0, 5, 7], code: "sus4", symbol: [false, "sus4", "" ], name: "Suspended Fourth" }, + + { pitches: [0, 0, 7, 12], code: "5", symbol: [false, "", "5"], name: "Power" }, + + { pitches: [0, 4, 7, 9], code: "6", symbol: [false, "", "6"], name: "Major Sixth" }, + { pitches: [0, 3, 7, 9], code: "m6", symbol: [true, "", "6"], name: "Minor Sixth" }, + + { pitches: [0, 4, 7, 10], code: "7", symbol: [false, "", "7"], name: "Dominant Seventh" }, + { pitches: [0, 4, 7, 11], code: "maj7", symbol: [false, "", "M7"], name: "Major Seventh" }, + { pitches: [0, 3, 7, 10], code: "m7", symbol: [true, "", "7"], name: "Minor Seventh" }, + { pitches: [0, 3, 7, 11], code: "mmaj7", symbol: [true, "", "M7"], name: "Minor-Major Seventh" }, + { pitches: [0, 4, 8, 10], code: "+7", symbol: [false, "+", "7"], name: "Augmented Seventh" }, + { pitches: [0, 4, 8, 11], code: "+maj7", symbol: [false, "+", "M7"], name: "Augmented Major Seventh" }, + { pitches: [0, 3, 6, 9], code: "o7", symbol: [true, "", "o7"], name: "Diminished Seventh" }, + { pitches: [0, 3, 6, 10], code: "%7", symbol: [true, "", "ø7"], name: "Half-Diminished Seventh" }, + + { pitches: [0, 4, 7, 10, 14], code: "9", symbol: [false, "", "9"], name: "Dominant Ninth" }, + { pitches: [0, 4, 7, 11, 14], code: "maj9", symbol: [false, "", "M9"], name: "Major Ninth" }, + { pitches: [0, 3, 7, 10, 14], code: "m9", symbol: [true, "", "9"], name: "Minor Ninth" }, + { pitches: [0, 3, 7, 11, 14], code: "mmaj9", symbol: [true, "", "M9"], name: "Minor-Major Ninth" }, + { pitches: [0, 4, 8, 10, 14], code: "+9", symbol: [false, "+", "9"], name: "Augmented Ninth" }, + { pitches: [0, 4, 8, 11, 14], code: "+maj9", symbol: [false, "+", "M9"], name: "Augmented Major Ninth" }, + { pitches: [0, 3, 6, 9, 14], code: "o9", symbol: [true, "", "o9"], name: "Diminished Ninth" }, + { pitches: [0, 3, 6, 9, 13], code: "ob9", symbol: [true, "", "o♭9"], name: "Diminished Minor Ninth" }, + { pitches: [0, 3, 6, 10, 14], code: "%9", symbol: [true, "", "ø9"], name: "Half-Diminished Ninth" }, + { pitches: [0, 3, 6, 10, 13], code: "%b9", symbol: [true, "", "ø♭9"], name: "Half-Diminished Minor Ninth" } +]; + + +Theory.isNoteRelativeInsteadOfAbsolute = function(string) +{ + for (var i = 0; i < string.length; i++) + { + switch (string.charAt(i).toLowerCase()) + { + case "1": case "2": case "3": + case "4": case "5": case "6": + case "7": + return true; + } + } + + return false; +} + + +Theory.isChordRelativeInsteadOfAbsolute = function(string) +{ + for (var i = 0; i < string.length; i++) + { + switch (string.charAt(i).toLowerCase()) + { + case "i": + case "v": + return true; + } + } + + return false; +} + + +Theory.decodeAbsoluteNoteName = function(string) +{ + var note = 0; + switch (string.charAt(0).toLowerCase()) + { + case "c": note = 0; break; + case "d": note = 2; break; + case "e": note = 4; break; + case "f": note = 5; break; + case "g": note = 7; break; + case "a": note = 9; break; + case "b": note = 11; break; + default: return null; + } + + for (var i = 1; i < string.length; i++) + { + switch (string.charAt(i)) + { + case "#": note += 1; break; + case "b": note -= 1; break; + default: return null; + } + } + + return note; +} + + +Theory.decodeRelativeNoteName = function(string) +{ + var degree = 0; + var i = 0; + + loop: for ( ; i < string.length; i++) + { + switch (string.charAt(i)) + { + case "#": degree += 1; break; + case "b": degree -= 1; break; + default: break loop; + } + } + + if (i != string.length - 1) + return null; + + switch (string.charAt(i)) + { + case "1": degree += 0; break; + case "2": degree += 2; break; + case "3": degree += 4; break; + case "4": degree += 5; break; + case "5": degree += 7; break; + case "6": degree += 9; break; + case "7": degree += 11; break; + default: return null; + } + + return degree; +} + + +Theory.decodeAbsoluteChordName = function(string) +{ + return Theory.decodeAbsoluteNoteName(string); +} + + +Theory.decodeRelativeChordName = function(string) +{ + var degree = 0; + var i = 0; + + loop: for ( ; i < string.length; i++) + { + switch (string.charAt(i)) + { + case "#": degree += 1; break; + case "b": degree -= 1; break; + default: break loop; + } + } + + switch (string.slice(i).toLowerCase()) + { + case "i": degree += 0; break; + case "ii": degree += 2; break; + case "iii": degree += 4; break; + case "iv": degree += 5; break; + case "v": degree += 7; break; + case "vi": degree += 9; break; + case "vii": degree += 11; break; + default: return null; + } + + return degree; +} + + +Theory.decodeChordKindName = function(string) +{ + for (var i = 0; i < Theory.chordKinds.length; i++) + { + if (string == Theory.chordKinds[i].code) + return i; + } + + return null; +} + + +Theory.getTruncatedPitchFromPitch = function(pitch) +{ + while (pitch >= 12) + pitch -= 12; + + while (pitch < 0) + pitch += 12; + + return pitch; +} + + +Theory.midiPitchMin = 12 * 2; +Theory.midiPitchMax = 12 * 9 - 1; + + +Theory.isValidMidiPitch = function(pitch) +{ + return pitch >= Theory.midiPitchMin && pitch <= Theory.midiPitchMax; +} + + +Theory.isValidOctave = function(octave) +{ + return octave >= 2 && octave < 9; +} + + +Theory.isValidBpm = function(bpm) +{ + return bpm >= 1 && bpm <= 999; +} + + +Theory.isValidMeterNumerator = function(numerator) +{ + return numerator >= 1 && numerator <= 256; +} + + +Theory.isValidMeterDenominator = function(denominator) +{ + return ( + denominator == 1 || denominator == 2 || denominator == 4 || + denominator == 8 || denominator == 16 || denominator == 32 || + denominator == 64 || denominator == 128); +} + + +Theory.getMeterLabel = function(numerator, denominator) +{ + return "" + numerator + " / " + denominator; +} + + +Theory.getKeyLabel = function(scale, tonicMidiPitch) +{ + // TODO: Use the representation set by the user (i.e., C# versus Db). + var labels = ["C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"]; + return labels[tonicMidiPitch % 12]; +} + + +Theory.getChordRootLabel = function(scale, rootMidiPitch) +{ + // TODO: Use the representation set by the user (i.e., #IV versus bV). + var labels = ["I", "♭II", "II", "♭III", "III", "IV", "♭V", "V", "♭VI", "VI", "♭VII", "VII"]; + return labels[rootMidiPitch % 12]; +} + + +Theory.calculateChordPitches = function(chordKindIndex, rootMidiPitch, embelishments) +{ + var pitches = []; + + var octave = 12 * 4; + if (rootMidiPitch >= 6) + octave = 12 * 3; + + for (var i = 0; i < Theory.chordKinds[chordKindIndex].pitches.length; i++) + { + pitches.push(octave + rootMidiPitch + Theory.chordKinds[chordKindIndex].pitches[i]); + } + + return pitches; +} + + +Theory.getChordBassPattern = function(meter) +{ + // [ [ start beat, end beat, volume ], ... ] + switch (meter.numerator) + { + case 3: return [ [ 0, 1.5, 1 ], [ 1.5, 2, 0.7 ] ]; + case 4: return [ [ 0, 1.5, 1 ], [ 1.5, 2, 0.7 ], [ 2, 3.5, 1 ], [ 3.5, 4, 0.7 ] ]; + default: return [ ]; + } +} + + +Theory.getChordStackPattern = function(meter) +{ + // [ [ start beat, end beat, volume ], ... ] + switch (meter.numerator) + { + case 3: return [ [ 0, 1, 1 ], [ 1, 2, 0.7 ], [ 2, 3, 0.7 ] ]; + case 4: return [ [ 0, 0.9, 1 ], [ 1, 1.9, 0.5 ], [ 2, 2.9, 0.7 ], [ 3, 3.9, 0.5 ] ]; + default: return [ ]; + } +} + + +Theory.playSampleNote = function(synth, midiPitch) +{ + synth.clear(); + synth.stop(); + synth.addNoteOn(0, 0, midiPitch, 1); + synth.addNoteOff(0.1, 0, midiPitch); + synth.play(); +} + + +Theory.playSampleChord = function(synth, chordKindIndex, rootMidiPitch, embelishments) +{ + synth.clear(); + synth.stop(); + + var pitches = Theory.calculateChordPitches(chordKindIndex, rootMidiPitch, embelishments); + + for (var j = 0; j < pitches.length; j++) + { + synth.addNoteOn(0, 1, pitches[j], 1); + synth.addNoteOff(0.1, 1, pitches[j], 1); + } + + synth.play(); +} \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..5549250 --- /dev/null +++ b/style.css @@ -0,0 +1,349 @@ +html +{ + height: 100%; + min-height: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} + +body +{ + height: 100%; + min-height: 100%; + margin: 0; +} + +#divToolbox +{ + width: 100%; + height: 100px; + padding-top: 5px; + overflow: hidden; + background-color: #ccc; + text-align: center; +} + +#divEditor +{ + width: 100%; + height: calc(100% - 100px); + overflow-x: hidden; + overflow-y: scroll; +} + +#svgEditor +{ + width: 100%; +} + +.toolboxLabel +{ + margin-top: 5px; + margin-bottom: 5px; + font-family: Verdana, sans-serif; + font-size: 12px; +} + +.toolboxButton +{ + padding: 10px; + background-color: #fff; + border: 0; + border-top: 2px solid #fff; + border-bottom: 2px solid black; + border-radius: 10px; + box-shadow: 5px; + outline: none; + font-family: Verdana, sans-serif; + font-size: 12px; +} + +.toolboxButton:hover +{ + cursor: pointer; +} + +.toolboxButton:active +{ + cursor: pointer; + background-color: #ddd; + border: 0; + border-top: 2px solid black; + border-bottom: 2px solid #ddd; +} + +.toolboxButtonPlay +{ + font-size: 24px; + width: 110px; + height: 60px; +} + +.toolboxInput +{ + margin-top: 5px; + margin-bottom: 5px; + border: 0; + border-radius: 10px; + outline: none; + font-family: Verdana, sans-serif; + font-size: 12px; + text-align: center; + width: 60px; + height: 20px; +} + +.viewerBlockBackground +{ + stroke-width: 0px; + fill: #eee; +} + +.viewerBlockSelection +{ + stroke-width: 0px; + fill: rgba(0, 0, 255, 0.25); +} + +.viewerBlockFrame +{ + stroke: #666; + stroke-width: 2px; + fill: rgba(0, 0, 0, 0); +} + +.viewerBeat +{ + stroke: #fff; + stroke-width: 2px; +} + +.viewerDegree0 +{ + stroke-width: 0px; + fill: #f00; +} + +.viewerDegree0Selected +{ + stroke-width: 2px; + stroke: #f00; + fill: #fcc; +} + +.viewerDegree1 +{ + stroke-width: 0px; + fill: #f40; +} + +.viewerDegree1Selected +{ + stroke-width: 2px; + stroke: #f40; + fill: #fed; +} + +.viewerDegree2 +{ + stroke-width: 0px; + fill: #f80; +} + +.viewerDegree2Selected +{ + stroke-width: 2px; + stroke: #f80; + fill: #fed; +} + +.viewerDegree3 +{ + stroke-width: 0px; + fill: #fa0; +} + +.viewerDegree3Selected +{ + stroke-width: 2px; + stroke: #fa0; + fill: #fed; +} + +.viewerDegree4 +{ + stroke-width: 0px; + fill: #fd0; +} + +.viewerDegree4Selected +{ + stroke-width: 2px; + stroke: #fd0; + fill: #fed; +} + +.viewerDegree5 +{ + stroke-width: 0px; + fill: #0d0; +} + +.viewerDegree5Selected +{ + stroke-width: 2px; + stroke: #0d0; + fill: #dfd; +} + +.viewerDegree6 +{ + stroke-width: 0px; + fill: #068; +} + +.viewerDegree6Selected +{ + stroke-width: 2px; + stroke: #068; + fill: #def; +} + +.viewerDegree7 +{ + stroke-width: 0px; + fill: #00f; +} + +.viewerDegree7Selected +{ + stroke-width: 2px; + stroke: #00f; + fill: #ddf; +} + +.viewerDegree8 +{ + stroke-width: 0px; + fill: #40f; +} + +.viewerDegree8Selected +{ + stroke-width: 2px; + stroke: #40f; + fill: #edf; +} + +.viewerDegree9 +{ + stroke-width: 0px; + fill: #80f; +} + +.viewerDegree9Selected +{ + stroke-width: 2px; + stroke: #80f; + fill: #edf; +} + +.viewerDegree10 +{ + stroke-width: 0px; + fill: #a0f; +} + +.viewerDegree10Selected +{ + stroke-width: 2px; + stroke: #a0f; + fill: #edf; +} + +.viewerDegree11 +{ + stroke-width: 0px; + fill: #f0f; +} + +.viewerDegree11Selected +{ + stroke-width: 2px; + stroke: #f0f; + fill: #fdf; +} + +.viewerChordBackground +{ + stroke-width: 0px; + fill: white; +} + +.viewerChordLabel +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 20px; + text-anchor: middle; + alignment-baseline: central; +} + +.viewerChordLabelSuperscript +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 14px; + text-anchor: middle; + alignment-baseline: central; + baseline-shift: super; +} + +.viewerMeterLine +{ + stroke: #0af; + stroke-width: 2px; +} + +.viewerMeterLabel +{ + fill: #0af; + font-family: Verdana, sans-serif; + font-size: 12px; + text-anchor: left; + alignment-baseline: middle; +} + +.viewerKeyLine +{ + stroke: #f04; + stroke-width: 2px; +} + +.viewerKeyLabel +{ + fill: #f04; + font-family: Verdana, sans-serif; + font-size: 12px; + text-anchor: left; + alignment-baseline: middle; +} + +.viewerCursor +{ + stroke: blue; + stroke-width: 2px; +} + +.viewerCursorGhost +{ + stroke: rgba(0, 0, 255, 0.25); + stroke-width: 2px; +} + +.viewerCursorPlayback +{ + stroke: red; + stroke-width: 2px; +} \ No newline at end of file From 78bb04f9862cce66a12e7c2baba9dbca66b69610 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Sat, 25 Mar 2017 01:15:02 -0300 Subject: [PATCH 02/44] add load and save features --- index.html | 22 ++++- src/main.js | 109 +++++++++++++++++++++++ src/song/key.js | 4 +- src/song/meter.js | 4 +- src/song/song.js | 183 ++++++++++++++++++++++++++++++++++++-- src/util/list_by_point.js | 15 +++- src/util/list_by_range.js | 15 +++- src/util/rational.js | 12 +++ style.css | 4 +- 9 files changed, 353 insertions(+), 15 deletions(-) diff --git a/index.html b/index.html index cdcefa3..94a745a 100644 --- a/index.html +++ b/index.html @@ -18,7 +18,7 @@
- +
+ + + +
@@ -27,6 +27,24 @@ Tempo: + + Local +
+ + + +
+ + Dropbox +
+ + + +
@@ -55,5 +73,7 @@ + + diff --git a/src/main.js b/src/main.js index bc4ca80..70d1716 100644 --- a/src/main.js +++ b/src/main.js @@ -51,4 +51,113 @@ function handleInputTempo() if (Theory.isValidBpm(tempo)) g_Song.bpm = tempo; +} + + +function handleButtonLoadLocal() +{ + var data = window.prompt("Paste a saved song data:", ""); + if (data == null) + return; + + try + { + g_Song.load(data); + } + catch (err) + { + window.alert("Error loading song data."); + g_Song.clear(); + g_Song.sanitize(); + } + + document.getElementById("inputTempo").value = g_Song.bpm.toString(); + g_Editor.cursorSetTickBoth(new Rational(0)); + g_Editor.refresh(); +} + + +function handleButtonSaveLocal() +{ + var data = g_Song.save(); + window.prompt("Copy and save this data to a file:", data); +} + + +function handleButtonLoadDropbox() +{ + Dropbox.choose({ + linkType: "direct", + multiselect: false, + success: function(files) + { + var xhr = new XMLHttpRequest(); + xhr.open("get", files[0].link, true); + xhr.responseType = "text"; + xhr.onload = function() + { + if (xhr.status == 200) + { + try + { + g_Song.load(xhr.response); + } + catch (err) + { + window.alert("Error loading song data."); + g_Song.clear(); + g_Song.sanitize(); + } + } + else + { + console.log(xhr); + window.alert("Error loading Dropbox file."); + g_Song.clear(); + g_Song.sanitize(); + } + + document.getElementById("inputTempo").value = g_Song.bpm.toString(); + g_Editor.cursorSetTickBoth(new Rational(0)); + g_Editor.refresh(); + }; + xhr.send(); + } + }); +} + + +// Still not working... +function handleButtonSaveDropbox() +{ + var songData = g_Song.save(); + var data = "data:," + encodeURIComponent(songData); + + Dropbox.save( + data, + "song.txt", + { + success: function() { window.alert("Successfully saved file to Dropbox."); }, + error: function(msg) { window.alert("Error saving file to Dropbox.\n\nError message: " + msg); } + }); +} + + +// Still not working... +function handleButtonSaveAsDropbox() +{ + var filename = window.prompt("Save under what filename?", "song.txt"); + if (filename == null) + return; + + var songData = g_Song.save(); + var data = "data:," + encodeURIComponent(songData); + + Dropbox.save( + data, + filename, + { + success: function() { window.alert("Successfully saved file to Dropbox."); }, + error: function(msg) { window.alert("Error saving file to Dropbox.\n\nError message: " + msg); } + }); } \ No newline at end of file diff --git a/src/song/key.js b/src/song/key.js index 42d55c0..dc55bd3 100644 --- a/src/song/key.js +++ b/src/song/key.js @@ -1,9 +1,9 @@ -function SongKeyChange(tick, scaleIndex, tonicMidiPitch) +function SongKeyChange(tick, scaleIndex, tonicMidiPitch, editorData = null) { this.tick = tick; this.scaleIndex = scaleIndex; this.tonicMidiPitch = tonicMidiPitch; - this.editorData = null; + this.editorData = editorData; } diff --git a/src/song/meter.js b/src/song/meter.js index 0892593..a50a7ee 100644 --- a/src/song/meter.js +++ b/src/song/meter.js @@ -1,9 +1,9 @@ -function SongMeterChange(tick, numerator, denominator) +function SongMeterChange(tick, numerator, denominator, editorData = null) { this.tick = tick; this.numerator = numerator; this.denominator = denominator; - this.editorData = null; + this.editorData = editorData; } diff --git a/src/song/song.js b/src/song/song.js index 7e921eb..9388900 100644 --- a/src/song/song.js +++ b/src/song/song.js @@ -2,11 +2,11 @@ function Song() { this.length = new Rational(1); - this.notes = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); - this.chords = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); - this.keyChanges = new ListByPoint(function(item) { return item.tick; }); - this.meterChanges = new ListByPoint(function(item) { return item.tick; }); - this.measures = new ListByPoint(function(item) { return item.tick; }); + this.notes = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); + this.chords = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); + this.keyChanges = new ListByPoint(function(item) { return item.tick; }); + this.meterChanges = new ListByPoint(function(item) { return item.tick; }); + this.forcedMeasures = new ListByPoint(function(item) { return item.tick; }); // TODO: Should be changeable // throughout the music. @@ -16,13 +16,36 @@ function Song() } +Song.prototype.clear = function() +{ + this.length = new Rational(1); + this.notes.clear(); + this.chords.clear(); + this.keyChanges.clear(); + this.meterChanges.clear(); + this.forcedMeasures.clear(); + this.bpm = 120; +} + + +Song.prototype.setLengthAuto = function() +{ + this.length = new Rational(1); + this.length.max(this.notes.getTotalRange().end); + this.length.max(this.chords.getTotalRange().end); + this.length.max(this.keyChanges.getTotalRange().end); + this.length.max(this.meterChanges.getTotalRange().end); + this.length.max(this.forcedMeasures.getTotalRange().end); +} + + Song.prototype.sanitize = function() { if (this.length.compare(new Rational(1)) <= 0) this.length = new Rational(1); if (this.keyChanges.findPrevious(new Rational(0)) == null) - this.keyChanges.insert(new SongKeyChange(new Rational(0), null, 0)); + this.keyChanges.insert(new SongKeyChange(new Rational(0), 0, 0)); if (this.meterChanges.findPrevious(new Rational(0)) == null) this.meterChanges.insert(new SongMeterChange(new Rational(0), 4, 4)); @@ -70,4 +93,152 @@ Song.prototype.feedSynth = function(synth, startTick) synth.addNoteOff(timeEnd - 0.01, 1, pitches[j], 1); } }); +} + +// Returns a JSON string containing the song data. +Song.prototype.save = function() +{ + this.notes.sort(); + this.chords.sort(); + this.keyChanges.sort(); + this.meterChanges.sort(); + this.forcedMeasures.sort(); + + this.setLengthAuto(); + + var json = "{\n"; + json += " \"version\": 0,\n"; + json += " \"length\": " + this.length.toString() + ",\n"; + json += " \"bpm\": " + this.bpm + ",\n"; + + json += " \"notes\": [\n"; + + for (var i = 0; i < this.notes.items.length; i++) + { + var note = this.notes.items[i]; + + json += " "; + json += "[ " + note.startTick.toString() + ", "; + json += note.endTick.toString() + ", "; + json += note.trackIndex.toString() + ", "; + json += note.midiPitch.toString() + " ]"; + + if (i < this.notes.items.length - 1) + json += ","; + + json += "\n"; + } + + json += " ],\n"; + json += " \"chords\": [\n"; + + for (var i = 0; i < this.chords.items.length; i++) + { + var chord = this.chords.items[i]; + + json += " "; + json += "[ " + chord.startTick.toString() + ", "; + json += chord.endTick.toString() + ", "; + json += chord.chordKindIndex.toString() + ", "; + json += chord.rootMidiPitch.toString() + ", "; + json += "[] ]";//chord.embelishments.toString() + " ]"; + + if (i < this.chords.items.length - 1) + json += ","; + + json += "\n"; + } + + json += " ],\n"; + json += " \"keyChanges\": [\n"; + + for (var i = 0; i < this.keyChanges.items.length; i++) + { + var keyCh = this.keyChanges.items[i]; + + json += " "; + json += "[ " + keyCh.tick.toString() + ", "; + json += keyCh.scaleIndex.toString() + ", "; + json += keyCh.tonicMidiPitch.toString() + " ]"; + + if (i < this.keyChanges.items.length - 1) + json += ","; + + json += "\n"; + } + + json += " ],\n"; + json += " \"meterChanges\": [\n"; + + for (var i = 0; i < this.meterChanges.items.length; i++) + { + var meterCh = this.meterChanges.items[i]; + + json += " "; + json += "[ " + meterCh.tick.toString() + ", "; + json += meterCh.numerator.toString() + ", "; + json += meterCh.denominator.toString() + " ]"; + + if (i < this.meterChanges.items.length - 1) + json += ","; + + json += "\n"; + } + + json += " ]\n}"; + + return json; +} + + +// Loads the song data contained in the given string. +// Will throw an exception on error. +Song.prototype.load = function(jsonStr) +{ + this.clear(); + + var song = JSON.parse(jsonStr); + this.bpm = song.bpm; + + for (var i = 0; i < song.notes.length; i++) + { + this.notes.insert(new SongNote( + Rational.fromArray(song.notes[i][0]), + Rational.fromArray(song.notes[i][1]), + song.notes[i][2], + song.notes[i][3], + { selected: false })); + } + + for (var i = 0; i < song.chords.length; i++) + { + this.chords.insert(new SongChord( + Rational.fromArray(song.chords[i][0]), + Rational.fromArray(song.chords[i][1]), + song.chords[i][2], + song.chords[i][3], + [], + { selected: false })); + } + + for (var i = 0; i < song.keyChanges.length; i++) + { + this.keyChanges.insert(new SongKeyChange( + Rational.fromArray(song.keyChanges[i][0]), + song.keyChanges[i][1], + song.keyChanges[i][2], + { selected: false })); + } + + for (var i = 0; i < song.meterChanges.length; i++) + { + this.meterChanges.insert(new SongMeterChange( + Rational.fromArray(song.meterChanges[i][0]), + song.meterChanges[i][1], + song.meterChanges[i][2], + { selected: false })); + } + + this.setLengthAuto(); + this.sanitize(); } \ No newline at end of file diff --git a/src/util/list_by_point.js b/src/util/list_by_point.js index e34547f..92480b9 100644 --- a/src/util/list_by_point.js +++ b/src/util/list_by_point.js @@ -18,6 +18,19 @@ ListByPoint.prototype.clear = function() } +ListByPoint.prototype.sort = function() +{ + var that = this; + + this.items.sort(function (a, b) + { + var aRange = that.getItemPointFunc(a); + var bRange = that.getItemPointFunc(b); + return aRange.compare(bRange); + }); +} + + ListByPoint.prototype.insert = function(item) { this.items.push(item); @@ -54,7 +67,7 @@ ListByPoint.prototype.getTotalRange = function() for (var i = 0; i < this.items.length; i++) { - var itemPoint = this.getItemPointFunc(item); + var itemPoint = this.getItemPointFunc(this.items[i]); if (itemPoint.compare(start) < 0) start = itemPoint.clone(); diff --git a/src/util/list_by_range.js b/src/util/list_by_range.js index bffe501..1eb8806 100644 --- a/src/util/list_by_range.js +++ b/src/util/list_by_range.js @@ -19,6 +19,19 @@ ListByRange.prototype.clear = function() } +ListByRange.prototype.sort = function() +{ + var that = this; + + this.items.sort(function (a, b) + { + var aRange = that.getItemRangeFunc(a); + var bRange = that.getItemRangeFunc(b); + return aRange.start.compare(bRange.start); + }); +} + + ListByRange.prototype.insert = function(item) { this.items.push(item); @@ -55,7 +68,7 @@ ListByRange.prototype.getTotalRange = function() for (var i = 0; i < this.items.length; i++) { - var itemRange = this.getItemRangeFunc(item); + var itemRange = this.getItemRangeFunc(this.items[i]); if (itemRange.start.compare(start) < 0) start = itemRange.start.clone(); diff --git a/src/util/rational.js b/src/util/rational.js index c561ce2..e4613d7 100644 --- a/src/util/rational.js +++ b/src/util/rational.js @@ -24,7 +24,19 @@ Rational.fromFloat = function(value, step) } +Rational.fromArray = function(arr) +{ + return new Rational(arr[0], arr[1], arr[2]); +} + + Rational.prototype.toString = function() +{ + return "[" + this.integer + ", " + this.numerator + ", " + this.denominator + "]"; +} + + +Rational.prototype.toUserString = function() { if (this.integer == 0 && this.numerator == 0) return "0"; diff --git a/style.css b/style.css index 5549250..2a212c4 100644 --- a/style.css +++ b/style.css @@ -17,7 +17,7 @@ body #divToolbox { width: 100%; - height: 100px; + height: 130px; padding-top: 5px; overflow: hidden; background-color: #ccc; @@ -27,7 +27,7 @@ body #divEditor { width: 100%; - height: calc(100% - 100px); + height: calc(100% - 130px); overflow-x: hidden; overflow-y: scroll; } From a6e48d21d20d657eab5706a858d705fa427e5968 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Sat, 25 Mar 2017 23:22:17 -0300 Subject: [PATCH 03/44] add key and meter change support --- index.html | 34 +++- src/editor/editor.js | 204 ++++++++++++++++++----- src/editor/editor_interaction.js | 269 ++++++++++++++++++++++++++++--- src/main.js | 66 +++++++- src/song/song.js | 24 ++- src/util/list_by_point.js | 23 ++- src/util/theory.js | 199 +++++------------------ style.css | 112 ++++++++----- 8 files changed, 640 insertions(+), 291 deletions(-) diff --git a/index.html b/index.html index 94a745a..138c95d 100644 --- a/index.html +++ b/index.html @@ -22,29 +22,47 @@ - +
Tempo: - - + Local
- - + +
Dropbox
- - - + + + + + + + + + + +
+ + +

+ + + / + +
+ + + diff --git a/src/editor/editor.js b/src/editor/editor.js index 9da7ca5..4cc9e30 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -30,7 +30,7 @@ function Editor(svg, synth) this.defaultNoteMidiPitchMin = 60; this.defaultNoteMidiPitchMax = 71; - this.margin = 10; + this.margin = 20; this.marginBetweenRows = 10; this.wholeTickWidth = 100; this.noteHeight = 5; @@ -38,6 +38,7 @@ function Editor(svg, synth) this.chordHeight = 50; this.chordSideMargin = 0.5; this.chordOrnamentHeight = 5; + this.handleSize = 8; this.eventInit(); @@ -49,6 +50,37 @@ function Editor(svg, synth) Editor.prototype.setSong = function(song) { this.song = song; + + this.song.notes.enumerateAll(function (item) + { + if (item.editorData == null) + item.editorData = { selected: false }; + }); + + this.song.chords.enumerateAll(function (item) + { + if (item.editorData == null) + item.editorData = { selected: false }; + }); + + this.song.keyChanges.enumerateAll(function (item) + { + if (item.editorData == null) + item.editorData = { selected: false }; + }); + + this.song.meterChanges.enumerateAll(function (item) + { + if (item.editorData == null) + item.editorData = { selected: false }; + }); + + this.song.forcedMeasures.enumerateAll(function (item) + { + if (item.editorData == null) + item.editorData = { selected: false }; + }); + this.refresh(); } @@ -123,6 +155,28 @@ Editor.prototype.rewind = function() } +Editor.prototype.insertKeyChange = function(scaleIndex, tonicMidiPitch) +{ + this.selectNone(); + this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); + this.eraseKeyChangesAt(this.cursorTick1, this.cursorTick1); + this.song.keyChanges.insert( + new SongKeyChange(this.cursorTick1.clone(), scaleIndex, tonicMidiPitch, { selected: true })); + this.refresh(); +} + + +Editor.prototype.insertMeterChange = function(numerator, denominator) +{ + this.selectNone(); + this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); + this.eraseMeterChangesAt(this.cursorTick1, this.cursorTick1); + this.song.meterChanges.insert( + new SongMeterChange(this.cursorTick1.clone(), numerator, denominator, { selected: true })); + this.refresh(); +} + + Editor.prototype.updateSvgCursor = function(node, visible, tick, track1, track2) { if (!visible) @@ -162,7 +216,7 @@ Editor.prototype.updateSvgCursor = function(node, visible, tick, track1, track2) } -Editor.prototype.getBlockAt = function(x, y) +Editor.prototype.getBlockIndexAt = function(x, y) { // TODO: Optimize block search. for (var i = 0; i < this.blocks.length; i++) @@ -176,7 +230,7 @@ Editor.prototype.getBlockAt = function(x, y) if (x < block.x + block.width && y < block.y + block.height) { - return block; + return i; } } @@ -184,6 +238,16 @@ Editor.prototype.getBlockAt = function(x, y) } +Editor.prototype.getBlockAt = function(x, y) +{ + var blockIndex = this.getBlockIndexAt(x, y); + if (blockIndex != null) + return this.blocks[blockIndex]; + + return null; +} + + Editor.prototype.getBlockAtTick = function(tick) { // TODO: Optimize block search. @@ -199,9 +263,8 @@ Editor.prototype.getBlockAtTick = function(tick) } -Editor.prototype.getElementAt = function(x, y) +Editor.prototype.getElementInBlockAt = function(block, x, y) { - var block = this.getBlockAt(x, y); if (block == null) return null; @@ -219,6 +282,23 @@ Editor.prototype.getElementAt = function(x, y) } +Editor.prototype.getElementAt = function(x, y) +{ + var blockIndex = this.getBlockIndexAt(x, y); + if (blockIndex == null) + return null; + + var elem = this.getElementInBlockAt(this.blocks[blockIndex], x, y); + if (elem != null) + return elem; + + if (blockIndex + 1 < this.blocks.length) + return this.getElementInBlockAt(this.blocks[blockIndex + 1], x, y); + + return null; +} + + Editor.prototype.getTickOffset = function(x, snap) { var offset = new Rational(0); @@ -264,9 +344,9 @@ Editor.prototype.refresh = function() this.svg.style.height = y + this.margin; // Render cursors. - this.svgCursor1 = this.addSvgNode("viewerCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); - this.svgCursor2 = this.addSvgNode("viewerCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); - this.svgCursorPlayback = this.addSvgNode("viewerCursorPlayback", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + this.svgCursor1 = this.addSvgNode("editorCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + this.svgCursor2 = this.addSvgNode("editorCursor", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); + this.svgCursorPlayback = this.addSvgNode("editorCursorPlayback", "line", { x1: 0, y1: 0, x2: 0, y2: 0 }); if (this.cursorVisible) { @@ -285,11 +365,19 @@ Editor.prototype.refreshRow = function(rowTickStart, rowYStart) var currentBlockStart = rowTickStart.clone(); var currentKeyChange = this.song.keyChanges.findPrevious(rowTickStart); var currentMeterChange = this.song.meterChanges.findPrevious(rowTickStart); + var currentMeasureStart = currentMeterChange.tick.clone(); var x = this.margin; while (true) { - var nextBlockEnd = currentBlockStart.clone().add(currentMeterChange.getMeasureLength()); + var nextBlockEnd = currentMeasureStart.clone(); + while (true) + { + if (nextBlockEnd.compare(currentBlockStart) > 0) + break; + + nextBlockEnd.add(currentMeterChange.getMeasureLength()); + } var nextKeyChange = this.song.keyChanges.findNext(currentBlockStart); var nextMeterChange = this.song.meterChanges.findNext(currentBlockStart); @@ -330,7 +418,10 @@ Editor.prototype.refreshRow = function(rowTickStart, rowYStart) currentKeyChange = nextKeyChange; if (nextMeterChange != null && nextMeterChange.tick.compare(nextBlockEnd) == 0) + { currentMeterChange = nextMeterChange; + currentMeasureStart = currentMeterChange.tick.clone(); + } if (this.song.length.compare(nextBlockEnd) == 0) break; @@ -417,7 +508,7 @@ Editor.prototype.refreshBlock = function( block.height = block.trackChordYEnd; // Render the row's background. - this.addSvgNode("viewerBlockBackground", "rect", + this.addSvgNode("editorBlockBackground", "rect", { x: block.x, y: block.y + block.trackNoteYStart, @@ -439,7 +530,7 @@ Editor.prototype.refreshBlock = function( var xBeat = (beatTick.asFloat() - block.tickStart.asFloat()) * this.wholeTickWidth; - var svgBeat = this.addSvgNode("viewerBeat", "line", + var svgBeat = this.addSvgNode("editorBeat", "line", { x1: block.x + xBeat, y1: block.y + block.trackNoteYStart, @@ -449,7 +540,7 @@ Editor.prototype.refreshBlock = function( } // Render the note track's frame. - this.addSvgNode("viewerBlockFrame", "rect", + this.addSvgNode("editorBlockFrame", "rect", { x: block.x, y: block.y + block.trackNoteYStart, @@ -458,7 +549,7 @@ Editor.prototype.refreshBlock = function( }); // Render the chord track's frame. - this.addSvgNode("viewerBlockFrame", "rect", + this.addSvgNode("editorBlockFrame", "rect", { x: block.x, y: block.y + block.trackChordYStart, @@ -478,7 +569,7 @@ Editor.prototype.refreshBlock = function( var midiPitchOffset = note.midiPitch - midiPitchMin; var noteYTop = block.trackNoteYEnd - (midiPitchOffset + 1) * that.noteHeight; - var noteDegree = Theory.getTruncatedPitchFromPitch(note.midiPitch); + var noteDegree = (note.midiPitch + 12 - block.key.tonicMidiPitch) % 12; var noteX = block.x + noteXStart + that.noteSideMargin; var noteY = block.y + noteYTop; @@ -486,7 +577,7 @@ Editor.prototype.refreshBlock = function( var noteH = that.noteHeight; var svgNote = that.addSvgNode( - "viewerDegree" + noteDegree + (note.editorData.selected ? "Selected" : ""), + "editorDegree" + noteDegree + (note.editorData.selected ? "Selected" : ""), "rect", { x: noteX, y: noteY, width: noteW, height: noteH }); block.elements.push({ note: note, x: noteX, y: noteY, width: noteW, height: noteH }); @@ -501,19 +592,20 @@ Editor.prototype.refreshBlock = function( chordXStart = Math.max(chordXStart, 0); chordXEnd = Math.min(chordXEnd, block.width); - var chordDegree = Theory.getTruncatedPitchFromPitch(chord.rootMidiPitch); + var chordDegree = + (chord.rootMidiPitch + 12 - block.key.tonicMidiPitch) % 12; var chordX = block.x + chordXStart + that.chordSideMargin; var chordY = block.y + block.trackChordYStart; var chordW = chordXEnd - chordXStart - that.chordSideMargin * 2; var chordH = block.trackChordYEnd - block.trackChordYStart; - that.addSvgNode("viewerChordBackground", "rect", + that.addSvgNode("editorChordBackground", "rect", { x: chordX, y: chordY, width: chordW, height: chordH }); block.elements.push({ chord: chord, x: chordX, y: chordY, width: chordW, height: chordH }); - that.addSvgNode("viewerDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + that.addSvgNode("editorDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), "rect", { x: block.x + chordXStart + that.chordSideMargin, @@ -522,7 +614,7 @@ Editor.prototype.refreshBlock = function( height: that.chordOrnamentHeight }); - that.addSvgNode("viewerDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + that.addSvgNode("editorDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), "rect", { x: block.x + chordXStart + that.chordSideMargin, @@ -532,7 +624,7 @@ Editor.prototype.refreshBlock = function( }); // Build and add the chord label. - var chordLabel = Theory.getChordRootLabel(null, chordDegree); + var chordLabel = Theory.getChordRootLabel(block.key.scaleIndex, chordDegree); if (Theory.chordKinds[chord.chordKindIndex].symbol[0]) chordLabel = chordLabel.toLowerCase(); @@ -541,8 +633,8 @@ Editor.prototype.refreshBlock = function( var chordLabelSuperscript = Theory.chordKinds[chord.chordKindIndex].symbol[2]; var svgChordLabel = that.addSvgTextComplemented( - "viewerChordLabel", - "viewerChordLabelSuperscript", + "editorChordLabel", + "editorChordLabelSuperscript", chordLabel, chordLabelSuperscript, { @@ -585,7 +677,7 @@ Editor.prototype.refreshBlock = function( if (cursorTrackMax == 1) selectionYEnd = block.trackChordYEnd; - this.addSvgNode("viewerBlockSelection", "rect", + this.addSvgNode("editorBlockSelection", "rect", { x: block.x + selectionXStart, y: block.y + selectionYStart, @@ -597,41 +689,75 @@ Editor.prototype.refreshBlock = function( // Render key change. if (block.key.tick.compare(block.tickStart) == 0) { - var keyChX = block.key.tick.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; - - that.addSvgNode("viewerKeyLine", "line", + that.addSvgNode("editorKeyLine", "line", { - x1: block.x + keyChX, - y1: block.y + block.trackKeyChangeYStart, - x2: block.x + keyChX, + x1: block.x, + y1: block.y + (block.trackKeyChangeYStart + block.trackKeyChangeYEnd) / 2, + x2: block.x, y2: block.y + block.trackChordYEnd }); - that.addSvgText("viewerKeyLabel", block.key.getLabel(), + that.addSvgNode( + "editorKeyHandle" + (block.key.editorData.selected ? "Selected" : ""), + "rect", + { + x: block.x - this.handleSize / 2, + y: block.y + (block.trackKeyChangeYStart + block.trackKeyChangeYEnd) / 2 - 1 - this.handleSize / 2, + width: this.handleSize, + height: this.handleSize + }); + + that.addSvgText("editorKeyLabel", block.key.getLabel(), { - x: block.x + keyChX + 5, + x: block.x + this.handleSize / 2 + 5, y: block.y + (block.trackKeyChangeYStart + block.trackKeyChangeYEnd) / 2 }); + + block.elements.push( + { + keyChange: block.key, + x: block.x - this.handleSize / 2, + y: block.y + (block.trackKeyChangeYStart + block.trackKeyChangeYEnd) / 2 - 1 - this.handleSize / 2, + width: this.handleSize * 2, + height: this.handleSize + }); } // Render meter change. if (block.meter.tick.compare(block.tickStart) == 0) { - var meterChX = block.meter.tick.clone().subtract(block.tickStart).asFloat() * this.wholeTickWidth; - - that.addSvgNode("viewerMeterLine", "line", + that.addSvgNode("editorMeterLine", "line", { - x1: block.x + meterChX, - y1: block.y + block.trackMeterChangeYStart, - x2: block.x + meterChX, + x1: block.x, + y1: block.y + (block.trackMeterChangeYStart + block.trackMeterChangeYEnd) / 2, + x2: block.x, y2: block.y + block.trackChordYEnd }); - that.addSvgText("viewerMeterLabel", block.meter.getLabel(), + that.addSvgNode( + "editorMeterHandle" + (block.meter.editorData.selected ? "Selected" : ""), + "rect", + { + x: block.x - this.handleSize / 2, + y: block.y + (block.trackMeterChangeYStart + block.trackMeterChangeYEnd) / 2 - 1 - this.handleSize / 2, + width: this.handleSize, + height: this.handleSize + }); + + that.addSvgText("editorMeterLabel", block.meter.getLabel(), { - x: block.x + meterChX + 5, + x: block.x + this.handleSize / 2 + 5, y: block.y + (block.trackMeterChangeYStart + block.trackMeterChangeYEnd) / 2 }); + + block.elements.push( + { + meterChange: block.meter, + x: block.x - this.handleSize, + y: block.y + (block.trackMeterChangeYStart + block.trackMeterChangeYEnd) / 2 - 1 - this.handleSize / 2, + width: this.handleSize * 2, + height: this.handleSize * 2 + }); } diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index 52d31fc..5ed081f 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -15,8 +15,22 @@ Editor.prototype.isAnySelected = function() { // TODO: Optimize. var anySelected = false; - this.song.notes .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); - this.song.chords.enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.notes .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.chords .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.keyChanges .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.meterChanges .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.forcedMeasures.enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + return anySelected; +} + + +Editor.prototype.isAnyIsolateElementSelected = function() +{ + // TODO: Optimize. + var anySelected = false; + this.song.keyChanges .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.meterChanges .enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); + this.song.forcedMeasures.enumerateAll(function (item) { anySelected = anySelected || item.editorData.selected; }); return anySelected; } @@ -24,8 +38,11 @@ Editor.prototype.isAnySelected = function() Editor.prototype.selectNone = function() { // TODO: Optimize. - this.song.notes .enumerateAll(function (item) { item.editorData.selected = false; }); - this.song.chords.enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.notes .enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.chords .enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.keyChanges .enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.meterChanges .enumerateAll(function (item) { item.editorData.selected = false; }); + this.song.forcedMeasures.enumerateAll(function (item) { item.editorData.selected = false; }); } @@ -83,6 +100,39 @@ Editor.prototype.enumerateSelectedChords = function(callback) } +Editor.prototype.enumerateSelectedKeyChanges = function(callback) +{ + // TODO: Optimize. + this.song.keyChanges.enumerateAll(function(keyCh) + { + if (keyCh.editorData.selected) + callback(keyCh); + }); +} + + +Editor.prototype.enumerateSelectedMeterChanges = function(callback) +{ + // TODO: Optimize. + this.song.meterChanges.enumerateAll(function(meterCh) + { + if (meterCh.editorData.selected) + callback(meterCh); + }); +} + + +Editor.prototype.enumerateSelectedForcedMeasures = function(callback) +{ + // TODO: Optimize. + this.song.forcedMeasures.enumerateAll(function(forcedMeasure) + { + if (forcedMeasure.editorData.selected) + callback(forcedMeasure); + }); +} + + Editor.prototype.cursorIsRangeSelection = function() { return this.cursorTick1.compare(this.cursorTick2) != 0; @@ -139,6 +189,24 @@ Editor.prototype.cursorSetTickAtSelectionStart = function() tick = chord.startTick.clone(); }); + this.enumerateSelectedKeyChanges(function(keyCh) + { + if (keyCh.tick.compare(tick) < 0) + tick = keyCh.tick.clone(); + }); + + this.enumerateSelectedMeterChanges(function(meterCh) + { + if (meterCh.tick.compare(tick) < 0) + tick = meterCh.tick.clone(); + }); + + this.enumerateSelectedForcedMeasures(function(forcedMeasure) + { + if (forcedMeasure.tick.compare(tick) < 0) + tick = forcedMeasure.tick.clone(); + }); + this.cursorSetTickBoth(tick); } } @@ -162,6 +230,24 @@ Editor.prototype.cursorSetTickAtSelectionEnd = function() tick = chord.endTick.clone(); }); + this.enumerateSelectedKeyChanges(function(keyCh) + { + if (keyCh.tick.compare(tick) > 0) + tick = keyCh.tick.clone(); + }); + + this.enumerateSelectedMeterChanges(function(meterCh) + { + if (meterCh.tick.compare(tick) > 0) + tick = meterCh.tick.clone(); + }); + + this.enumerateSelectedForcedMeasures(function(forcedMeasure) + { + if (forcedMeasure.tick.compare(tick) > 0) + tick = forcedMeasure.tick.clone(); + }); + this.cursorSetTickBoth(tick); } } @@ -238,10 +324,11 @@ Editor.prototype.eventMouseMove = function(ev) var elementAtMouse = this.getElementAt(mouseX, mouseY); if (elementAtMouse != null) { - if (elementAtMouse.note != undefined) - this.svg.style.cursor = "pointer"; - - else if (elementAtMouse.chord != undefined) + if (elementAtMouse.note != undefined || + elementAtMouse.chord != undefined || + elementAtMouse.keyChange != undefined || + elementAtMouse.meterChange != undefined || + elementAtMouse.forcedMeasure != undefined) this.svg.style.cursor = "pointer"; } } @@ -261,10 +348,9 @@ Editor.prototype.eventMouseDown = function(ev) var mouseY = ev.clientY - elemRect.top; this.cursorVisible = true; - - // Select elements. this.sliceOverlapping(); + // Handle element selection. var elementAtMouse = this.getElementAt(mouseX, mouseY); if (!ev.ctrlKey) @@ -289,6 +375,15 @@ Editor.prototype.eventMouseDown = function(ev) elementAtMouse.chord.rootMidiPitch, elementAtMouse.chord.embelishments); } + + else if (elementAtMouse.keyChange != undefined) + elementAtMouse.keyChange.editorData.selected = !elementAtMouse.keyChange.editorData.selected; + + else if (elementAtMouse.meterChange != undefined) + elementAtMouse.meterChange.editorData.selected = !elementAtMouse.meterChange.editorData.selected; + + else if (elementAtMouse.forcedMeasure != undefined) + elementAtMouse.forcedMeasure.editorData.selected = !elementAtMouse.forcedMeasure.editorData.selected; } // Set cursor tick. @@ -309,6 +404,7 @@ Editor.prototype.eventMouseDown = function(ev) this.mouseIsDown = true; + this.autoExtendSongLength(); this.refresh(); } @@ -522,32 +618,43 @@ Editor.prototype.performDeleteAction = function() var notesToDelete = []; this.enumerateSelectedNotes(function (note) { notesToDelete.push(note); }); - - for (var i = 0; i < notesToDelete.length; i++) - this.song.notes.remove(notesToDelete[i]); + this.song.notes.removeList(notesToDelete); var chordsToDelete = []; this.enumerateSelectedChords(function (chord) { chordsToDelete.push(chord); }); + this.song.chords.removeList(chordsToDelete); - for (var i = 0; i < chordsToDelete.length; i++) - this.song.chords.remove(chordsToDelete[i]); + var keyChangesToDelete = []; + this.enumerateSelectedKeyChanges(function (keyCh) { keyChangesToDelete.push(keyCh); }); + this.song.keyChanges.removeList(keyChangesToDelete); + + var meterChangesToDelete = []; + this.enumerateSelectedMeterChanges(function (meterCh) { meterChangesToDelete.push(meterCh); }); + this.song.meterChanges.removeList(meterChangesToDelete); + + var forcedMeasuresToDelete = []; + this.enumerateSelectedForcedMeasures(function (forcedMeasure) { forcedMeasuresToDelete.push(forcedMeasure); }); + this.song.forcedMeasures.removeList(forcedMeasuresToDelete); this.selectNone(); + this.song.sanitize(); this.refresh(); } Editor.prototype.performBackEraseAction = function() { - this.cursorVisible = true; - var that = this; var tickMin = this.cursorTick1.clone().min(this.cursorTick2); var tickMax = this.cursorTick1.clone().max(this.cursorTick2); var trackMin = Math.min(this.cursorTrack1, this.cursorTrack2); var trackMax = Math.max(this.cursorTrack1, this.cursorTrack2); - if (this.cursorIsRangeSelection()) + if (!this.cursorVisible) + { + this.performDeleteAction(); + } + else if (this.cursorIsRangeSelection()) { // Erase selected section. if (trackMin <= 0 && trackMax >= 0) @@ -617,6 +724,7 @@ Editor.prototype.performBackEraseAction = function() this.cursorSetTickBoth(moveToTick); } + this.cursorVisible = true; this.selectNone(); this.refresh(); } @@ -748,8 +856,6 @@ Editor.prototype.performInsertPitchAction = function(midiPitch) } this.cursorSetTickBoth(this.cursorTick1.clone().add(this.newElementDuration)); - - this.autoExtendSongLength(); this.refresh(); } @@ -783,10 +889,11 @@ Editor.prototype.performElementPitchChange = function(amount) chordToSample = chord; }); - if (chordToSample == null) + // Play sample. + if (noteToSample != null && chordToSample == null) Theory.playSampleNote(this.synth, noteToSample.midiPitch); - if (noteToSample == null) + if (chordToSample != null && noteToSample == null) Theory.playSampleChord( this.synth, chordToSample.chordKindIndex, @@ -817,6 +924,30 @@ Editor.prototype.performElementTimeChange = function(amount) amount = minCap; }); + this.enumerateSelectedKeyChanges(function(keyCh) + { + var minCap = keyCh.tick.clone().negate(); + + if (minCap.compare(amount) > 0) + amount = minCap; + }); + + this.enumerateSelectedMeterChanges(function(meterCh) + { + var minCap = meterCh.tick.clone().negate(); + + if (minCap.compare(amount) > 0) + amount = minCap; + }); + + this.enumerateSelectedForcedMeasures(function(forcedMeasure) + { + var minCap = forcedMeasure.tick.clone().negate(); + + if (minCap.compare(amount) > 0) + amount = minCap; + }); + // Apply changes to elements. this.enumerateSelectedNotes(function(note) { @@ -830,7 +961,22 @@ Editor.prototype.performElementTimeChange = function(amount) chord.endTick.add(amount); }); + this.enumerateSelectedKeyChanges(function(keyCh) + { + keyCh.tick.add(amount); + }); + this.enumerateSelectedMeterChanges(function(meterCh) + { + meterCh.tick.add(amount); + }); + + this.enumerateSelectedForcedMeasures(function(forcedMeasure) + { + forcedMeasure.tick.add(amount); + }); + + this.song.sanitize(); this.refresh(); } @@ -878,6 +1024,18 @@ Editor.prototype.sliceOverlapping = function() this.enumerateSelectedChords(function(chord) { selectedChords.push(chord); }); this.song.chords.removeList(selectedChords); + var selectedKeyChanges = []; + this.enumerateSelectedKeyChanges(function(keyCh) { selectedKeyChanges.push(keyCh); }); + this.song.keyChanges.removeList(selectedKeyChanges); + + var selectedMeterChanges = []; + this.enumerateSelectedMeterChanges(function(meterCh) { selectedMeterChanges.push(meterCh); }); + this.song.meterChanges.removeList(selectedMeterChanges); + + var selectedForcedMeasures = []; + this.enumerateSelectedForcedMeasures(function(forcedMeasure) { selectedForcedMeasures.push(forcedMeasure); }); + this.song.forcedMeasures.removeList(selectedForcedMeasures); + // Remove overlapping parts from song. for (var i = 0; i < selectedNotes.length; i++) this.eraseNotesAt( @@ -889,10 +1047,28 @@ Editor.prototype.sliceOverlapping = function() this.eraseChordsAt( selectedChords[i].startTick, selectedChords[i].endTick); + + for (var i = 0; i < selectedKeyChanges.length; i++) + this.eraseKeyChangesAt( + selectedKeyChanges[i].tick, + selectedKeyChanges[i].tick); + + for (var i = 0; i < selectedMeterChanges.length; i++) + this.eraseMeterChangesAt( + selectedMeterChanges[i].tick, + selectedMeterChanges[i].tick); + + for (var i = 0; i < selectedForcedMeasures.length; i++) + this.eraseForcedMeasuresAt( + selectedForcedMeasures[i].tick, + selectedForcedMeasures[i].tick); // Reinsert selected elements. - this.song.notes .insertList(selectedNotes); - this.song.chords.insertList(selectedChords); + this.song.notes .insertList(selectedNotes); + this.song.chords .insertList(selectedChords); + this.song.keyChanges .insertList(selectedKeyChanges); + this.song.meterChanges .insertList(selectedMeterChanges); + this.song.forcedMeasures.insertList(selectedForcedMeasures); } @@ -960,4 +1136,49 @@ Editor.prototype.eraseChordsAt = function(start, end) this.song.chords.removeList(overlappingChords); this.song.chords.insertList(slicedChords); +} + + +Editor.prototype.eraseKeyChangesAt = function(start, end) +{ + var overlappingKeyChanges = []; + + this.song.keyChanges.enumerateOverlappingRange( + start, end, + function (keyCh) + { + overlappingKeyChanges.push(keyCh); + }); + + this.song.keyChanges.removeList(overlappingKeyChanges); +} + + +Editor.prototype.eraseMeterChangesAt = function(start, end) +{ + var overlappingMeterChanges = []; + + this.song.meterChanges.enumerateOverlappingRange( + start, end, + function (meterCh) + { + overlappingMeterChanges.push(meterCh); + }); + + this.song.meterChanges.removeList(overlappingMeterChanges); +} + + +Editor.prototype.eraseForcedMeasuresAt = function(start, end) +{ + var overlappingForcedMeasures = []; + + this.song.forcedMeasures.enumerateOverlappingRange( + start, end, + function (forcedMeasure) + { + overlappingForcedMeasures.push(forcedMeasure); + }); + + this.song.forcedMeasures.removeList(overlappingForcedMeasures); } \ No newline at end of file diff --git a/src/main.js b/src/main.js index 70d1716..9342c4f 100644 --- a/src/main.js +++ b/src/main.js @@ -20,8 +20,9 @@ function main() window.onresize = function() { g_Editor.refresh(); }; document.getElementById("inputTempo").onkeydown = function(ev) { ev.stopPropagation(); }; - + refreshButtonPlay(false); + refreshSelectBoxes(); } @@ -32,6 +33,44 @@ function refreshButtonPlay(isPlaying) } +function refreshSelectBoxes() +{ + var selectKeyPitch = document.getElementById("selectKeyPitch"); + for (var i = 0; i < 12; i++) + { + var option = document.createElement("option"); + option.innerHTML = Theory.getIndependentPitchLabel(i); + selectKeyPitch.appendChild(option); + } + + var selectKeyScale = document.getElementById("selectKeyScale"); + for (var i = 0; i < Theory.scales.length; i++) + { + var option = document.createElement("option"); + option.innerHTML = Theory.scales[i].name; + selectKeyScale.appendChild(option); + } + + var selectMeterNumerator = document.getElementById("selectMeterNumerator"); + for (var i = 0; i < Theory.meterNumerators.length; i++) + { + var option = document.createElement("option"); + option.innerHTML = Theory.meterNumerators[i].toString(); + selectMeterNumerator.appendChild(option); + } + selectMeterNumerator.selectedIndex = 3; + + var selectMeterDenominator = document.getElementById("selectMeterDenominator"); + for (var i = 0; i < Theory.meterDenominators.length; i++) + { + var option = document.createElement("option"); + option.innerHTML = Theory.meterDenominators[i].toString(); + selectMeterDenominator.appendChild(option); + } + selectMeterDenominator.selectedIndex = 2; +} + + function handleButtonPlay() { g_Editor.togglePlay(); @@ -54,6 +93,24 @@ function handleInputTempo() } +function handleButtonInsertKeyChange() +{ + var pitch = document.getElementById("selectKeyPitch").selectedIndex; + var scaleIndex = document.getElementById("selectKeyScale").selectedIndex; + g_Editor.insertKeyChange(scaleIndex, pitch); +} + + +function handleButtonInsertMeterChange() +{ + var numeratorIndex = document.getElementById("selectMeterNumerator").selectedIndex; + var denominatorIndex = document.getElementById("selectMeterDenominator").selectedIndex; + g_Editor.insertMeterChange( + Theory.meterNumerators[numeratorIndex], + Theory.meterDenominators[denominatorIndex]); +} + + function handleButtonLoadLocal() { var data = window.prompt("Paste a saved song data:", ""); @@ -72,6 +129,7 @@ function handleButtonLoadLocal() } document.getElementById("inputTempo").value = g_Song.bpm.toString(); + g_Editor.setSong(g_Song); g_Editor.cursorSetTickBoth(new Rational(0)); g_Editor.refresh(); } @@ -79,8 +137,9 @@ function handleButtonLoadLocal() function handleButtonSaveLocal() { - var data = g_Song.save(); - window.prompt("Copy and save this data to a file:", data); + var songData = g_Song.save(); + var data = "data:text/plain," + encodeURIComponent(songData); + window.open(data); } @@ -118,6 +177,7 @@ function handleButtonLoadDropbox() } document.getElementById("inputTempo").value = g_Song.bpm.toString(); + g_Editor.setSong(g_Song); g_Editor.cursorSetTickBoth(new Rational(0)); g_Editor.refresh(); }; diff --git a/src/song/song.js b/src/song/song.js index 9388900..178e504 100644 --- a/src/song/song.js +++ b/src/song/song.js @@ -1,6 +1,6 @@ function Song() { - this.length = new Rational(1); + this.length = new Rational(4); this.notes = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); this.chords = new ListByRange(function(item) { return { start: item.startTick, end: item.endTick }; }); @@ -18,7 +18,7 @@ function Song() Song.prototype.clear = function() { - this.length = new Rational(1); + this.length = new Rational(4); this.notes.clear(); this.chords.clear(); this.keyChanges.clear(); @@ -44,11 +44,11 @@ Song.prototype.sanitize = function() if (this.length.compare(new Rational(1)) <= 0) this.length = new Rational(1); - if (this.keyChanges.findPrevious(new Rational(0)) == null) - this.keyChanges.insert(new SongKeyChange(new Rational(0), 0, 0)); + if (this.keyChanges.findAt(new Rational(0)) == null) + this.keyChanges.insert(new SongKeyChange(new Rational(0), 0, 0, { selected: false })); - if (this.meterChanges.findPrevious(new Rational(0)) == null) - this.meterChanges.insert(new SongMeterChange(new Rational(0), 4, 4)); + if (this.meterChanges.findAt(new Rational(0)) == null) + this.meterChanges.insert(new SongMeterChange(new Rational(0), 4, 4, { selected: false })); } @@ -206,8 +206,7 @@ Song.prototype.load = function(jsonStr) Rational.fromArray(song.notes[i][0]), Rational.fromArray(song.notes[i][1]), song.notes[i][2], - song.notes[i][3], - { selected: false })); + song.notes[i][3])); } for (var i = 0; i < song.chords.length; i++) @@ -217,8 +216,7 @@ Song.prototype.load = function(jsonStr) Rational.fromArray(song.chords[i][1]), song.chords[i][2], song.chords[i][3], - [], - { selected: false })); + [])); } for (var i = 0; i < song.keyChanges.length; i++) @@ -226,8 +224,7 @@ Song.prototype.load = function(jsonStr) this.keyChanges.insert(new SongKeyChange( Rational.fromArray(song.keyChanges[i][0]), song.keyChanges[i][1], - song.keyChanges[i][2], - { selected: false })); + song.keyChanges[i][2])); } for (var i = 0; i < song.meterChanges.length; i++) @@ -235,8 +232,7 @@ Song.prototype.load = function(jsonStr) this.meterChanges.insert(new SongMeterChange( Rational.fromArray(song.meterChanges[i][0]), song.meterChanges[i][1], - song.meterChanges[i][2], - { selected: false })); + song.meterChanges[i][2])); } this.setLengthAuto(); diff --git a/src/util/list_by_point.js b/src/util/list_by_point.js index 92480b9..16822f6 100644 --- a/src/util/list_by_point.js +++ b/src/util/list_by_point.js @@ -102,14 +102,33 @@ ListByPoint.prototype.enumerateOverlappingPoint = function(point, callback) ListByPoint.prototype.enumerateOverlappingRange = function(rangeStart, rangeEnd, callback) +{ + if (rangeStart.compare(rangeEnd) == 0) + this.enumerateOverlappingPoint(rangeStart, callback); + else + { + for (var i = 0; i < this.items.length; i++) + { + var itemPoint = this.getItemPointFunc(this.items[i]); + + if (itemPoint.compare(rangeEnd) < 0 && itemPoint.compare(rangeStart) >= 0) + callback(this.items[i]); + } + } +} + + +ListByPoint.prototype.findAt = function(point) { for (var i = 0; i < this.items.length; i++) { var itemPoint = this.getItemPointFunc(this.items[i]); - if (itemPoint.compare(rangeEnd) < 0 && itemPoint.compare(rangeStart) >= 0) - callback(this.items[i]); + if (itemPoint.compare(point) == 0) + return this.items[i]; } + + return null; } diff --git a/src/util/theory.js b/src/util/theory.js index c3fd199..b0521ae 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -1,6 +1,31 @@ var Theory = {}; +Theory.scales = +[ + { pitches: [0, 2, 4, 5, 7, 9, 11], name: "Major" }, + { pitches: [0, 2, 3, 5, 7, 9, 10], name: "Dorian" }, + { pitches: [0, 1, 3, 5, 7, 8, 10], name: "Phrygian" }, + { pitches: [0, 2, 4, 6, 7, 9, 11], name: "Lydian" }, + { pitches: [0, 2, 4, 5, 7, 9, 10], name: "Mixolydian" }, + { pitches: [0, 2, 3, 5, 7, 8, 10], name: "Natural Minor" }, + { pitches: [0, 1, 3, 5, 6, 8, 10], name: "Locrian" } +]; + + +Theory.meterNumerators = +[ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 +]; + + +Theory.meterDenominators = +[ + 1, 2, 4, 8, 16, 32 +]; + + Theory.chordKinds = [ /* @@ -43,163 +68,6 @@ Theory.chordKinds = ]; -Theory.isNoteRelativeInsteadOfAbsolute = function(string) -{ - for (var i = 0; i < string.length; i++) - { - switch (string.charAt(i).toLowerCase()) - { - case "1": case "2": case "3": - case "4": case "5": case "6": - case "7": - return true; - } - } - - return false; -} - - -Theory.isChordRelativeInsteadOfAbsolute = function(string) -{ - for (var i = 0; i < string.length; i++) - { - switch (string.charAt(i).toLowerCase()) - { - case "i": - case "v": - return true; - } - } - - return false; -} - - -Theory.decodeAbsoluteNoteName = function(string) -{ - var note = 0; - switch (string.charAt(0).toLowerCase()) - { - case "c": note = 0; break; - case "d": note = 2; break; - case "e": note = 4; break; - case "f": note = 5; break; - case "g": note = 7; break; - case "a": note = 9; break; - case "b": note = 11; break; - default: return null; - } - - for (var i = 1; i < string.length; i++) - { - switch (string.charAt(i)) - { - case "#": note += 1; break; - case "b": note -= 1; break; - default: return null; - } - } - - return note; -} - - -Theory.decodeRelativeNoteName = function(string) -{ - var degree = 0; - var i = 0; - - loop: for ( ; i < string.length; i++) - { - switch (string.charAt(i)) - { - case "#": degree += 1; break; - case "b": degree -= 1; break; - default: break loop; - } - } - - if (i != string.length - 1) - return null; - - switch (string.charAt(i)) - { - case "1": degree += 0; break; - case "2": degree += 2; break; - case "3": degree += 4; break; - case "4": degree += 5; break; - case "5": degree += 7; break; - case "6": degree += 9; break; - case "7": degree += 11; break; - default: return null; - } - - return degree; -} - - -Theory.decodeAbsoluteChordName = function(string) -{ - return Theory.decodeAbsoluteNoteName(string); -} - - -Theory.decodeRelativeChordName = function(string) -{ - var degree = 0; - var i = 0; - - loop: for ( ; i < string.length; i++) - { - switch (string.charAt(i)) - { - case "#": degree += 1; break; - case "b": degree -= 1; break; - default: break loop; - } - } - - switch (string.slice(i).toLowerCase()) - { - case "i": degree += 0; break; - case "ii": degree += 2; break; - case "iii": degree += 4; break; - case "iv": degree += 5; break; - case "v": degree += 7; break; - case "vi": degree += 9; break; - case "vii": degree += 11; break; - default: return null; - } - - return degree; -} - - -Theory.decodeChordKindName = function(string) -{ - for (var i = 0; i < Theory.chordKinds.length; i++) - { - if (string == Theory.chordKinds[i].code) - return i; - } - - return null; -} - - -Theory.getTruncatedPitchFromPitch = function(pitch) -{ - while (pitch >= 12) - pitch -= 12; - - while (pitch < 0) - pitch += 12; - - return pitch; -} - - Theory.midiPitchMin = 12 * 2; Theory.midiPitchMax = 12 * 9 - 1; @@ -243,17 +111,24 @@ Theory.getMeterLabel = function(numerator, denominator) } -Theory.getKeyLabel = function(scale, tonicMidiPitch) +Theory.getIndependentPitchLabel = function(midiPitch) +{ + var labels = ["C", "C♯/D♭", "D", "D♯/E♭", "E", "F", "F♯/G♭", "G", "G♯/A♭", "A", "A♯/B♭", "B"]; + return labels[midiPitch % 12]; +} + + +Theory.getKeyLabel = function(scaleIndex, tonicMidiPitch) { - // TODO: Use the representation set by the user (i.e., C# versus Db). + // TODO: Take scale into consideration. var labels = ["C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"]; - return labels[tonicMidiPitch % 12]; + return labels[tonicMidiPitch % 12] + " " + Theory.scales[scaleIndex].name; } -Theory.getChordRootLabel = function(scale, rootMidiPitch) +Theory.getChordRootLabel = function(scaleIndex, rootMidiPitch) { - // TODO: Use the representation set by the user (i.e., #IV versus bV). + // TODO: Take scale into consideration. var labels = ["I", "♭II", "II", "♭III", "III", "IV", "♭V", "V", "♭VI", "VI", "♭VII", "VII"]; return labels[rootMidiPitch % 12]; } diff --git a/style.css b/style.css index 2a212c4..07c034a 100644 --- a/style.css +++ b/style.css @@ -47,7 +47,10 @@ body .toolboxButton { - padding: 10px; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + padding-bottom: 2px; background-color: #fff; border: 0; border-top: 2px solid #fff; @@ -80,6 +83,11 @@ body height: 60px; } +.toolboxButtonRewind +{ + height: 40px; +} + .toolboxInput { margin-top: 5px; @@ -94,194 +102,194 @@ body height: 20px; } -.viewerBlockBackground +.editorBlockBackground { stroke-width: 0px; fill: #eee; } -.viewerBlockSelection +.editorBlockSelection { stroke-width: 0px; fill: rgba(0, 0, 255, 0.25); } -.viewerBlockFrame +.editorBlockFrame { stroke: #666; stroke-width: 2px; fill: rgba(0, 0, 0, 0); } -.viewerBeat +.editorBeat { stroke: #fff; stroke-width: 2px; } -.viewerDegree0 +.editorDegree0 { stroke-width: 0px; fill: #f00; } -.viewerDegree0Selected +.editorDegree0Selected { stroke-width: 2px; stroke: #f00; fill: #fcc; } -.viewerDegree1 +.editorDegree1 { stroke-width: 0px; fill: #f40; } -.viewerDegree1Selected +.editorDegree1Selected { stroke-width: 2px; stroke: #f40; fill: #fed; } -.viewerDegree2 +.editorDegree2 { stroke-width: 0px; fill: #f80; } -.viewerDegree2Selected +.editorDegree2Selected { stroke-width: 2px; stroke: #f80; fill: #fed; } -.viewerDegree3 +.editorDegree3 { stroke-width: 0px; fill: #fa0; } -.viewerDegree3Selected +.editorDegree3Selected { stroke-width: 2px; stroke: #fa0; fill: #fed; } -.viewerDegree4 +.editorDegree4 { stroke-width: 0px; fill: #fd0; } -.viewerDegree4Selected +.editorDegree4Selected { stroke-width: 2px; stroke: #fd0; fill: #fed; } -.viewerDegree5 +.editorDegree5 { stroke-width: 0px; fill: #0d0; } -.viewerDegree5Selected +.editorDegree5Selected { stroke-width: 2px; stroke: #0d0; fill: #dfd; } -.viewerDegree6 +.editorDegree6 { stroke-width: 0px; fill: #068; } -.viewerDegree6Selected +.editorDegree6Selected { stroke-width: 2px; stroke: #068; fill: #def; } -.viewerDegree7 +.editorDegree7 { stroke-width: 0px; fill: #00f; } -.viewerDegree7Selected +.editorDegree7Selected { stroke-width: 2px; stroke: #00f; fill: #ddf; } -.viewerDegree8 +.editorDegree8 { stroke-width: 0px; fill: #40f; } -.viewerDegree8Selected +.editorDegree8Selected { stroke-width: 2px; stroke: #40f; fill: #edf; } -.viewerDegree9 +.editorDegree9 { stroke-width: 0px; fill: #80f; } -.viewerDegree9Selected +.editorDegree9Selected { stroke-width: 2px; stroke: #80f; fill: #edf; } -.viewerDegree10 +.editorDegree10 { stroke-width: 0px; fill: #a0f; } -.viewerDegree10Selected +.editorDegree10Selected { stroke-width: 2px; stroke: #a0f; fill: #edf; } -.viewerDegree11 +.editorDegree11 { stroke-width: 0px; fill: #f0f; } -.viewerDegree11Selected +.editorDegree11Selected { stroke-width: 2px; stroke: #f0f; fill: #fdf; } -.viewerChordBackground +.editorChordBackground { stroke-width: 0px; fill: white; } -.viewerChordLabel +.editorChordLabel { fill: black; font-family: Verdana, sans-serif; @@ -290,7 +298,7 @@ body alignment-baseline: central; } -.viewerChordLabelSuperscript +.editorChordLabelSuperscript { fill: black; font-family: Verdana, sans-serif; @@ -300,13 +308,26 @@ body baseline-shift: super; } -.viewerMeterLine +.editorMeterHandle +{ + fill: #0af; + stroke-width: 0px; +} + +.editorMeterHandleSelected { stroke: #0af; stroke-width: 2px; + fill: #aef; } -.viewerMeterLabel +.editorMeterLine +{ + stroke: #0af; + stroke-width: 2px; +} + +.editorMeterLabel { fill: #0af; font-family: Verdana, sans-serif; @@ -315,13 +336,26 @@ body alignment-baseline: middle; } -.viewerKeyLine +.editorKeyHandle +{ + fill: #f04; + stroke-width: 0px; +} + +.editorKeyHandleSelected +{ + stroke: #f04; + stroke-width: 2px; + fill: #fad; +} + +.editorKeyLine { stroke: #f04; stroke-width: 2px; } -.viewerKeyLabel +.editorKeyLabel { fill: #f04; font-family: Verdana, sans-serif; @@ -330,19 +364,19 @@ body alignment-baseline: middle; } -.viewerCursor +.editorCursor { stroke: blue; stroke-width: 2px; } -.viewerCursorGhost +.editorCursorGhost { stroke: rgba(0, 0, 255, 0.25); stroke-width: 2px; } -.viewerCursorPlayback +.editorCursorPlayback { stroke: red; stroke-width: 2px; From 33f855f594bc14b53796cc41f8fce9e3585d2009 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Sun, 26 Mar 2017 23:37:27 -0300 Subject: [PATCH 04/44] improve toolbox --- index.html | 98 ++++++++++++++++++++++++++++------------ src/editor/editor.js | 7 +++ src/main.js | 104 ++++++++++++++++++++++++++++++++++++++++++- src/util/theory.js | 27 ++++++++--- style.css | 25 +++++++++-- 5 files changed, 221 insertions(+), 40 deletions(-) diff --git a/index.html b/index.html index 138c95d..b89ba0c 100644 --- a/index.html +++ b/index.html @@ -18,9 +18,9 @@
- +
- - + - - - - + - +
+
@@ -28,41 +28,81 @@
- Local + + +
- - +
- Dropbox -
- - - +
- - -
- - -

- - - / - -
- -
+ + + + + + +
+ + + + + + + + + +
+ Local: + + + +
+ Dropbox: + + + + +
+
+ + + + + + + + + +
+ Key Change: + + + + +
+ Meter Change: + + + / + + +
+
+ + +
diff --git a/src/editor/editor.js b/src/editor/editor.js index 4cc9e30..1bb4123 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -336,6 +336,9 @@ Editor.prototype.refresh = function() while (tick.compare(this.song.length) < 0) { var row = this.refreshRow(tick, y); + if (row == null) + break; + tick = row.tickEnd; y = row.yEnd; } @@ -427,6 +430,10 @@ Editor.prototype.refreshRow = function(rowTickStart, rowYStart) break; } + // Check if we can't make any progress to avoid an infinite loop. + if (calculatedBlocks.length == 0 && this.song.length.compare(currentBlockStart) > 0) + return null; + var rowTickEnd = currentBlockStart; var rowTickLength = rowTickEnd.clone().subtract(rowTickStart); diff --git a/src/main.js b/src/main.js index 9342c4f..6e8462f 100644 --- a/src/main.js +++ b/src/main.js @@ -2,7 +2,7 @@ var g_Editor = null; var g_Song = null; var g_Synth = null; -var songPlaying = false; +var g_MainTabIndex = 0; function main() @@ -22,7 +22,9 @@ function main() document.getElementById("inputTempo").onkeydown = function(ev) { ev.stopPropagation(); }; refreshButtonPlay(false); + refreshMainTabs(); refreshSelectBoxes(); + refreshKeyDependentItems(); } @@ -33,6 +35,18 @@ function refreshButtonPlay(isPlaying) } +function refreshMainTabs() +{ + document.getElementById("tdTabFile") .style.display = (g_MainTabIndex == 0 ? "block" : "none"); + document.getElementById("tdTabMarkers").style.display = (g_MainTabIndex == 1 ? "block" : "none"); + document.getElementById("tdTabChords") .style.display = (g_MainTabIndex == 2 ? "block" : "none"); + + document.getElementById("buttonTabFile") .className = (g_MainTabIndex == 0 ? "toolboxButtonSelected" : "toolboxButton"); + document.getElementById("buttonTabMarkers").className = (g_MainTabIndex == 1 ? "toolboxButtonSelected" : "toolboxButton"); + document.getElementById("buttonTabChords") .className = (g_MainTabIndex == 2 ? "toolboxButtonSelected" : "toolboxButton"); +} + + function refreshSelectBoxes() { var selectKeyPitch = document.getElementById("selectKeyPitch"); @@ -71,6 +85,94 @@ function refreshSelectBoxes() } +function refreshKeyDependentItems() +{ + var selectChordKinds = document.getElementById("selectChordKinds"); + + var optionInKey = document.createElement("option"); + optionInKey.innerHTML = "In Key"; + selectChordKinds.appendChild(optionInKey); + + for (var i = 0; i < Theory.chordKinds.length; i++) + { + if (Theory.chordKinds[i].startGroup != undefined) + { + var optGroup = document.createElement("optgroup"); + optGroup.label = "-- " + Theory.chordKinds[i].startGroup + " --"; + selectChordKinds.appendChild(optGroup); + } + + var option = document.createElement("option"); + + var labelMain = document.createElement("span"); + var labelSuperscript = document.createElement("sup"); + + labelMain.innerHTML = Theory.getChordLabelMain(0, i, 0, []); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(0, i, 0, []); + + option.appendChild(labelMain); + labelMain.appendChild(labelSuperscript); + selectChordKinds.appendChild(option); + } + selectChordKinds.selectedIndex = 0; + + /*var divChordKinds = document.getElementById("divChordKinds"); + + var tableChordColumns = document.createElement("table"); + tableChordColumns.style.textAlign = "left"; + divChordKinds.appendChild(tableChordColumns); + + var currentTd = null; + var groupCount = 0; + + for (var i = 0; i < Theory.chordKinds.length; i++) + { + if (Theory.chordKinds[i].startGroup != undefined) + { + groupCount = 0; + + var tr = document.createElement("tr"); + var tdLabel = document.createElement("td"); + var label = document.createElement("span"); + label.className = "toolboxLabel"; + label.innerHTML = Theory.chordKinds[i].startGroup + ":"; + tdLabel.appendChild(label); + tr.appendChild(tdLabel); + + currentTd = document.createElement("td"); + tr.appendChild(currentTd); + + tableChordColumns.appendChild(tr); + + if (i == 0) + { + var button = document.createElement("button"); + button.className = "toolboxButton"; + button.innerHTML = "In Key"; + currentTd.appendChild(button); + } + } + + var button = document.createElement("button"); + button.className = "toolboxButton"; + + var labelMain = document.createElement("span"); + var labelSuperscript = document.createElement("sup"); + + labelMain.innerHTML = Theory.getChordLabelMain(0, i, 0, []); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(0, i, 0, []); + + button.appendChild(labelMain); + button.appendChild(labelSuperscript); + currentTd.appendChild(button); + + groupCount++; + if (groupCount % 6 == 5) + currentTd.appendChild(document.createElement("br")); + }*/ +} + + function handleButtonPlay() { g_Editor.togglePlay(); diff --git a/src/util/theory.js b/src/util/theory.js index b0521ae..1822cf2 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -34,19 +34,17 @@ Theory.chordKinds = [isLowercase, complement, superscriptComplement] */ - { pitches: [0, 4, 7], code: "", symbol: [false, "", "" ], name: "Major" }, + { pitches: [0, 4, 7], code: "", symbol: [false, "", "" ], name: "Major", startGroup: "Triads" }, { pitches: [0, 3, 7], code: "m", symbol: [true, "", "" ], name: "Minor" }, { pitches: [0, 4, 8], code: "+", symbol: [false, "+", "" ], name: "Augmented" }, { pitches: [0, 3, 6], code: "o", symbol: [true, "", "o"], name: "Diminished" }, - { pitches: [0, 2, 7], code: "sus2", symbol: [false, "sus2", "" ], name: "Suspended Second" }, - { pitches: [0, 5, 7], code: "sus4", symbol: [false, "sus4", "" ], name: "Suspended Fourth" }, { pitches: [0, 0, 7, 12], code: "5", symbol: [false, "", "5"], name: "Power" }, - { pitches: [0, 4, 7, 9], code: "6", symbol: [false, "", "6"], name: "Major Sixth" }, + { pitches: [0, 4, 7, 9], code: "6", symbol: [false, "", "6"], name: "Major Sixth", startGroup: "Sixths" }, { pitches: [0, 3, 7, 9], code: "m6", symbol: [true, "", "6"], name: "Minor Sixth" }, - { pitches: [0, 4, 7, 10], code: "7", symbol: [false, "", "7"], name: "Dominant Seventh" }, + { pitches: [0, 4, 7, 10], code: "7", symbol: [false, "", "7"], name: "Dominant Seventh", startGroup: "Sevenths" }, { pitches: [0, 4, 7, 11], code: "maj7", symbol: [false, "", "M7"], name: "Major Seventh" }, { pitches: [0, 3, 7, 10], code: "m7", symbol: [true, "", "7"], name: "Minor Seventh" }, { pitches: [0, 3, 7, 11], code: "mmaj7", symbol: [true, "", "M7"], name: "Minor-Major Seventh" }, @@ -55,7 +53,7 @@ Theory.chordKinds = { pitches: [0, 3, 6, 9], code: "o7", symbol: [true, "", "o7"], name: "Diminished Seventh" }, { pitches: [0, 3, 6, 10], code: "%7", symbol: [true, "", "ø7"], name: "Half-Diminished Seventh" }, - { pitches: [0, 4, 7, 10, 14], code: "9", symbol: [false, "", "9"], name: "Dominant Ninth" }, + { pitches: [0, 4, 7, 10, 14], code: "9", symbol: [false, "", "9"], name: "Dominant Ninth", startGroup: "Ninths" }, { pitches: [0, 4, 7, 11, 14], code: "maj9", symbol: [false, "", "M9"], name: "Major Ninth" }, { pitches: [0, 3, 7, 10, 14], code: "m9", symbol: [true, "", "9"], name: "Minor Ninth" }, { pitches: [0, 3, 7, 11, 14], code: "mmaj9", symbol: [true, "", "M9"], name: "Minor-Major Ninth" }, @@ -134,6 +132,23 @@ Theory.getChordRootLabel = function(scaleIndex, rootMidiPitch) } +Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, rootMidiPitch, embelishments) +{ + var rootLabel = Theory.getChordRootLabel(scaleIndex, rootMidiPitch); + + if (Theory.chordKinds[chordKindIndex].symbol[0]) + rootLabel = rootLabel.toLowerCase(); + + return rootLabel + Theory.chordKinds[chordKindIndex].symbol[1]; +} + + +Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, rootMidiPitch, embelishments) +{ + return Theory.chordKinds[chordKindIndex].symbol[2]; +} + + Theory.calculateChordPitches = function(chordKindIndex, rootMidiPitch, embelishments) { var pitches = []; diff --git a/style.css b/style.css index 07c034a..76b18bf 100644 --- a/style.css +++ b/style.css @@ -20,7 +20,7 @@ body height: 130px; padding-top: 5px; overflow: hidden; - background-color: #ccc; + background-color: #ddd; text-align: center; } @@ -47,6 +47,7 @@ body .toolboxButton { + margin: 1px; padding-left: 10px; padding-right: 10px; padding-top: 2px; @@ -55,8 +56,7 @@ body border: 0; border-top: 2px solid #fff; border-bottom: 2px solid black; - border-radius: 10px; - box-shadow: 5px; + border-radius: 5px; outline: none; font-family: Verdana, sans-serif; font-size: 12px; @@ -83,6 +83,23 @@ body height: 60px; } +.toolboxButtonSelected +{ + position: relative; + left: 8px; + margin: 1px; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + padding-bottom: 2px; + background-color: #ccc; + border: 2px solid #ccc; + border-radius: 5px; + outline: none; + font-family: Verdana, sans-serif; + font-size: 12px; +} + .toolboxButtonRewind { height: 40px; @@ -93,7 +110,7 @@ body margin-top: 5px; margin-bottom: 5px; border: 0; - border-radius: 10px; + border-radius: 5px; outline: none; font-family: Verdana, sans-serif; font-size: 12px; From 58f8e9718ef2f08dfa74f24f834fda7a03671f28 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Tue, 28 Mar 2017 21:56:42 -0300 Subject: [PATCH 05/44] add toolbox chords --- index.html | 93 ++++++++---- src/editor/editor.js | 105 +++++++++++--- src/editor/editor_interaction.js | 53 ++----- src/main.js | 197 +++++++++++++++++--------- src/util/theory.js | 124 ++++++++++++++-- style.css | 235 +++++++++++-------------------- 6 files changed, 495 insertions(+), 312 deletions(-) diff --git a/index.html b/index.html index b89ba0c..9d1c9c0 100644 --- a/index.html +++ b/index.html @@ -18,9 +18,9 @@
- +
- - - diff --git a/src/editor/editor.js b/src/editor/editor.js index 1bb4123..8a93249 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -40,6 +40,8 @@ function Editor(svg, synth) this.chordOrnamentHeight = 5; this.handleSize = 8; + this.usePopularNotation = true; + this.eventInit(); this.callbackTogglePlay = null; @@ -119,6 +121,7 @@ Editor.prototype.play = function(startAtTick) if (this.song != null) this.song.feedSynth(this.synth, startAtTick); + this.sliceOverlapping(); this.selectNone(); this.cursorHide(); this.cursorSetTickPlayback(startAtTick); @@ -148,6 +151,7 @@ Editor.prototype.rewind = function() if (this.isPlaying) this.togglePlay(); + this.sliceOverlapping(); this.selectNone(); this.cursorSetTickBoth(new Rational(0)); @@ -155,13 +159,70 @@ Editor.prototype.rewind = function() } +Editor.prototype.insertNote = function(midiPitch) +{ + this.cursorSetTickAtSelectionEnd(); + this.sliceOverlapping(); + this.selectNone(); + + var note = new SongNote( + this.cursorTick1.clone(), + this.cursorTick1.clone().add(this.newElementDuration), + 0, + midiPitch, + { selected: true }); + + this.song.notes.insert(note); + + this.synth.clear(); + this.synth.stop(); + Theory.playSampleNote(this.synth, midiPitch); + this.synth.play(); + + this.cursorSetTrackBoth(0); + this.cursorSetTickBoth(this.cursorTick1.clone().add(this.newElementDuration)); + + this.autoExtendSongLength(); + this.refresh(); +} + + +Editor.prototype.insertChord = function(chordKindIndex, rootMidiPitch, embelishments) +{ + this.cursorSetTickAtSelectionEnd(); + this.sliceOverlapping(); + this.selectNone(); + + var chord = new SongChord( + this.cursorTick1.clone(), + this.cursorTick1.clone().add(this.newElementDuration), + chordKindIndex, + rootMidiPitch, + embelishments, + { selected: true }); + + this.song.chords.insert(chord); + + this.synth.clear(); + this.synth.stop(); + Theory.playSampleChord(this.synth, chordKindIndex, rootMidiPitch, embelishments); + this.synth.play(); + + this.cursorSetTrackBoth(1); + this.cursorSetTickBoth(this.cursorTick1.clone().add(this.newElementDuration)); + + this.autoExtendSongLength(); + this.refresh(); +} + + Editor.prototype.insertKeyChange = function(scaleIndex, tonicMidiPitch) { this.selectNone(); - this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); this.eraseKeyChangesAt(this.cursorTick1, this.cursorTick1); this.song.keyChanges.insert( new SongKeyChange(this.cursorTick1.clone(), scaleIndex, tonicMidiPitch, { selected: true })); + this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); this.refresh(); } @@ -169,10 +230,10 @@ Editor.prototype.insertKeyChange = function(scaleIndex, tonicMidiPitch) Editor.prototype.insertMeterChange = function(numerator, denominator) { this.selectNone(); - this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); this.eraseMeterChangesAt(this.cursorTick1, this.cursorTick1); this.song.meterChanges.insert( new SongMeterChange(this.cursorTick1.clone(), numerator, denominator, { selected: true })); + this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); this.refresh(); } @@ -576,7 +637,10 @@ Editor.prototype.refreshBlock = function( var midiPitchOffset = note.midiPitch - midiPitchMin; var noteYTop = block.trackNoteYEnd - (midiPitchOffset + 1) * that.noteHeight; - var noteDegree = (note.midiPitch + 12 - block.key.tonicMidiPitch) % 12; + var noteRelativePitch = (note.midiPitch + 12 - block.key.tonicMidiPitch) % 12; + var noteDegree = Theory.findPitchDegree(block.key.scaleIndex, noteRelativePitch, that.usePopularNotation); + var noteColor = Theory.getDegreeColor(noteDegree); + var noteColorAccent = Theory.getDegreeColorAccent(noteDegree); var noteX = block.x + noteXStart + that.noteSideMargin; var noteY = block.y + noteYTop; @@ -584,8 +648,11 @@ Editor.prototype.refreshBlock = function( var noteH = that.noteHeight; var svgNote = that.addSvgNode( - "editorDegree" + noteDegree + (note.editorData.selected ? "Selected" : ""), + "editorDegree" + (note.editorData.selected ? "Selected" : ""), "rect", { x: noteX, y: noteY, width: noteW, height: noteH }); + + svgNote.style.fill = (note.editorData.selected ? noteColorAccent : noteColor); + svgNote.style.stroke = noteColor; block.elements.push({ note: note, x: noteX, y: noteY, width: noteW, height: noteH }); }); @@ -599,20 +666,22 @@ Editor.prototype.refreshBlock = function( chordXStart = Math.max(chordXStart, 0); chordXEnd = Math.min(chordXEnd, block.width); - var chordDegree = - (chord.rootMidiPitch + 12 - block.key.tonicMidiPitch) % 12; + var chordRelativePitch = (chord.rootMidiPitch + 12 - block.key.tonicMidiPitch) % 12; + var chordDegree = Theory.findPitchDegree(block.key.scaleIndex, chordRelativePitch, that.usePopularNotation); + var chordColor = Theory.getDegreeColor(chordDegree); + var chordColorAccent = Theory.getDegreeColorAccent(chordDegree); var chordX = block.x + chordXStart + that.chordSideMargin; var chordY = block.y + block.trackChordYStart; var chordW = chordXEnd - chordXStart - that.chordSideMargin * 2; var chordH = block.trackChordYEnd - block.trackChordYStart; - that.addSvgNode("editorChordBackground", "rect", - { x: chordX, y: chordY, width: chordW, height: chordH }); + that.addSvgNode("editorChordBackground", + "rect", { x: chordX, y: chordY, width: chordW, height: chordH }); block.elements.push({ chord: chord, x: chordX, y: chordY, width: chordW, height: chordH }); - that.addSvgNode("editorDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + var svgChordOrnament1 = that.addSvgNode("editorDegree" + (chord.editorData.selected ? "Selected" : ""), "rect", { x: block.x + chordXStart + that.chordSideMargin, @@ -621,7 +690,7 @@ Editor.prototype.refreshBlock = function( height: that.chordOrnamentHeight }); - that.addSvgNode("editorDegree" + chordDegree + (chord.editorData.selected ? "Selected" : ""), + var svgChordOrnament2 = that.addSvgNode("editorDegree" + (chord.editorData.selected ? "Selected" : ""), "rect", { x: block.x + chordXStart + that.chordSideMargin, @@ -629,15 +698,17 @@ Editor.prototype.refreshBlock = function( width: chordXEnd - chordXStart - that.chordSideMargin * 2, height: that.chordOrnamentHeight }); + + svgChordOrnament1.style.fill = (chord.editorData.selected ? chordColorAccent : chordColor); + svgChordOrnament1.style.stroke = chordColor; + svgChordOrnament2.style.fill = (chord.editorData.selected ? chordColorAccent : chordColor); + svgChordOrnament2.style.stroke = chordColor; // Build and add the chord label. - var chordLabel = Theory.getChordRootLabel(block.key.scaleIndex, chordDegree); - if (Theory.chordKinds[chord.chordKindIndex].symbol[0]) - chordLabel = chordLabel.toLowerCase(); - - chordLabel += Theory.chordKinds[chord.chordKindIndex].symbol[1]; - - var chordLabelSuperscript = Theory.chordKinds[chord.chordKindIndex].symbol[2]; + var chordLabel = Theory.getChordLabelMain( + block.key.scaleIndex, chord.chordKindIndex, chordRelativePitch, chord.embelishments, that.usePopularNotation); + var chordLabelSuperscript = Theory.getChordLabelSuperscript( + block.key.scaleIndex, chord.chordKindIndex, chordRelativePitch, chord.embelishments, that.usePopularNotation); var svgChordLabel = that.addSvgTextComplemented( "editorChordLabel", diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index 5ed081f..a4d3024 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -149,12 +149,18 @@ Editor.prototype.cursorSetTickBoth = function(tick) { this.cursorTick1 = tick.clone(); this.cursorTick2 = tick.clone(); + + if (this.callbackCursorChange != null) + this.callbackCursorChange(this.cursorTick1); } Editor.prototype.cursorSetTick2 = function(tick) { this.cursorTick2 = tick.clone(); + + if (this.callbackCursorChange != null) + this.callbackCursorChange(this.cursorTick2); } @@ -809,55 +815,14 @@ Editor.prototype.performCursorTrackChange = function(amount, both) Editor.prototype.performInsertPitchAction = function(midiPitch) { - this.cursorSetTickAtSelectionEnd(); - this.sliceOverlapping(); - this.selectNone(); - - // Add a note. - if (this.cursorTrack1 != this.cursorTrack2 || - this.cursorTrack1 == 0) + if (this.cursorTrack1 != this.cursorTrack2 || this.cursorTrack1 == 0) { - var note = new SongNote( - this.cursorTick1.clone(), - this.cursorTick1.clone().add(this.newElementDuration), - 0, - midiPitch + 60, - { selected: true }); - - this.song.notes.insert(note); - - this.synth.clear(); - this.synth.stop(); - Theory.playSampleNote(this.synth, midiPitch + 60); - this.synth.play(); - - this.cursorSetTrackBoth(0); + this.insertNote(midiPitch + 60); } - - // Else, add a chord. else { - var chord = new SongChord( - this.cursorTick1.clone(), - this.cursorTick1.clone().add(this.newElementDuration), - 0, - midiPitch, - [], - { selected: true }); - - this.song.chords.insert(chord); - - this.synth.clear(); - this.synth.stop(); - Theory.playSampleChord(this.synth, 0, midiPitch, []); - this.synth.play(); - - this.cursorSetTrackBoth(1); + this.insertChord(0, midiPitch, []); } - - this.cursorSetTickBoth(this.cursorTick1.clone().add(this.newElementDuration)); - this.autoExtendSongLength(); - this.refresh(); } diff --git a/src/main.js b/src/main.js index 6e8462f..6f15a80 100644 --- a/src/main.js +++ b/src/main.js @@ -3,6 +3,7 @@ var g_Song = null; var g_Synth = null; var g_MainTabIndex = 0; +var g_CurrentKey = null; function main() @@ -17,6 +18,7 @@ function main() g_Editor.refresh(); g_Editor.callbackTogglePlay = refreshButtonPlay; + g_Editor.callbackCursorChange = callbackCursorChange; window.onresize = function() { g_Editor.refresh(); }; document.getElementById("inputTempo").onkeydown = function(ev) { ev.stopPropagation(); }; @@ -24,7 +26,7 @@ function main() refreshButtonPlay(false); refreshMainTabs(); refreshSelectBoxes(); - refreshKeyDependentItems(); + callbackCursorChange(new Rational(0)); } @@ -41,9 +43,9 @@ function refreshMainTabs() document.getElementById("tdTabMarkers").style.display = (g_MainTabIndex == 1 ? "block" : "none"); document.getElementById("tdTabChords") .style.display = (g_MainTabIndex == 2 ? "block" : "none"); - document.getElementById("buttonTabFile") .className = (g_MainTabIndex == 0 ? "toolboxButtonSelected" : "toolboxButton"); - document.getElementById("buttonTabMarkers").className = (g_MainTabIndex == 1 ? "toolboxButtonSelected" : "toolboxButton"); - document.getElementById("buttonTabChords") .className = (g_MainTabIndex == 2 ? "toolboxButtonSelected" : "toolboxButton"); + document.getElementById("buttonTabFile") .className = (g_MainTabIndex == 0 ? "toolboxMainTabSelected" : "toolboxButton"); + document.getElementById("buttonTabMarkers").className = (g_MainTabIndex == 1 ? "toolboxMainTabSelected" : "toolboxButton"); + document.getElementById("buttonTabChords") .className = (g_MainTabIndex == 2 ? "toolboxMainTabSelected" : "toolboxButton"); } @@ -82,11 +84,8 @@ function refreshSelectBoxes() selectMeterDenominator.appendChild(option); } selectMeterDenominator.selectedIndex = 2; -} - - -function refreshKeyDependentItems() -{ + + var selectChordKinds = document.getElementById("selectChordKinds"); var optionInKey = document.createElement("option"); @@ -115,61 +114,23 @@ function refreshKeyDependentItems() selectChordKinds.appendChild(option); } selectChordKinds.selectedIndex = 0; +} + + +function callbackCursorChange(tick) +{ + var keyAtTick = g_Song.keyChanges.findPrevious(tick); + if (keyAtTick == null) + return; - /*var divChordKinds = document.getElementById("divChordKinds"); - - var tableChordColumns = document.createElement("table"); - tableChordColumns.style.textAlign = "left"; - divChordKinds.appendChild(tableChordColumns); - - var currentTd = null; - var groupCount = 0; - - for (var i = 0; i < Theory.chordKinds.length; i++) - { - if (Theory.chordKinds[i].startGroup != undefined) - { - groupCount = 0; - - var tr = document.createElement("tr"); - var tdLabel = document.createElement("td"); - var label = document.createElement("span"); - label.className = "toolboxLabel"; - label.innerHTML = Theory.chordKinds[i].startGroup + ":"; - tdLabel.appendChild(label); - tr.appendChild(tdLabel); - - currentTd = document.createElement("td"); - tr.appendChild(currentTd); - - tableChordColumns.appendChild(tr); - - if (i == 0) - { - var button = document.createElement("button"); - button.className = "toolboxButton"; - button.innerHTML = "In Key"; - currentTd.appendChild(button); - } - } - - var button = document.createElement("button"); - button.className = "toolboxButton"; - - var labelMain = document.createElement("span"); - var labelSuperscript = document.createElement("sup"); - - labelMain.innerHTML = Theory.getChordLabelMain(0, i, 0, []); - labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(0, i, 0, []); - - button.appendChild(labelMain); - button.appendChild(labelSuperscript); - currentTd.appendChild(button); - - groupCount++; - if (groupCount % 6 == 5) - currentTd.appendChild(document.createElement("br")); - }*/ + g_CurrentKey = keyAtTick; + refreshKeyDependentItems(); +} + + +function refreshKeyDependentItems() +{ + handleSelectChordKindsChange(); } @@ -213,6 +174,116 @@ function handleButtonInsertMeterChange() } +function handleSelectChordKindsChange() +{ + var selectedIndex = document.getElementById("selectChordKinds").selectedIndex; + + var tonic = g_CurrentKey.tonicMidiPitch; + var scale = Theory.scales[g_CurrentKey.scaleIndex]; + + // In Key + if (selectedIndex == 0) + { + for (var i = 0; i < 7; i++) + { + var chordPitches = []; + for (var j = 0; j < 3; j++) + { + var degree = i + j * 2; + + var nextPitch; + if (degree >= 7) + nextPitch = tonic + scale.pitches[degree % 7] + 12; + else + nextPitch = tonic + scale.pitches[degree]; + + chordPitches.push(nextPitch); + } + + var chordKindIndex = Theory.findChordKindIndex(chordPitches); + + var labelMain = document.createElement("span"); + var labelSuperscript = document.createElement("sup"); + labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, chordPitches[0] - tonic, [], g_Editor.usePopularNotation); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, chordPitches[0] - tonic, [], g_Editor.usePopularNotation); + + var button = document.getElementById("buttonChord" + i); + + while (button.firstChild != null) + button.removeChild(button.firstChild); + + button.appendChild(labelMain); + labelMain.appendChild(labelSuperscript); + + var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, chordPitches[0] - tonic, g_Editor.usePopularNotation); + var degreeColor = Theory.getDegreeColor(degree); + button.style.borderTop = "4px solid " + degreeColor; + button.style.borderBottom = "4px solid " + degreeColor; + + button.chordKindIndex = chordKindIndex; + button.rootMidiPitch = chordPitches[0]; + button.onclick = function() + { + g_Editor.insertChord(this.chordKindIndex, this.rootMidiPitch, []); + }; + } + + for (var i = 7; i < 12; i++) + { + var button = document.getElementById("buttonChord" + i); + button.style.visibility = "hidden"; + } + } + + else + { + var chordKindIndex = selectedIndex - 1; + var buttonAssignment = [0, 2, 4, 5, 7, 9, 11, 1, 3, 6, 8, 10]; + + for (var i = 0; i < 12; i++) + { + var pitch = buttonAssignment[i]; + + var labelMain = document.createElement("span"); + var labelSuperscript = document.createElement("sup"); + labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); + + var button = document.getElementById("buttonChord" + i); + + while (button.firstChild != null) + button.removeChild(button.firstChild); + + button.appendChild(labelMain); + labelMain.appendChild(labelSuperscript); + + var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, pitch, g_Editor.usePopularNotation); + var degreeColor = Theory.getDegreeColor(degree); + button.style.borderTop = "4px solid " + degreeColor; + button.style.borderBottom = "4px solid " + degreeColor; + + button.style.visibility = "visible"; + + button.chordKindIndex = chordKindIndex; + button.rootMidiPitch = (pitch + g_CurrentKey.tonicMidiPitch) % 12; + button.onclick = function() + { + g_Editor.insertChord(this.chordKindIndex, this.rootMidiPitch, []); + }; + } + } +} + + +function handleCheckboxPopularNotation() +{ + var usePopularNotation = document.getElementById("checkboxPopularNotation").checked; + g_Editor.usePopularNotation = usePopularNotation; + g_Editor.refresh(); + refreshKeyDependentItems(); +} + + function handleButtonLoadLocal() { var data = window.prompt("Paste a saved song data:", ""); diff --git a/src/util/theory.js b/src/util/theory.js index 1822cf2..80eb310 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -124,17 +124,32 @@ Theory.getKeyLabel = function(scaleIndex, tonicMidiPitch) } -Theory.getChordRootLabel = function(scaleIndex, rootMidiPitch) +Theory.getChordRootLabel = function(scaleIndex, relativePitch, usePopularNotation = true) { - // TODO: Take scale into consideration. - var labels = ["I", "♭II", "II", "♭III", "III", "IV", "♭V", "V", "♭VI", "VI", "♭VII", "VII"]; - return labels[rootMidiPitch % 12]; + if (usePopularNotation) + { + var labels = ["I", "♭II", "II", "♭III", "III", "IV", "♭V", "V", "♭VI", "VI", "♭VII", "VII"]; + return labels[relativePitch % 12]; + } + else + { + // FIXME: Compute correct Common Practice labels. + var labels = ["I", "II", "III", "IV", "V", "VI", "VII", "I"]; + + var degree = Theory.findPitchDegree(scaleIndex, relativePitch, false); + var degreeInteger = Math.floor(degree); + + if (degree == degreeInteger) + return labels[degreeInteger]; + else + return "♭" + labels[degreeInteger + 1]; + } } -Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, rootMidiPitch, embelishments) +Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, relativePitch, embelishments, usePopularNotation = true) { - var rootLabel = Theory.getChordRootLabel(scaleIndex, rootMidiPitch); + var rootLabel = Theory.getChordRootLabel(scaleIndex, relativePitch, usePopularNotation); if (Theory.chordKinds[chordKindIndex].symbol[0]) rootLabel = rootLabel.toLowerCase(); @@ -143,7 +158,7 @@ Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, rootMidiPitch, e } -Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, rootMidiPitch, embelishments) +Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, relativePitch, embelishments, usePopularNotation = true) { return Theory.chordKinds[chordKindIndex].symbol[2]; } @@ -166,7 +181,7 @@ Theory.calculateChordPitches = function(chordKindIndex, rootMidiPitch, embelishm } -Theory.getChordBassPattern = function(meter) +/*Theory.getChordBassPattern = function(meter) { // [ [ start beat, end beat, volume ], ... ] switch (meter.numerator) @@ -187,6 +202,49 @@ Theory.getChordStackPattern = function(meter) case 4: return [ [ 0, 0.9, 1 ], [ 1, 1.9, 0.5 ], [ 2, 2.9, 0.7 ], [ 3, 3.9, 0.5 ] ]; default: return [ ]; } +}*/ + + +Theory.findPitchDegree = function(scaleIndex, relativePitch, usePopularNotation = true) +{ + var scale = Theory.scales[scaleIndex]; + if (usePopularNotation) + scale = Theory.scales[0]; + + for (var i = 0; i < scale.pitches.length; i++) + { + if (relativePitch == scale.pitches[i]) + return i; + + if (relativePitch < scale.pitches[i]) + return (i + 7 - 0.5) % 7; + } + + return 6.5; +} + + +Theory.findChordKindIndex = function(relativePitches) +{ + for (var i = 0; i < Theory.chordKinds.length; i++) + { + var chordKind = Theory.chordKinds[i]; + + if (relativePitches.length != chordKind.pitches.length) + continue; + + var match = true; + for (var j = 0; j < relativePitches.length; j++) + { + if (relativePitches[j] - relativePitches[0] != chordKind.pitches[j]) + match = false; + } + + if (match) + return i; + } + + return null; } @@ -214,4 +272,54 @@ Theory.playSampleChord = function(synth, chordKindIndex, rootMidiPitch, embelish } synth.play(); +} + + +Theory.getDegreeColor = function(degree) +{ + switch (degree) + { + case 0: return "#f00"; + case 1: return "#f80"; + case 2: return "#fd0"; + case 3: return "#0d0"; + case 4: return "#00f"; + case 5: return "#80f"; + case 6: return "#f0f"; + + case 0.5: return "#800"; + case 1.5: return "#840"; + case 2.5: return "#860"; + case 3.5: return "#060"; + case 4.5: return "#008"; + case 5.5: return "#408"; + case 6.5: return "#808"; + + default: return "#888"; + } +} + + +Theory.getDegreeColorAccent = function(degree) +{ + switch (degree) + { + case 0: return "#fdd"; + case 1: return "#fed"; + case 2: return "#fed"; + case 3: return "#dfd"; + case 4: return "#ddf"; + case 5: return "#edf"; + case 6: return "#fdf"; + + case 0.5: return "#fdd"; + case 1.5: return "#fed"; + case 2.5: return "#fed"; + case 3.5: return "#dfd"; + case 4.5: return "#ddf"; + case 5.5: return "#edf"; + case 6.5: return "#fdf"; + + default: return "#eee"; + } } \ No newline at end of file diff --git a/style.css b/style.css index 76b18bf..08342a1 100644 --- a/style.css +++ b/style.css @@ -19,11 +19,19 @@ body width: 100%; height: 130px; padding-top: 5px; + padding-bottom: 5px; + padding-left: 5px; + padding-right: 5px; overflow: hidden; background-color: #ddd; text-align: center; } +#tableToolboxMainLayout +{ + height: 120px; +} + #divEditor { width: 100%; @@ -37,6 +45,34 @@ body width: 100%; } +.toolboxGroup +{ + padding-left: 10px; + padding-right: 10px; + background-color: #ccc; + border-radius: 5px; +} + +.toolboxGroup2 +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 5px; + padding-bottom: 5px; + background-color: #bbb; + border-radius: 5px; +} + +.toolboxSeparator +{ + border-left: 1px solid black; +} + +.toolboxGroupMainTabs +{ + width: 100px; +} + .toolboxLabel { margin-top: 5px; @@ -47,7 +83,6 @@ body .toolboxButton { - margin: 1px; padding-left: 10px; padding-right: 10px; padding-top: 2px; @@ -79,15 +114,14 @@ body .toolboxButtonPlay { font-size: 24px; - width: 110px; + width: 120px; height: 60px; } -.toolboxButtonSelected +.toolboxMainTabSelected { position: relative; - left: 8px; - margin: 1px; + left: 10px; padding-left: 10px; padding-right: 10px; padding-top: 2px; @@ -105,6 +139,40 @@ body height: 40px; } +.toolboxChord +{ + width: 40px; + height: 30px; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + padding-bottom: 2px; + background-color: #fff; + border: 0; + border-top: 2px solid #fff; + border-bottom: 2px solid black; + border-radius: 5px; + outline: none; + overflow: hidden; + font-family: Verdana, sans-serif; + font-size: 12px; + text-align: center; +} + +.toolboxChord:hover +{ + cursor: pointer; +} + +.toolboxChord:active +{ + cursor: pointer; + background-color: #ddd; + border: 0; + border-top: 2px solid black; + border-bottom: 2px solid #ddd; +} + .toolboxInput { margin-top: 5px; @@ -119,6 +187,10 @@ body height: 20px; } +.toolboxCheckbox +{ +} + .editorBlockBackground { stroke-width: 0px; @@ -144,160 +216,17 @@ body stroke-width: 2px; } -.editorDegree0 -{ - stroke-width: 0px; - fill: #f00; -} - -.editorDegree0Selected -{ - stroke-width: 2px; - stroke: #f00; - fill: #fcc; -} - -.editorDegree1 -{ - stroke-width: 0px; - fill: #f40; -} - -.editorDegree1Selected -{ - stroke-width: 2px; - stroke: #f40; - fill: #fed; -} - -.editorDegree2 -{ - stroke-width: 0px; - fill: #f80; -} - -.editorDegree2Selected -{ - stroke-width: 2px; - stroke: #f80; - fill: #fed; -} - -.editorDegree3 -{ - stroke-width: 0px; - fill: #fa0; -} - -.editorDegree3Selected -{ - stroke-width: 2px; - stroke: #fa0; - fill: #fed; -} - -.editorDegree4 -{ - stroke-width: 0px; - fill: #fd0; -} - -.editorDegree4Selected -{ - stroke-width: 2px; - stroke: #fd0; - fill: #fed; -} - -.editorDegree5 -{ - stroke-width: 0px; - fill: #0d0; -} - -.editorDegree5Selected -{ - stroke-width: 2px; - stroke: #0d0; - fill: #dfd; -} - -.editorDegree6 -{ - stroke-width: 0px; - fill: #068; -} - -.editorDegree6Selected -{ - stroke-width: 2px; - stroke: #068; - fill: #def; -} - -.editorDegree7 -{ - stroke-width: 0px; - fill: #00f; -} - -.editorDegree7Selected -{ - stroke-width: 2px; - stroke: #00f; - fill: #ddf; -} - -.editorDegree8 -{ - stroke-width: 0px; - fill: #40f; -} - -.editorDegree8Selected -{ - stroke-width: 2px; - stroke: #40f; - fill: #edf; -} - -.editorDegree9 -{ - stroke-width: 0px; - fill: #80f; -} - -.editorDegree9Selected -{ - stroke-width: 2px; - stroke: #80f; - fill: #edf; -} - -.editorDegree10 +.editorDegree { stroke-width: 0px; - fill: #a0f; + fill: #888; } -.editorDegree10Selected +.editorDegreeSelected { stroke-width: 2px; - stroke: #a0f; - fill: #edf; -} - -.editorDegree11 -{ - stroke-width: 0px; - fill: #f0f; -} - -.editorDegree11Selected -{ - stroke-width: 2px; - stroke: #f0f; - fill: #fdf; + stroke: #888; + fill: #eee; } .editorChordBackground From 5fb4c0b17ffa3d0c3e1dfbcdd4c0b652f00d0041 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Tue, 28 Mar 2017 22:13:09 -0300 Subject: [PATCH 06/44] add input by scale degree --- src/editor/editor.js | 29 +++++++++++++++++++++++++---- src/editor/editor_interaction.js | 22 ++++++++++++++++++++++ src/main.js | 24 +++++------------------- src/util/theory.js | 22 ++++++++++++++++++++++ 4 files changed, 74 insertions(+), 23 deletions(-) diff --git a/src/editor/editor.js b/src/editor/editor.js index 8a93249..044b10c 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -93,10 +93,7 @@ Editor.prototype.togglePlay = function() if (this.isPlaying) { - var startAtTick = this.cursorTick1.clone().min(this.cursorTick2); - startAtTick.subtract(new Rational(1)); - startAtTick.max(new Rational(0)); - + var startAtTick = this.cursorTick1.clone().min(this.cursorTick2); this.play(startAtTick); } else @@ -216,6 +213,30 @@ Editor.prototype.insertChord = function(chordKindIndex, rootMidiPitch, embelishm } +Editor.prototype.insertNoteByDegree = function(degree) +{ + this.cursorSetTickAtSelectionEnd(); + + var key = this.song.keyChanges.findPrevious(this.cursorTick1); + var pitch = Theory.scales[key.scaleIndex].pitches[degree]; + + this.insertNote(pitch + 60); +} + + +Editor.prototype.insertChordByDegree = function(degree) +{ + this.cursorSetTickAtSelectionEnd(); + + var key = this.song.keyChanges.findPrevious(this.cursorTick1); + + var chordKindIndex = Theory.findChordKindForDegree(key.scaleIndex, degree); + var rootMidiPitch = Theory.scales[key.scaleIndex].pitches[degree]; + + this.insertChord(chordKindIndex, rootMidiPitch, []); +} + + Editor.prototype.insertKeyChange = function(scaleIndex, tonicMidiPitch) { this.selectNone(); diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index a4d3024..66dac92 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -581,6 +581,15 @@ Editor.prototype.eventKeyDown = function(ev) break; } + // 1, 2, 3, 4, 5, 6, 7 + case 49: { this.performInsertDegreeAction(0); break; } + case 50: { this.performInsertDegreeAction(1); break; } + case 51: { this.performInsertDegreeAction(2); break; } + case 52: { this.performInsertDegreeAction(3); break; } + case 53: { this.performInsertDegreeAction(4); break; } + case 54: { this.performInsertDegreeAction(5); break; } + case 55: { this.performInsertDegreeAction(6); break; } + // S, D, G, H, J, // Z, X, C, V, B, N, M case 90: { this.performInsertPitchAction(0); break; } @@ -826,6 +835,19 @@ Editor.prototype.performInsertPitchAction = function(midiPitch) } +Editor.prototype.performInsertDegreeAction = function(degree) +{ + if (this.cursorTrack1 != this.cursorTrack2 || this.cursorTrack1 == 0) + { + this.insertNoteByDegree(degree); + } + else + { + this.insertChordByDegree(degree); + } +} + + Editor.prototype.performElementPitchChange = function(amount) { // Cap amount, in case notes would fall diff --git a/src/main.js b/src/main.js index 6f15a80..71d377a 100644 --- a/src/main.js +++ b/src/main.js @@ -186,26 +186,12 @@ function handleSelectChordKindsChange() { for (var i = 0; i < 7; i++) { - var chordPitches = []; - for (var j = 0; j < 3; j++) - { - var degree = i + j * 2; - - var nextPitch; - if (degree >= 7) - nextPitch = tonic + scale.pitches[degree % 7] + 12; - else - nextPitch = tonic + scale.pitches[degree]; - - chordPitches.push(nextPitch); - } - - var chordKindIndex = Theory.findChordKindIndex(chordPitches); + var chordKindIndex = Theory.findChordKindForDegree(g_CurrentKey.scaleIndex, i); var labelMain = document.createElement("span"); var labelSuperscript = document.createElement("sup"); - labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, chordPitches[0] - tonic, [], g_Editor.usePopularNotation); - labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, chordPitches[0] - tonic, [], g_Editor.usePopularNotation); + labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, scale.pitches[i], [], g_Editor.usePopularNotation); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, scale.pitches[i], [], g_Editor.usePopularNotation); var button = document.getElementById("buttonChord" + i); @@ -215,13 +201,13 @@ function handleSelectChordKindsChange() button.appendChild(labelMain); labelMain.appendChild(labelSuperscript); - var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, chordPitches[0] - tonic, g_Editor.usePopularNotation); + var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, scale.pitches[i], g_Editor.usePopularNotation); var degreeColor = Theory.getDegreeColor(degree); button.style.borderTop = "4px solid " + degreeColor; button.style.borderBottom = "4px solid " + degreeColor; button.chordKindIndex = chordKindIndex; - button.rootMidiPitch = chordPitches[0]; + button.rootMidiPitch = scale.pitches[i]; button.onclick = function() { g_Editor.insertChord(this.chordKindIndex, this.rootMidiPitch, []); diff --git a/src/util/theory.js b/src/util/theory.js index 80eb310..b595ea3 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -224,6 +224,28 @@ Theory.findPitchDegree = function(scaleIndex, relativePitch, usePopularNotation } +Theory.findChordKindForDegree = function(scaleIndex, degree) +{ + var scale = Theory.scales[scaleIndex]; + + var chordPitches = []; + for (var i = 0; i < 3; i++) + { + var noteDegree = degree + i * 2; + + var nextPitch; + if (noteDegree >= 7) + nextPitch = scale.pitches[noteDegree % 7] + 12; + else + nextPitch = scale.pitches[noteDegree]; + + chordPitches.push(nextPitch); + } + + return Theory.findChordKindIndex(chordPitches); +} + + Theory.findChordKindIndex = function(relativePitches) { for (var i = 0; i < Theory.chordKinds.length; i++) From 14239bd71c593dbecfc7fe422007b8285ff2f58a Mon Sep 17 00:00:00 2001 From: HertzDevil Date: Wed, 29 Mar 2017 12:12:51 +0800 Subject: [PATCH 07/44] use pitch values on the circle of fifths --- index.html | 9 ++ src/editor/editor.js | 51 +++--- src/editor/editor_interaction.js | 6 +- src/main.js | 41 ++--- src/song/chord.js | 6 +- src/song/note.js | 13 +- src/song/song.js | 4 +- src/util/theory.js | 266 +++++++++++++++---------------- 8 files changed, 201 insertions(+), 195 deletions(-) diff --git a/index.html b/index.html index 9d1c9c0..9786252 100644 --- a/index.html +++ b/index.html @@ -137,6 +137,15 @@ + +
+ + + + + + +
+
@@ -30,7 +30,7 @@
+ @@ -46,30 +46,45 @@ +
- - - - - - - - - -
- Local: - - - -
- Dropbox: - - - - -
+ + + + + + +
+ + + + + + + +
+ Local: + + + +
+ Dropbox: + + + + +
+
+ + +
+ +
+
@@ -99,8 +114,32 @@ - - + + + + + + + + + + + + +
+ + + + + + +
+ + + + + +
diff --git a/src/editor/editor.js b/src/editor/editor.js index 044b10c..b3a3ff7 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -156,7 +156,7 @@ Editor.prototype.rewind = function() } -Editor.prototype.insertNote = function(midiPitch) +Editor.prototype.insertNote = function(pitch, octave) // // // { this.cursorSetTickAtSelectionEnd(); this.sliceOverlapping(); @@ -166,14 +166,14 @@ Editor.prototype.insertNote = function(midiPitch) this.cursorTick1.clone(), this.cursorTick1.clone().add(this.newElementDuration), 0, - midiPitch, + pitch, octave, { selected: true }); this.song.notes.insert(note); this.synth.clear(); this.synth.stop(); - Theory.playSampleNote(this.synth, midiPitch); + Theory.playSampleNote(this.synth, note.getMidiPitch(), octave); this.synth.play(); this.cursorSetTrackBoth(0); @@ -184,7 +184,7 @@ Editor.prototype.insertNote = function(midiPitch) } -Editor.prototype.insertChord = function(chordKindIndex, rootMidiPitch, embelishments) +Editor.prototype.insertChord = function(chordKindIndex, rootPitch, embelishments) { this.cursorSetTickAtSelectionEnd(); this.sliceOverlapping(); @@ -194,7 +194,7 @@ Editor.prototype.insertChord = function(chordKindIndex, rootMidiPitch, embelishm this.cursorTick1.clone(), this.cursorTick1.clone().add(this.newElementDuration), chordKindIndex, - rootMidiPitch, + rootPitch, embelishments, { selected: true }); @@ -202,7 +202,7 @@ Editor.prototype.insertChord = function(chordKindIndex, rootMidiPitch, embelishm this.synth.clear(); this.synth.stop(); - Theory.playSampleChord(this.synth, chordKindIndex, rootMidiPitch, embelishments); + Theory.playSampleChord(this.synth, chordKindIndex, rootPitch, embelishments); this.synth.play(); this.cursorSetTrackBoth(1); @@ -220,7 +220,7 @@ Editor.prototype.insertNoteByDegree = function(degree) var key = this.song.keyChanges.findPrevious(this.cursorTick1); var pitch = Theory.scales[key.scaleIndex].pitches[degree]; - this.insertNote(pitch + 60); + this.insertNote(pitch, 5); // // // } @@ -231,9 +231,9 @@ Editor.prototype.insertChordByDegree = function(degree) var key = this.song.keyChanges.findPrevious(this.cursorTick1); var chordKindIndex = Theory.findChordKindForDegree(key.scaleIndex, degree); - var rootMidiPitch = Theory.scales[key.scaleIndex].pitches[degree]; + var rootPitch = Theory.getPitchForScaleInterval(key.scaleIndex, 0, degree); // // // - this.insertChord(chordKindIndex, rootMidiPitch, []); + this.insertChord(chordKindIndex, rootPitch, []); } @@ -525,8 +525,9 @@ Editor.prototype.refreshRow = function(rowTickStart, rowYStart) this.song.notes.enumerateOverlappingRange(rowTickStart, rowTickEnd, function (note) { - midiPitchMin = Math.min(note.midiPitch, midiPitchMin); - midiPitchMax = Math.max(note.midiPitch, midiPitchMax); + let midi = note.getMidiPitch(); + midiPitchMin = Math.min(midi, midiPitchMin); + midiPitchMax = Math.max(midi, midiPitchMax); }); // Check if there are any key changes in this row. @@ -655,13 +656,10 @@ Editor.prototype.refreshBlock = function( noteXStart = Math.max(noteXStart, 0); noteXEnd = Math.min(noteXEnd, block.width); - var midiPitchOffset = note.midiPitch - midiPitchMin; + var midiPitchOffset = note.getMidiPitch() - midiPitchMin; var noteYTop = block.trackNoteYEnd - (midiPitchOffset + 1) * that.noteHeight; - var noteRelativePitch = (note.midiPitch + 12 - block.key.tonicMidiPitch) % 12; - var noteDegree = Theory.findPitchDegree(block.key.scaleIndex, noteRelativePitch, that.usePopularNotation); - var noteColor = Theory.getDegreeColor(noteDegree); - var noteColorAccent = Theory.getDegreeColorAccent(noteDegree); + var noteColor = Theory.getPitchColor(block.key.scaleIndex, note.pitch, that.usePopularNotation); var noteX = block.x + noteXStart + that.noteSideMargin; var noteY = block.y + noteYTop; @@ -672,8 +670,8 @@ Editor.prototype.refreshBlock = function( "editorDegree" + (note.editorData.selected ? "Selected" : ""), "rect", { x: noteX, y: noteY, width: noteW, height: noteH }); - svgNote.style.fill = (note.editorData.selected ? noteColorAccent : noteColor); - svgNote.style.stroke = noteColor; + svgNote.style.fill = noteColor[note.editorData.selected ? 1 : 0]; + svgNote.style.stroke = noteColor[0]; block.elements.push({ note: note, x: noteX, y: noteY, width: noteW, height: noteH }); }); @@ -687,10 +685,7 @@ Editor.prototype.refreshBlock = function( chordXStart = Math.max(chordXStart, 0); chordXEnd = Math.min(chordXEnd, block.width); - var chordRelativePitch = (chord.rootMidiPitch + 12 - block.key.tonicMidiPitch) % 12; - var chordDegree = Theory.findPitchDegree(block.key.scaleIndex, chordRelativePitch, that.usePopularNotation); - var chordColor = Theory.getDegreeColor(chordDegree); - var chordColorAccent = Theory.getDegreeColorAccent(chordDegree); + var chordColor = Theory.getPitchColor(block.key.scaleIndex, chord.rootPitch, that.usePopularNotation); var chordX = block.x + chordXStart + that.chordSideMargin; var chordY = block.y + block.trackChordYStart; @@ -720,16 +715,16 @@ Editor.prototype.refreshBlock = function( height: that.chordOrnamentHeight }); - svgChordOrnament1.style.fill = (chord.editorData.selected ? chordColorAccent : chordColor); - svgChordOrnament1.style.stroke = chordColor; - svgChordOrnament2.style.fill = (chord.editorData.selected ? chordColorAccent : chordColor); - svgChordOrnament2.style.stroke = chordColor; + svgChordOrnament1.style.fill = chordColor[chord.editorData.selected ? 1 : 0]; + svgChordOrnament1.style.stroke = chordColor[0]; + svgChordOrnament2.style.fill = chordColor[chord.editorData.selected ? 1 : 0]; + svgChordOrnament2.style.stroke = chordColor[0]; // Build and add the chord label. var chordLabel = Theory.getChordLabelMain( - block.key.scaleIndex, chord.chordKindIndex, chordRelativePitch, chord.embelishments, that.usePopularNotation); + block.key.scaleIndex, chord.chordKindIndex, chord.rootPitch, chord.embelishments, that.usePopularNotation); var chordLabelSuperscript = Theory.getChordLabelSuperscript( - block.key.scaleIndex, chord.chordKindIndex, chordRelativePitch, chord.embelishments, that.usePopularNotation); + block.key.scaleIndex, chord.chordKindIndex, chord.rootPitch, chord.embelishments, that.usePopularNotation); var svgChordLabel = that.addSvgTextComplemented( "editorChordLabel", diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index 66dac92..73d1e08 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -378,7 +378,7 @@ Editor.prototype.eventMouseDown = function(ev) Theory.playSampleChord( this.synth, elementAtMouse.chord.chordKindIndex, - elementAtMouse.chord.rootMidiPitch, + elementAtMouse.chord.rootPitch, elementAtMouse.chord.embelishments); } @@ -872,7 +872,7 @@ Editor.prototype.performElementPitchChange = function(amount) var chordToSample = null; this.enumerateSelectedChords(function(chord) { - chord.rootMidiPitch = (chord.rootMidiPitch + 12 + amount) % 12; + //chord.rootMidiPitch = (chord.rootMidiPitch + 12 + amount) % 12; chordToSample = chord; }); @@ -884,7 +884,7 @@ Editor.prototype.performElementPitchChange = function(amount) Theory.playSampleChord( this.synth, chordToSample.chordKindIndex, - chordToSample.rootMidiPitch, + chordToSample.rootPitch, chordToSample.embelishments); this.refresh(); diff --git a/src/main.js b/src/main.js index 71d377a..d3807f9 100644 --- a/src/main.js +++ b/src/main.js @@ -187,13 +187,14 @@ function handleSelectChordKindsChange() for (var i = 0; i < 7; i++) { var chordKindIndex = Theory.findChordKindForDegree(g_CurrentKey.scaleIndex, i); + var pitch = Theory.getPitchForScaleInterval(g_CurrentKey.scaleIndex, 0, i); var labelMain = document.createElement("span"); var labelSuperscript = document.createElement("sup"); - labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, scale.pitches[i], [], g_Editor.usePopularNotation); - labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, scale.pitches[i], [], g_Editor.usePopularNotation); + labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); + labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); - var button = document.getElementById("buttonChord" + i); + var button = document.getElementById("buttonChord" + (i + 7)); while (button.firstChild != null) button.removeChild(button.firstChild); @@ -201,32 +202,37 @@ function handleSelectChordKindsChange() button.appendChild(labelMain); labelMain.appendChild(labelSuperscript); - var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, scale.pitches[i], g_Editor.usePopularNotation); - var degreeColor = Theory.getDegreeColor(degree); - button.style.borderTop = "4px solid " + degreeColor; - button.style.borderBottom = "4px solid " + degreeColor; + var degreeColor = Theory.getPitchColor(g_CurrentKey.scaleIndex, pitch, g_Editor.usePopularNotation); + button.style.borderTop = "4px solid " + degreeColor[0]; + button.style.borderBottom = "4px solid " + degreeColor[0]; button.chordKindIndex = chordKindIndex; - button.rootMidiPitch = scale.pitches[i]; + button.rootPitch = pitch; button.onclick = function() { - g_Editor.insertChord(this.chordKindIndex, this.rootMidiPitch, []); + g_Editor.insertChord(this.chordKindIndex, this.rootPitch, []); }; } - for (var i = 7; i < 12; i++) + for (var i = 0; i < 7; i++) { var button = document.getElementById("buttonChord" + i); button.style.visibility = "hidden"; + button = document.getElementById("buttonChord" + (i + 14)); + button.style.visibility = "hidden"; } } else { var chordKindIndex = selectedIndex - 1; - var buttonAssignment = [0, 2, 4, 5, 7, 9, 11, 1, 3, 6, 8, 10]; + var buttonAssignment = [ // // // + 7, 9, 11, 6, 8, 10, 12, + 0, 2, 4, -1, 1, 3, 5, + -7, -5, -3, -8, -6, -4, -2, + ]; - for (var i = 0; i < 12; i++) + for (var i = 0; i < buttonAssignment.length; i++) { var pitch = buttonAssignment[i]; @@ -243,18 +249,17 @@ function handleSelectChordKindsChange() button.appendChild(labelMain); labelMain.appendChild(labelSuperscript); - var degree = Theory.findPitchDegree(g_CurrentKey.scaleIndex, pitch, g_Editor.usePopularNotation); - var degreeColor = Theory.getDegreeColor(degree); - button.style.borderTop = "4px solid " + degreeColor; - button.style.borderBottom = "4px solid " + degreeColor; + var degreeColor = Theory.getPitchColor(g_CurrentKey.scaleIndex, pitch, g_Editor.usePopularNotation); + button.style.borderTop = "4px solid " + degreeColor[0]; + button.style.borderBottom = "4px solid " + degreeColor[0]; button.style.visibility = "visible"; button.chordKindIndex = chordKindIndex; - button.rootMidiPitch = (pitch + g_CurrentKey.tonicMidiPitch) % 12; + button.rootPitch = (pitch + g_CurrentKey.tonicMidiPitch) % 12; button.onclick = function() { - g_Editor.insertChord(this.chordKindIndex, this.rootMidiPitch, []); + g_Editor.insertChord(this.chordKindIndex, this.rootPitch, []); }; } } diff --git a/src/song/chord.js b/src/song/chord.js index 61ddb9c..37549ba 100644 --- a/src/song/chord.js +++ b/src/song/chord.js @@ -1,9 +1,9 @@ -function SongChord(startTick, endTick, chordKindIndex, rootMidiPitch, embelishments, editorData = null) +function SongChord(startTick, endTick, chordKindIndex, rootPitch, embelishments, editorData = null) { this.startTick = startTick; this.endTick = endTick; this.chordKindIndex = chordKindIndex; - this.rootMidiPitch = rootMidiPitch; + this.rootPitch = rootPitch; this.embelishments = embelishments; this.editorData = editorData; } @@ -15,6 +15,6 @@ SongChord.prototype.clone = function() this.startTick.clone(), this.endTick.clone(), this.chordKindIndex, - this.rootMidiPitch, + this.rootPitch, this.embelishments); } \ No newline at end of file diff --git a/src/song/note.js b/src/song/note.js index d586748..3c663a9 100644 --- a/src/song/note.js +++ b/src/song/note.js @@ -1,14 +1,21 @@ -function SongNote(startTick, endTick, trackIndex, midiPitch, editorData = null) +function SongNote(startTick, endTick, trackIndex, pitch, octave, editorData = null) { this.startTick = startTick; this.endTick = endTick; this.trackIndex = trackIndex; - this.midiPitch = midiPitch; + this.pitch = pitch; this.editorData = editorData; + this.octave = octave; // // // +} + + +SongNote.prototype.getMidiPitch = function() +{ + return this.octave * 12 + Theory.getSemitones(this.pitch); } SongNote.prototype.clone = function() { - return new SongNote(this.startTick.clone(), this.endTick.clone(), this.trackIndex, this.midiPitch); + return new SongNote(this.startTick.clone(), this.endTick.clone(), this.trackIndex, this.pitch, this.octave); } \ No newline at end of file diff --git a/src/song/song.js b/src/song/song.js index 178e504..5797843 100644 --- a/src/song/song.js +++ b/src/song/song.js @@ -79,7 +79,7 @@ Song.prototype.feedSynth = function(synth, startTick) return; var pitches = Theory.calculateChordPitches( - chord.chordKindIndex, chord.rootMidiPitch, chord.embelishments); + chord.chordKindIndex, chord.rootPitch, chord.embelishments); for (var j = 0; j < pitches.length; j++) { @@ -140,7 +140,7 @@ Song.prototype.save = function() json += "[ " + chord.startTick.toString() + ", "; json += chord.endTick.toString() + ", "; json += chord.chordKindIndex.toString() + ", "; - json += chord.rootMidiPitch.toString() + ", "; + json += chord.rootPitch.toString() + ", "; json += "[] ]";//chord.embelishments.toString() + " ]"; if (i < this.chords.items.length - 1) diff --git a/src/util/theory.js b/src/util/theory.js index b595ea3..5204c4a 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -1,15 +1,16 @@ var Theory = {}; +// // // Theory.scales = [ - { pitches: [0, 2, 4, 5, 7, 9, 11], name: "Major" }, - { pitches: [0, 2, 3, 5, 7, 9, 10], name: "Dorian" }, - { pitches: [0, 1, 3, 5, 7, 8, 10], name: "Phrygian" }, - { pitches: [0, 2, 4, 6, 7, 9, 11], name: "Lydian" }, - { pitches: [0, 2, 4, 5, 7, 9, 10], name: "Mixolydian" }, - { pitches: [0, 2, 3, 5, 7, 8, 10], name: "Natural Minor" }, - { pitches: [0, 1, 3, 5, 6, 8, 10], name: "Locrian" } + { pitches: [ 0, 2, 4, -1, 1, 3, 5], name: "Major" }, + { pitches: [ 2, 4, -1, 1, 3, 5, 0], name: "Dorian" }, + { pitches: [ 4, -1, 1, 3, 5, 0, 2], name: "Phrygian" }, + { pitches: [-1, 1, 3, 5, 0, 2, 4], name: "Lydian" }, + { pitches: [ 1, 3, 5, 0, 2, 4, -1], name: "Mixolydian" }, + { pitches: [ 3, 5, 0, 2, 4, -1, 1], name: "Natural Minor" }, + { pitches: [ 5, 0, 2, 4, -1, 1, 3], name: "Locrian" } ]; @@ -26,43 +27,46 @@ Theory.meterDenominators = ]; +// // // Theory.chordKinds = [ /* `code` is what the compiler expects to parse. `symbol` dictates roman numeral analysis representation as follows: [isLowercase, complement, superscriptComplement] + // // // + `ext` indicates the upper structure index */ - { pitches: [0, 4, 7], code: "", symbol: [false, "", "" ], name: "Major", startGroup: "Triads" }, - { pitches: [0, 3, 7], code: "m", symbol: [true, "", "" ], name: "Minor" }, - { pitches: [0, 4, 8], code: "+", symbol: [false, "+", "" ], name: "Augmented" }, - { pitches: [0, 3, 6], code: "o", symbol: [true, "", "o"], name: "Diminished" }, + { pitches: [0, 4, 1], code: "", symbol: [false, "", "" ], name: "Major", startGroup: "Triads" }, + { pitches: [0, -3, 1], code: "m", symbol: [true, "", "" ], name: "Minor" }, + { pitches: [0, 4, 8], code: "+", symbol: [false, "+", "" ], name: "Augmented" }, + { pitches: [0, -3, -6], code: "o", symbol: [true, "", "o"], name: "Diminished" }, - { pitches: [0, 0, 7, 12], code: "5", symbol: [false, "", "5"], name: "Power" }, + { pitches: [0, 0, 1, 0], code: "5", symbol: [false, "", "5"], name: "Power", ext: 3 }, - { pitches: [0, 4, 7, 9], code: "6", symbol: [false, "", "6"], name: "Major Sixth", startGroup: "Sixths" }, - { pitches: [0, 3, 7, 9], code: "m6", symbol: [true, "", "6"], name: "Minor Sixth" }, + { pitches: [0, 4, 1, 3], code: "6", symbol: [false, "", "6"], name: "Major Sixth", startGroup: "Sixths" }, + { pitches: [0, -3, 1, 3], code: "m6", symbol: [true, "", "6"], name: "Minor Sixth" }, - { pitches: [0, 4, 7, 10], code: "7", symbol: [false, "", "7"], name: "Dominant Seventh", startGroup: "Sevenths" }, - { pitches: [0, 4, 7, 11], code: "maj7", symbol: [false, "", "M7"], name: "Major Seventh" }, - { pitches: [0, 3, 7, 10], code: "m7", symbol: [true, "", "7"], name: "Minor Seventh" }, - { pitches: [0, 3, 7, 11], code: "mmaj7", symbol: [true, "", "M7"], name: "Minor-Major Seventh" }, - { pitches: [0, 4, 8, 10], code: "+7", symbol: [false, "+", "7"], name: "Augmented Seventh" }, - { pitches: [0, 4, 8, 11], code: "+maj7", symbol: [false, "+", "M7"], name: "Augmented Major Seventh" }, - { pitches: [0, 3, 6, 9], code: "o7", symbol: [true, "", "o7"], name: "Diminished Seventh" }, - { pitches: [0, 3, 6, 10], code: "%7", symbol: [true, "", "ø7"], name: "Half-Diminished Seventh" }, + { pitches: [0, 4, 1, -2], code: "7", symbol: [false, "", "7"], name: "Dominant Seventh", startGroup: "Sevenths" }, + { pitches: [0, 4, 1, 5], code: "maj7", symbol: [false, "", "M7"], name: "Major Seventh" }, + { pitches: [0, -3, 1, -2], code: "m7", symbol: [true, "", "7"], name: "Minor Seventh" }, + { pitches: [0, -3, 1, 5], code: "mmaj7", symbol: [true, "", "M7"], name: "Minor-Major Seventh" }, + { pitches: [0, 4, 8, -2], code: "+7", symbol: [false, "+", "7"], name: "Augmented Seventh" }, + { pitches: [0, 4, 8, 5], code: "+maj7", symbol: [false, "+", "M7"], name: "Augmented Major Seventh" }, + { pitches: [0, -3, -6, -9], code: "o7", symbol: [true, "", "o7"], name: "Diminished Seventh" }, + { pitches: [0, -3, -6, -2], code: "%7", symbol: [true, "", "ø7"], name: "Half-Diminished Seventh" }, - { pitches: [0, 4, 7, 10, 14], code: "9", symbol: [false, "", "9"], name: "Dominant Ninth", startGroup: "Ninths" }, - { pitches: [0, 4, 7, 11, 14], code: "maj9", symbol: [false, "", "M9"], name: "Major Ninth" }, - { pitches: [0, 3, 7, 10, 14], code: "m9", symbol: [true, "", "9"], name: "Minor Ninth" }, - { pitches: [0, 3, 7, 11, 14], code: "mmaj9", symbol: [true, "", "M9"], name: "Minor-Major Ninth" }, - { pitches: [0, 4, 8, 10, 14], code: "+9", symbol: [false, "+", "9"], name: "Augmented Ninth" }, - { pitches: [0, 4, 8, 11, 14], code: "+maj9", symbol: [false, "+", "M9"], name: "Augmented Major Ninth" }, - { pitches: [0, 3, 6, 9, 14], code: "o9", symbol: [true, "", "o9"], name: "Diminished Ninth" }, - { pitches: [0, 3, 6, 9, 13], code: "ob9", symbol: [true, "", "o♭9"], name: "Diminished Minor Ninth" }, - { pitches: [0, 3, 6, 10, 14], code: "%9", symbol: [true, "", "ø9"], name: "Half-Diminished Ninth" }, - { pitches: [0, 3, 6, 10, 13], code: "%b9", symbol: [true, "", "ø♭9"], name: "Half-Diminished Minor Ninth" } + { pitches: [0, 4, 1, -2, 2], code: "9", symbol: [false, "", "9"], name: "Dominant Ninth", ext: 4, startGroup: "Ninths" }, + { pitches: [0, 4, 1, 5, 2], code: "maj9", symbol: [false, "", "M9"], name: "Major Ninth", ext: 4 }, + { pitches: [0, -3, 1, -2, 2], code: "m9", symbol: [true, "", "9"], name: "Minor Ninth", ext: 4 }, + { pitches: [0, -3, 1, 5, 2], code: "mmaj9", symbol: [true, "", "M9"], name: "Minor-Major Ninth", ext: 4 }, + { pitches: [0, 4, 8, -2, 2], code: "+9", symbol: [false, "+", "9"], name: "Augmented Ninth", ext: 4 }, + { pitches: [0, 4, 8, 5, 2], code: "+maj9", symbol: [false, "+", "M9"], name: "Augmented Major Ninth", ext: 4 }, + { pitches: [0, -3, -6, -9, 2], code: "o9", symbol: [true, "", "o9"], name: "Diminished Ninth", ext: 4 }, + { pitches: [0, -3, -6, -9, -5], code: "ob9", symbol: [true, "", "o♭9"], name: "Diminished Minor Ninth", ext: 4 }, + { pitches: [0, -3, -6, -2, 2], code: "%9", symbol: [true, "", "ø9"], name: "Half-Diminished Ninth", ext: 4 }, + { pitches: [0, -3, -6, -2, -5], code: "%b9", symbol: [true, "", "ø♭9"], name: "Half-Diminished Minor Ninth", ext: 4 } ]; @@ -103,53 +107,81 @@ Theory.isValidMeterDenominator = function(denominator) } +// // // +Theory.getScaleDegree = function(pitch) +{ + return mod(pitch * 4, 7); // zero-based +} + + +Theory.getSharps = function(scaleIndex, pitch, usePopularNotation = true) +{ + if (!usePopularNotation) + { + var degree = Theory.getScaleDegree(pitch); + pitch -= Theory.getPitchForScaleInterval(scaleIndex, 0, degree); + } + return Math.floor((pitch + 1) / 7); +} + + +Theory.getSemitones = function(pitch) +{ + return mod(pitch * 7, 12); +} + + +Theory.getPitchForScaleInterval = function(scaleIndex, degreeLo, degreeHi) +{ + const pitches = Theory.scales[scaleIndex].pitches; + return pitches[mod(degreeHi, pitches.length)] - pitches[mod(degreeLo, pitches.length)]; +} + + +Theory.getAccidentalString = function(offset) +{ + if (offset > 0) + return ("♯").repeat(offset); + if (offset < 0) + return ("♭").repeat(-offset); + return ""; +} + + Theory.getMeterLabel = function(numerator, denominator) { return "" + numerator + " / " + denominator; } -Theory.getIndependentPitchLabel = function(midiPitch) +Theory.getIndependentPitchLabel = function(pitch) { - var labels = ["C", "C♯/D♭", "D", "D♯/E♭", "E", "F", "F♯/G♭", "G", "G♯/A♭", "A", "A♯/B♭", "B"]; - return labels[midiPitch % 12]; + // // // + const labels = ["C", "D", "E", "F", "G", "A", "B"]; + return labels[Theory.getScaleDegree(pitch)] + Theory.getAccidentalString(Theory.getSharps(0, pitch)); } -Theory.getKeyLabel = function(scaleIndex, tonicMidiPitch) +// // // +Theory.getKeyLabel = function(scaleIndex, pitch) { // TODO: Take scale into consideration. - var labels = ["C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"]; - return labels[tonicMidiPitch % 12] + " " + Theory.scales[scaleIndex].name; + return Theory.getIndependentPitchLabel(pitch) + " " + Theory.scales[scaleIndex].name; } -Theory.getChordRootLabel = function(scaleIndex, relativePitch, usePopularNotation = true) +Theory.getChordRootLabel = function(scaleIndex, pitch, usePopularNotation = true) { - if (usePopularNotation) - { - var labels = ["I", "♭II", "II", "♭III", "III", "IV", "♭V", "V", "♭VI", "VI", "♭VII", "VII"]; - return labels[relativePitch % 12]; - } - else - { - // FIXME: Compute correct Common Practice labels. - var labels = ["I", "II", "III", "IV", "V", "VI", "VII", "I"]; - - var degree = Theory.findPitchDegree(scaleIndex, relativePitch, false); - var degreeInteger = Math.floor(degree); - - if (degree == degreeInteger) - return labels[degreeInteger]; - else - return "♭" + labels[degreeInteger + 1]; - } + const labels = ["I", "II", "III", "IV", "V", "VI", "VII"]; + const name = labels[Theory.getScaleDegree(pitch)]; + const acc = Theory.getSharps(scaleIndex, pitch, usePopularNotation); + return Theory.getAccidentalString(acc) + name; } -Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, relativePitch, embelishments, usePopularNotation = true) +Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, pitch, embelishments, usePopularNotation = true) { - var rootLabel = Theory.getChordRootLabel(scaleIndex, relativePitch, usePopularNotation); + var rootLabel = Theory.getChordRootLabel(scaleIndex, pitch, usePopularNotation); if (Theory.chordKinds[chordKindIndex].symbol[0]) rootLabel = rootLabel.toLowerCase(); @@ -158,23 +190,28 @@ Theory.getChordLabelMain = function(scaleIndex, chordKindIndex, relativePitch, e } -Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, relativePitch, embelishments, usePopularNotation = true) +Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, pitch, embelishments, usePopularNotation = true) { return Theory.chordKinds[chordKindIndex].symbol[2]; } -Theory.calculateChordPitches = function(chordKindIndex, rootMidiPitch, embelishments) +Theory.calculateChordPitches = function(chordKindIndex, rootPitch, embelishments) { var pitches = []; + let chord = Theory.chordKinds[chordKindIndex]; var octave = 12 * 4; + let rootMidiPitch = Theory.getSemitones(rootPitch); // // // if (rootMidiPitch >= 6) - octave = 12 * 3; + octave -= 12; - for (var i = 0; i < Theory.chordKinds[chordKindIndex].pitches.length; i++) + for (var i = 0; i < chord.pitches.length; i++) { - pitches.push(octave + rootMidiPitch + Theory.chordKinds[chordKindIndex].pitches[i]); + if (i == chord.ext) + octave += 12; + let pitch = chord.pitches[i]; + pitches.push(octave + rootMidiPitch + Theory.getSemitones(pitch)); } return pitches; @@ -205,41 +242,14 @@ Theory.getChordStackPattern = function(meter) }*/ -Theory.findPitchDegree = function(scaleIndex, relativePitch, usePopularNotation = true) -{ - var scale = Theory.scales[scaleIndex]; - if (usePopularNotation) - scale = Theory.scales[0]; - - for (var i = 0; i < scale.pitches.length; i++) - { - if (relativePitch == scale.pitches[i]) - return i; - - if (relativePitch < scale.pitches[i]) - return (i + 7 - 0.5) % 7; - } - - return 6.5; -} - - Theory.findChordKindForDegree = function(scaleIndex, degree) { - var scale = Theory.scales[scaleIndex]; + var scale = Theory.scales[scaleIndex].pitches; var chordPitches = []; for (var i = 0; i < 3; i++) { - var noteDegree = degree + i * 2; - - var nextPitch; - if (noteDegree >= 7) - nextPitch = scale.pitches[noteDegree % 7] + 12; - else - nextPitch = scale.pitches[noteDegree]; - - chordPitches.push(nextPitch); + chordPitches.push(scale[mod(degree + i * 2, scale.length)]); // // // } return Theory.findChordKindIndex(chordPitches); @@ -258,8 +268,10 @@ Theory.findChordKindIndex = function(relativePitches) var match = true; for (var j = 0; j < relativePitches.length; j++) { - if (relativePitches[j] - relativePitches[0] != chordKind.pitches[j]) + if (relativePitches[j] - relativePitches[0] != chordKind.pitches[j] - chordKind.pitches[0]) { match = false; + break; + } } if (match) @@ -280,12 +292,12 @@ Theory.playSampleNote = function(synth, midiPitch) } -Theory.playSampleChord = function(synth, chordKindIndex, rootMidiPitch, embelishments) +Theory.playSampleChord = function(synth, chordKindIndex, rootPitch, embelishments) { synth.clear(); synth.stop(); - var pitches = Theory.calculateChordPitches(chordKindIndex, rootMidiPitch, embelishments); + var pitches = Theory.calculateChordPitches(chordKindIndex, rootPitch, embelishments); for (var j = 0; j < pitches.length; j++) { @@ -297,51 +309,29 @@ Theory.playSampleChord = function(synth, chordKindIndex, rootMidiPitch, embelish } -Theory.getDegreeColor = function(degree) +// // // +Theory.getPitchColor = function(scaleIndex, pitch, usePopularNotation = true) { - switch (degree) + let step = Theory.getScaleDegree(pitch) * 2 + Math.sign(Theory.getSharps(scaleIndex, pitch, usePopularNotation)); + switch (step) { - case 0: return "#f00"; - case 1: return "#f80"; - case 2: return "#fd0"; - case 3: return "#0d0"; - case 4: return "#00f"; - case 5: return "#80f"; - case 6: return "#f0f"; + case 0: return ["#f00", "#fdd"]; + case 2: return ["#f80", "#fed"]; + case 4: return ["#fd0", "#fed"]; + case 6: return ["#0d0", "#dfd"]; + case 8: return ["#00f", "#ddf"]; + case 10: return ["#80f", "#edf"]; + case 12: return ["#f0f", "#fdf"]; - case 0.5: return "#800"; - case 1.5: return "#840"; - case 2.5: return "#860"; - case 3.5: return "#060"; - case 4.5: return "#008"; - case 5.5: return "#408"; - case 6.5: return "#808"; + case 1: return ["#800", "#fdd"]; + case 3: return ["#840", "#fed"]; + case 5: return ["#860", "#fed"]; + case 7: return ["#060", "#dfd"]; + case 9: return ["#008", "#ddf"]; + case 11: return ["#408", "#edf"]; + case -1: + case 13: return ["#808", "#fdf"]; - default: return "#888"; + default: return ["#888", "#eee"]; } } - - -Theory.getDegreeColorAccent = function(degree) -{ - switch (degree) - { - case 0: return "#fdd"; - case 1: return "#fed"; - case 2: return "#fed"; - case 3: return "#dfd"; - case 4: return "#ddf"; - case 5: return "#edf"; - case 6: return "#fdf"; - - case 0.5: return "#fdd"; - case 1.5: return "#fed"; - case 2.5: return "#fed"; - case 3.5: return "#dfd"; - case 4.5: return "#ddf"; - case 5.5: return "#edf"; - case 6.5: return "#fdf"; - - default: return "#eee"; - } -} \ No newline at end of file From 5c47949b4ef7ed9b36f57e4dad58cfc9ba524c48 Mon Sep 17 00:00:00 2001 From: HertzDevil Date: Wed, 29 Mar 2017 13:25:44 +0800 Subject: [PATCH 08/44] input chords in current key, allow note movement --- src/editor/editor.js | 14 ++++++++------ src/editor/editor_interaction.js | 31 +++++++++++++++++-------------- src/main.js | 13 +++++++------ src/song/key.js | 14 +++++++------- src/song/song.js | 8 ++++---- src/synth/synth.js | 4 ++++ src/util/theory.js | 28 ++++++++++++++++++++++++++++ 7 files changed, 75 insertions(+), 37 deletions(-) diff --git a/src/editor/editor.js b/src/editor/editor.js index b3a3ff7..9ac98e0 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -233,16 +233,16 @@ Editor.prototype.insertChordByDegree = function(degree) var chordKindIndex = Theory.findChordKindForDegree(key.scaleIndex, degree); var rootPitch = Theory.getPitchForScaleInterval(key.scaleIndex, 0, degree); // // // - this.insertChord(chordKindIndex, rootPitch, []); + this.insertChord(chordKindIndex, rootPitch + key.tonicPitch, []); } -Editor.prototype.insertKeyChange = function(scaleIndex, tonicMidiPitch) +Editor.prototype.insertKeyChange = function(scaleIndex, tonicPitch) { this.selectNone(); this.eraseKeyChangesAt(this.cursorTick1, this.cursorTick1); this.song.keyChanges.insert( - new SongKeyChange(this.cursorTick1.clone(), scaleIndex, tonicMidiPitch, { selected: true })); + new SongKeyChange(this.cursorTick1.clone(), scaleIndex, tonicPitch, { selected: true })); this.cursorSetTickBoth(this.cursorTick1.clone().min(this.cursorTick2)); this.refresh(); } @@ -681,11 +681,13 @@ Editor.prototype.refreshBlock = function( { var chordXStart = chord.startTick.clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; var chordXEnd = chord.endTick .clone().subtract(block.tickStart).asFloat() * that.wholeTickWidth; + + let pitch = chord.rootPitch - block.key.tonicPitch; chordXStart = Math.max(chordXStart, 0); chordXEnd = Math.min(chordXEnd, block.width); - var chordColor = Theory.getPitchColor(block.key.scaleIndex, chord.rootPitch, that.usePopularNotation); + var chordColor = Theory.getPitchColor(block.key.scaleIndex, pitch, that.usePopularNotation); var chordX = block.x + chordXStart + that.chordSideMargin; var chordY = block.y + block.trackChordYStart; @@ -722,9 +724,9 @@ Editor.prototype.refreshBlock = function( // Build and add the chord label. var chordLabel = Theory.getChordLabelMain( - block.key.scaleIndex, chord.chordKindIndex, chord.rootPitch, chord.embelishments, that.usePopularNotation); + block.key.scaleIndex, chord.chordKindIndex, pitch, chord.embelishments, that.usePopularNotation); var chordLabelSuperscript = Theory.getChordLabelSuperscript( - block.key.scaleIndex, chord.chordKindIndex, chord.rootPitch, chord.embelishments, that.usePopularNotation); + block.key.scaleIndex, chord.chordKindIndex, pitch, chord.embelishments, that.usePopularNotation); var svgChordLabel = that.addSvgTextComplemented( "editorChordLabel", diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index 73d1e08..2fcccfc 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -369,7 +369,7 @@ Editor.prototype.eventMouseDown = function(ev) if (elementAtMouse.note != undefined) { elementAtMouse.note.editorData.selected = !elementAtMouse.note.editorData.selected; - Theory.playSampleNote(this.synth, elementAtMouse.note.midiPitch); + Theory.playSampleNote(this.synth, elementAtMouse.note.getMidiPitch()); } else if (elementAtMouse.chord != undefined) @@ -850,22 +850,25 @@ Editor.prototype.performInsertDegreeAction = function(degree) Editor.prototype.performElementPitchChange = function(amount) { + var that = this; + // Cap amount, in case notes would fall // out of bounds. - this.enumerateSelectedNotes(function(note) - { - if (note.midiPitch + amount > Theory.midiPitchMax) - amount = Theory.midiPitchMax - note.midiPitch; - - else if (note.midiPitch + amount < Theory.midiPitchMin) - amount = Theory.midiPitchMin - note.midiPitch; - }); - // Apply changes to elements. var noteToSample = null; this.enumerateSelectedNotes(function(note) { - note.midiPitch += amount; + let midiPitch = note.getMidiPitch(); + midiPitch += amount; + if (midiPitch > Theory.midiPitchMax) + midiPitch = Theory.midiPitchMax; + else if (midiPitch < Theory.midiPitchMin) + midiPitch = Theory.midiPitchMin; + + let block = that.getBlockAtTick(note.startTick); + + note.octave = Math.floor(midiPitch / 12); + note.pitch = Theory.findPitchForSemitones(block.key.tonicPitch, block.key.scaleIndex, mod(midiPitch, 12), amount < 0); noteToSample = note; }); @@ -878,7 +881,7 @@ Editor.prototype.performElementPitchChange = function(amount) // Play sample. if (noteToSample != null && chordToSample == null) - Theory.playSampleNote(this.synth, noteToSample.midiPitch); + Theory.playSampleNote(this.synth, noteToSample.getMidiPitch()); if (chordToSample != null && noteToSample == null) Theory.playSampleChord( @@ -1028,7 +1031,7 @@ Editor.prototype.sliceOverlapping = function() this.eraseNotesAt( selectedNotes[i].startTick, selectedNotes[i].endTick, - selectedNotes[i].midiPitch); + selectedNotes[i].getMidiPitch()); for (var i = 0; i < selectedChords.length; i++) this.eraseChordsAt( @@ -1068,7 +1071,7 @@ Editor.prototype.eraseNotesAt = function(start, end, atMidiPitch = null) start, end, function (note) { - if (atMidiPitch != null && atMidiPitch != note.midiPitch) + if (atMidiPitch != null && atMidiPitch != note.getMidiPitch()) return; overlappingNotes.push(note); diff --git a/src/main.js b/src/main.js index d3807f9..e49ce6c 100644 --- a/src/main.js +++ b/src/main.js @@ -52,12 +52,13 @@ function refreshMainTabs() function refreshSelectBoxes() { var selectKeyPitch = document.getElementById("selectKeyPitch"); - for (var i = 0; i < 12; i++) + for (var i = -8; i <= 8; i++) { var option = document.createElement("option"); option.innerHTML = Theory.getIndependentPitchLabel(i); selectKeyPitch.appendChild(option); } + selectKeyPitch.selectedIndex = 8; var selectKeyScale = document.getElementById("selectKeyScale"); for (var i = 0; i < Theory.scales.length; i++) @@ -158,7 +159,7 @@ function handleInputTempo() function handleButtonInsertKeyChange() { - var pitch = document.getElementById("selectKeyPitch").selectedIndex; + var pitch = document.getElementById("selectKeyPitch").selectedIndex - 8; var scaleIndex = document.getElementById("selectKeyScale").selectedIndex; g_Editor.insertKeyChange(scaleIndex, pitch); } @@ -178,7 +179,7 @@ function handleSelectChordKindsChange() { var selectedIndex = document.getElementById("selectChordKinds").selectedIndex; - var tonic = g_CurrentKey.tonicMidiPitch; + var tonic = g_CurrentKey.tonicPitch; var scale = Theory.scales[g_CurrentKey.scaleIndex]; // In Key @@ -210,7 +211,7 @@ function handleSelectChordKindsChange() button.rootPitch = pitch; button.onclick = function() { - g_Editor.insertChord(this.chordKindIndex, this.rootPitch, []); + g_Editor.insertChord(this.chordKindIndex, this.rootPitch + g_CurrentKey.tonicPitch, []); }; } @@ -256,10 +257,10 @@ function handleSelectChordKindsChange() button.style.visibility = "visible"; button.chordKindIndex = chordKindIndex; - button.rootPitch = (pitch + g_CurrentKey.tonicMidiPitch) % 12; + button.rootPitch = pitch; button.onclick = function() { - g_Editor.insertChord(this.chordKindIndex, this.rootPitch, []); + g_Editor.insertChord(this.chordKindIndex, this.rootPitch + g_CurrentKey.tonicPitch, []); }; } } diff --git a/src/song/key.js b/src/song/key.js index dc55bd3..cc3654a 100644 --- a/src/song/key.js +++ b/src/song/key.js @@ -1,9 +1,9 @@ -function SongKeyChange(tick, scaleIndex, tonicMidiPitch, editorData = null) +function SongKeyChange(tick, scaleIndex, tonicPitch, editorData = null) { - this.tick = tick; - this.scaleIndex = scaleIndex; - this.tonicMidiPitch = tonicMidiPitch; - this.editorData = editorData; + this.tick = tick; + this.scaleIndex = scaleIndex; + this.tonicPitch = tonicPitch; + this.editorData = editorData; } @@ -12,11 +12,11 @@ SongKeyChange.prototype.clone = function() return new SongKeyChange( this.tick.clone(), this.scaleIndex, - this.tonicMidiPitch); + this.tonicPitch); } SongKeyChange.prototype.getLabel = function() { - return Theory.getKeyLabel(this.scaleIndex, this.tonicMidiPitch); + return Theory.getKeyLabel(this.scaleIndex, this.tonicPitch); } \ No newline at end of file diff --git a/src/song/song.js b/src/song/song.js index 5797843..e50fd11 100644 --- a/src/song/song.js +++ b/src/song/song.js @@ -68,8 +68,8 @@ Song.prototype.feedSynth = function(synth, startTick) var timeStart = offsetStart.asFloat() * (1000 / that.bpm / 4); var timeEnd = offsetEnd.asFloat() * (1000 / that.bpm / 4); - synth.addNoteOn(timeStart, 0, note.midiPitch, 1); - synth.addNoteOff(timeEnd - 0.01, 0, note.midiPitch); + synth.addNoteOn(timeStart, 0, note.getMidiPitch(), 1); + synth.addNoteOff(timeEnd - 0.01, 0, note.getMidiPitch()); }); // Register chords. @@ -121,7 +121,7 @@ Song.prototype.save = function() json += "[ " + note.startTick.toString() + ", "; json += note.endTick.toString() + ", "; json += note.trackIndex.toString() + ", "; - json += note.midiPitch.toString() + " ]"; + json += note.pitch.toString() + " ]"; if (i < this.notes.items.length - 1) json += ","; @@ -159,7 +159,7 @@ Song.prototype.save = function() json += " "; json += "[ " + keyCh.tick.toString() + ", "; json += keyCh.scaleIndex.toString() + ", "; - json += keyCh.tonicMidiPitch.toString() + " ]"; + json += keyCh.tonicPitch.toString() + " ]"; if (i < this.keyChanges.items.length - 1) json += ","; diff --git a/src/synth/synth.js b/src/synth/synth.js index 98ce44d..566ba1d 100644 --- a/src/synth/synth.js +++ b/src/synth/synth.js @@ -132,6 +132,8 @@ Synth.prototype.process = function(deltaTime) Synth.prototype.addNoteOn = function(time, instrumentIndex, midiPitch, volume) { + if (midiPitch == undefined) + throw new Error("Unknown MIDI pitch"); this.noteOnEvents.push({ time: time + this.time, instrumentIndex: instrumentIndex, @@ -163,6 +165,8 @@ Synth.prototype.sortEvents = function() Synth.prototype.voiceStart = function(instrumentIndex, midiPitch, volume) { + if (midiPitch == undefined) + throw new Error("Unknown MIDI pitch"); for (var i = this.voices.length - 1; i >= 0; i--) { var otherVoice = this.voices[i]; diff --git a/src/util/theory.js b/src/util/theory.js index 5204c4a..251f754 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -282,6 +282,14 @@ Theory.findChordKindIndex = function(relativePitches) } +Theory.findPitchForSemitones = function(keyPitch, scaleIndex, semitones, downward) +{ + let scale = Theory.scales[scaleIndex]; + let table = downward ? scale.midi.down : scale.midi.up; + return table[mod(semitones - Theory.getSemitones(keyPitch), 12)] + keyPitch; +} + + Theory.playSampleNote = function(synth, midiPitch) { synth.clear(); @@ -335,3 +343,23 @@ Theory.getPitchColor = function(scaleIndex, pitch, usePopularNotation = true) default: return ["#888", "#eee"]; } } + + +for (let i = 0; i < Theory.scales.length; i++) +{ + let scale = Theory.scales[i]; + scale.midi = { up: [], down: [] }; + for (let j = 0; j < scale.pitches.length; j++) + { + let semitones = Theory.getSemitones(scale.pitches[j]); + scale.midi.up[semitones] = scale.pitches[j]; + scale.midi.down[semitones] = scale.pitches[j]; + } + for (let s = 0; s < 12; s++) + { + if (scale.midi.up[s] == undefined) + scale.midi.up[s] = scale.midi.up[mod(s - 1, 12)] + 7; + if (scale.midi.down[s] == undefined) + scale.midi.down[s] = scale.midi.down[mod(s + 1, 12)] - 7; + } +} From 238119119caaececedd48532f3a23c3df082531a Mon Sep 17 00:00:00 2001 From: HertzDevil Date: Wed, 29 Mar 2017 13:53:41 +0800 Subject: [PATCH 09/44] approximation to my 5-note voicing algorithm --- src/util/theory.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/util/theory.js b/src/util/theory.js index 251f754..28c117f 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -198,7 +198,6 @@ Theory.getChordLabelSuperscript = function(scaleIndex, chordKindIndex, pitch, em Theory.calculateChordPitches = function(chordKindIndex, rootPitch, embelishments) { - var pitches = []; let chord = Theory.chordKinds[chordKindIndex]; var octave = 12 * 4; @@ -206,14 +205,30 @@ Theory.calculateChordPitches = function(chordKindIndex, rootPitch, embelishments if (rootMidiPitch >= 6) octave -= 12; - for (var i = 0; i < chord.pitches.length; i++) + let pitches = []; + for (let i = 1; i < chord.pitches.length; i++) { - if (i == chord.ext) - octave += 12; let pitch = chord.pitches[i]; - pitches.push(octave + rootMidiPitch + Theory.getSemitones(pitch)); + pitches.push(Theory.getSemitones(rootPitch + pitch)); + } + if (chord.pitches.length <= 3) + pitches.push(Theory.getSemitones(rootPitch + chord.pitches[0])); + pitches = pitches.sort(function (x, y) { return x > y; }); + + let sum = pitches.reduce(function (x, y) { return x + y; }) / pitches.length; + while (sum < 60) + { + let x = pitches.shift(); + pitches.push(x + 12); + sum += 12 / pitches.length; } + if (pitches.length >= 4) + { + pitches[0] += 12; + pitches[3] -= 12; + } + pitches.unshift(octave + rootMidiPitch); return pitches; } From d55cf34b69543c54a792d752545ee4d222f96c99 Mon Sep 17 00:00:00 2001 From: HertzDevil Date: Wed, 29 Mar 2017 14:00:27 +0800 Subject: [PATCH 10/44] accessing diatonic 7th/9th chords --- src/editor/editor.js | 2 +- src/editor/editor_interaction.js | 2 +- src/main.js | 19 +++++++------------ src/util/theory.js | 10 +++++++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/editor/editor.js b/src/editor/editor.js index 9ac98e0..b86fd39 100644 --- a/src/editor/editor.js +++ b/src/editor/editor.js @@ -230,7 +230,7 @@ Editor.prototype.insertChordByDegree = function(degree) var key = this.song.keyChanges.findPrevious(this.cursorTick1); - var chordKindIndex = Theory.findChordKindForDegree(key.scaleIndex, degree); + var chordKindIndex = Theory.findChordKindForDegree(key.scaleIndex, degree, 3); var rootPitch = Theory.getPitchForScaleInterval(key.scaleIndex, 0, degree); // // // this.insertChord(chordKindIndex, rootPitch + key.tonicPitch, []); diff --git a/src/editor/editor_interaction.js b/src/editor/editor_interaction.js index 2fcccfc..611c4f5 100644 --- a/src/editor/editor_interaction.js +++ b/src/editor/editor_interaction.js @@ -843,7 +843,7 @@ Editor.prototype.performInsertDegreeAction = function(degree) } else { - this.insertChordByDegree(degree); + this.insertChordByDegree(degree, 3); } } diff --git a/src/main.js b/src/main.js index e49ce6c..4accf84 100644 --- a/src/main.js +++ b/src/main.js @@ -185,17 +185,20 @@ function handleSelectChordKindsChange() // In Key if (selectedIndex == 0) { - for (var i = 0; i < 7; i++) + for (var i = 0; i < 21; i++) { - var chordKindIndex = Theory.findChordKindForDegree(g_CurrentKey.scaleIndex, i); - var pitch = Theory.getPitchForScaleInterval(g_CurrentKey.scaleIndex, 0, i); + let degree = i % 7; + let count = 3 + Math.floor(i / 7); + + var chordKindIndex = Theory.findChordKindForDegree(g_CurrentKey.scaleIndex, degree, count); + var pitch = Theory.getPitchForScaleInterval(g_CurrentKey.scaleIndex, 0, degree); var labelMain = document.createElement("span"); var labelSuperscript = document.createElement("sup"); labelMain.innerHTML = Theory.getChordLabelMain(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); labelSuperscript.innerHTML = Theory.getChordLabelSuperscript(g_CurrentKey.scaleIndex, chordKindIndex, pitch, [], g_Editor.usePopularNotation); - var button = document.getElementById("buttonChord" + (i + 7)); + var button = document.getElementById("buttonChord" + i); while (button.firstChild != null) button.removeChild(button.firstChild); @@ -214,14 +217,6 @@ function handleSelectChordKindsChange() g_Editor.insertChord(this.chordKindIndex, this.rootPitch + g_CurrentKey.tonicPitch, []); }; } - - for (var i = 0; i < 7; i++) - { - var button = document.getElementById("buttonChord" + i); - button.style.visibility = "hidden"; - button = document.getElementById("buttonChord" + (i + 14)); - button.style.visibility = "hidden"; - } } else diff --git a/src/util/theory.js b/src/util/theory.js index 28c117f..dbb492e 100644 --- a/src/util/theory.js +++ b/src/util/theory.js @@ -66,7 +66,11 @@ Theory.chordKinds = { pitches: [0, -3, -6, -9, 2], code: "o9", symbol: [true, "", "o9"], name: "Diminished Ninth", ext: 4 }, { pitches: [0, -3, -6, -9, -5], code: "ob9", symbol: [true, "", "o♭9"], name: "Diminished Minor Ninth", ext: 4 }, { pitches: [0, -3, -6, -2, 2], code: "%9", symbol: [true, "", "ø9"], name: "Half-Diminished Ninth", ext: 4 }, - { pitches: [0, -3, -6, -2, -5], code: "%b9", symbol: [true, "", "ø♭9"], name: "Half-Diminished Minor Ninth", ext: 4 } + { pitches: [0, -3, -6, -2, -5], code: "%b9", symbol: [true, "", "ø♭9"], name: "Half-Diminished Minor Ninth", ext: 4 }, + + { pitches: [0, 4, -6, -2], code: "7b5", symbol: [false, "", "7♭5"], name: "Dominant Seventh Flat Fifth", startGroup: "Altered" }, + { pitches: [0, 4, 1, -2, -5], code: "7b9", symbol: [true, "", "7♭9"], name: "Dominant Seventh Minor Ninth", ext: 4 }, + { pitches: [0, -3, 1, -2, -5], code: "m7b9", symbol: [true, "", "m7♭9"], name: "Minor Seventh Minor Ninth", ext: 4 }, ]; @@ -257,12 +261,12 @@ Theory.getChordStackPattern = function(meter) }*/ -Theory.findChordKindForDegree = function(scaleIndex, degree) +Theory.findChordKindForDegree = function(scaleIndex, degree, count) { var scale = Theory.scales[scaleIndex].pitches; var chordPitches = []; - for (var i = 0; i < 3; i++) + for (var i = 0; i < count; i++) { chordPitches.push(scale[mod(degree + i * 2, scale.length)]); // // // } From 823567d1875d838af480101ea171cdeca734fdb3 Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Sat, 1 Apr 2017 14:19:53 -0300 Subject: [PATCH 11/44] add basic synth from samples --- README.md | 17 ++- audio/piano/a1.mp3 | Bin 0 -> 96547 bytes audio/piano/a2.mp3 | Bin 0 -> 93412 bytes audio/piano/a3.mp3 | Bin 0 -> 92576 bytes audio/piano/a4.mp3 | Bin 0 -> 78993 bytes audio/piano/a5.mp3 | Bin 0 -> 96965 bytes audio/piano/a6.mp3 | Bin 0 -> 96338 bytes audio/piano/a7.mp3 | Bin 0 -> 40541 bytes index.html | 4 +- src/editor/editor.js | 8 -- src/song/song.js | 6 +- src/synth/instrument.js | 126 +++++++++++++++++ src/synth/instrument_piano.js | 38 ------ src/synth/instrument_square.js | 32 ----- src/synth/instrument_triangle.js | 32 ----- src/synth/synth.js | 227 ++++++++----------------------- src/util/math.js | 6 + src/util/theory.js | 10 +- 18 files changed, 207 insertions(+), 299 deletions(-) create mode 100644 audio/piano/a1.mp3 create mode 100644 audio/piano/a2.mp3 create mode 100644 audio/piano/a3.mp3 create mode 100644 audio/piano/a4.mp3 create mode 100644 audio/piano/a5.mp3 create mode 100644 audio/piano/a6.mp3 create mode 100644 audio/piano/a7.mp3 create mode 100644 src/synth/instrument.js delete mode 100644 src/synth/instrument_piano.js delete mode 100644 src/synth/instrument_square.js delete mode 100644 src/synth/instrument_triangle.js diff --git a/README.md b/README.md index cb117f9..7650944 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,14 @@ This is a tool for composing or analyzing music. It's currently a proof-of-concept, and, as such, it is very unoptimized performance-wise. -Most editing tools are currently keyboard-only. -Play around with the Ctrl, Alt, and Shift key modifiers. +Some editing tools are currently keyboard-only. +The bottommost two letter rows input absolute pitches. +The keys `1` to `7` input scale-aware pitches. +Use the arrow keys to move notes and the cursor around. +Move the cursor while holding down `Shift` to select an interval of notes. +Move a note while holding down `Ctrl` to change its duration. +Press `Enter` to unselect all notes. +Use the `Alt` key for faster steps while moving stuff around. In the future, it should support: @@ -18,4 +24,9 @@ In the future, it should support: - [ ] Song parameter changes, such as tempo - [ ] Note pitch bending - [ ] Multiple tracks and instruments -- [ ] Note/Track parameter changes, such as note velocity \ No newline at end of file +- [ ] Note/Track parameter changes, such as note velocity + +Uses piano samples from . + +In order for audio samples to load properly when developing locally, +set up a local HTTP server, such as `python3 -m http.server 80`. \ No newline at end of file diff --git a/audio/piano/a1.mp3 b/audio/piano/a1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4fff8ad1fb75010fed4f3397581cdd9e8a7b2f80 GIT binary patch literal 96547 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�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 literal 0 HcmV?d00001 diff --git a/audio/piano/a3.mp3 b/audio/piano/a3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..33323535590e7f10c13901d9417227f574b552f6 GIT binary patch literal 92576 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%0DZ2Fw6Uxp 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 literal 0 HcmV?d00001 diff --git a/audio/piano/a4.mp3 b/audio/piano/a4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1c2866ede46e5a5749585a24b10cb190e42877cd GIT binary patch literal 78993 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 z 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
-
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main.js b/src/main.js index 1a080d9..8ab1db0 100644 --- a/src/main.js +++ b/src/main.js @@ -15,14 +15,16 @@ function main() g_Song = new Song(); - var elemSvgEditor = document.getElementById("svgEditor"); + var elemSvgEditor = document.getElementById("editor"); g_Editor = new Editor(elemSvgEditor, g_Synth); g_Editor.setSong(g_Song); g_Editor.refresh(); g_Editor.callbackTogglePlay = refreshButtonPlay; g_Editor.callbackCursorChange = callbackCursorChange; - g_Editor.usePopularNotation = document.getElementById("checkboxPopularNotation").checked; - g_Editor.useChordPatterns = document.getElementById("checkboxChordPatterns").checked; + g_Editor.usePopularNotation = false;//document.getElementById("checkboxPopularNotation").checked; + g_Editor.useChordPatterns = false;//document.getElementById("checkboxChordPatterns").checked; + + toolboxInit(); refreshButtonPlay(false); refreshMainTabs(); diff --git a/src/toolbox.js b/src/toolbox.js new file mode 100644 index 0000000..07f418a --- /dev/null +++ b/src/toolbox.js @@ -0,0 +1,10 @@ +function toolboxInit() +{ + toolboxDrawerNotesChordsInit(); +} + + +function toolboxRefresh() +{ + toolboxDrawerNotesChordsRefresh(); +} \ No newline at end of file diff --git a/src/toolbox_notes_chords.js b/src/toolbox_notes_chords.js new file mode 100644 index 0000000..365cebd --- /dev/null +++ b/src/toolbox_notes_chords.js @@ -0,0 +1,39 @@ +function toolboxDrawerNotesChordsInit() +{ + var selectChordKinds = document.getElementById("select-chord-kind"); + + var optionInKey = document.createElement("option"); + optionInKey.innerHTML = "In Key"; + selectChordKinds.appendChild(optionInKey); + + for (var i = 0; i < Theory.chordKinds.length; i++) + { + if (Theory.chordKinds[i].startGroup != undefined) + { + var optGroup = document.createElement("optgroup"); + optGroup.label = "-- " + Theory.chordKinds[i].startGroup + " --"; + selectChordKinds.appendChild(optGroup); + } + + var option = document.createElement("option"); + + var labelMain = document.createElement("span"); + var labelSuperscript = document.createElement("sup"); + + var key = { scaleIndex: 0, tonicMidiPitch: 0, accidentalOffset: 0 }; + var chord = { chordKindIndex: i, rootMidiPitch: 0, rootAccidentalOffset: 0, embelishments: [] }; + + labelMain.innerHTML = Theory.getChordRomanLabelMain(key, chord); + labelSuperscript.innerHTML = Theory.getChordRomanLabelSuperscript(key, chord); + + option.appendChild(labelMain); + labelMain.appendChild(labelSuperscript); + selectChordKinds.appendChild(option); + } + selectChordKinds.selectedIndex = 0; +} + + +function toolboxDrawerNotesChordsRefresh() +{ +} \ No newline at end of file diff --git a/style.css b/style.css index 59abe2a..1ee4e2e 100644 --- a/style.css +++ b/style.css @@ -1,144 +1,224 @@ -html +html, body { + width: 100%; height: 100%; - min-height: 100%; + overflow: hidden; + margin: 0; + border: 0; padding: 0; - overflow: hidden; + + font-family: "Homenaje", sans-serif; + font-size: 1.25em; } -body + +div { - height: 100%; - min-height: 100%; margin: 0; + border: 0; + padding: 0; } -#divToolbox -{ - width: 100%; - height: 150px; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 5px; - padding-right: 5px; - overflow: hidden; - background-color: #ddd; - text-align: center; -} -#tableToolboxMainLayout +.cell-stretch { - height: 140px; + justify-self: stretch; + align-self: stretch; } -#divEditor + +.cell-scroll { - width: 100%; - height: calc(100% - 150px); - overflow-x: hidden; + justify-self: stretch; + align-self: stretch; overflow-y: scroll; } -#svgEditor + +.toolbox-button { - width: 100%; + border: 0px solid black; + border-radius: 0.5em; + background-color: #ddd; + box-shadow: 0 0.5em 0 0 #aaa; + outline: none; } - -.toolboxGroup +.toolbox-button:hover { - padding-left: 10px; - padding-right: 10px; + cursor: pointer; + background-color: #eee; + box-shadow: 0 0.5em 0 0 #ccc; +} +.toolbox-button:active +{ + position: relative; + top: 0.4em; + cursor: pointer; background-color: #ccc; - border-radius: 5px; + box-shadow: 0 0.1em 0 0 #888; } -.toolboxGroup2 + +.toolbox-tab { - padding-left: 10px; - padding-right: 10px; - padding-top: 5px; - padding-bottom: 5px; - background-color: #bbb; - border-radius: 5px; + border: 0px solid black; + border-radius: 0.5em; + background-color: #ddd; + box-shadow: 0 0.5em 0 0 #aaa; + outline: none; } - -.toolboxSeparator +.toolbox-tab:hover { - border-left: 1px solid black; + cursor: pointer; + background-color: #eee; + box-shadow: 0 0.5em 0 0 #ccc; } - -.toolboxGroupMainTabs +.toolbox-tab:active +{ + position: relative; + top: 0.4em; + cursor: pointer; + background-color: #ccc; + box-shadow: 0 0.1em 0 0 #888; +} +.toolbox-tab-label { - width: 100px; + font-size: 1.5em; + font-family: "Homenaje", sans-serif; +} +.toolbox-tab-icon +{ + font-size: 1.5em; +} +.toolbox-tab-selected +{ + position: relative; + top: 1em; + height: 100%; + border: 0px solid black; + border-radius: 0.5em; + background-color: #eee; + box-shadow: 0 1em 0 0 #eee; + outline: none; } -.toolboxLabel + +.toolbox-drawer { - margin-top: 5px; - margin-bottom: 5px; - font-family: Verdana, sans-serif; - font-size: 12px; + width: calc(100% - 1em); + height: 100%; + background-color: #eee; + border-radius: 0.5em; + z-index: 1; + box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.3); } -.toolboxButton + +.toolbox-select { - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - padding-bottom: 2px; - background-color: #fff; - border: 0; - border-top: 2px solid #fff; - border-bottom: 2px solid black; - border-radius: 5px; + border: 0px solid black; + border-radius: 0.25em; + background-color: #ddd; + box-shadow: 0 0.15em 0 0 #aaa; outline: none; - font-family: Verdana, sans-serif; - font-size: 12px; + font-family: "Homenaje", sans-serif; + font-size: 1em; } - -.toolboxButton:hover +.toolbox-select:hover { cursor: pointer; + background-color: #fdfdfd; + box-shadow: 0 0.15em 0 0 #ccc; } - -.toolboxButton:active +.toolbox-select:active { + position: relative; + top: 0.1em; cursor: pointer; - background-color: #ddd; - border: 0; - border-top: 2px solid black; - border-bottom: 2px solid #ddd; + background-color: #ccc; + box-shadow: 0 0.05em 0 0 #888; } -.toolboxButtonPlay + +.toolbox-chord { - font-size: 24px; - width: 120px; - height: 60px; + width: 6em; + height: 4em; + border: 0px solid black; + border-radius: 0.5em; + background-color: white; + box-shadow: 0 0.3em 0 0 #aaa; + outline: none; } - -.toolboxMainTabSelected +.toolbox-chord:hover +{ + cursor: pointer; + background-color: #fdfdfd; + box-shadow: 0 0.3em 0 0 #ccc; +} +.toolbox-chord:active { position: relative; - left: 10px; - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - padding-bottom: 2px; + top: 0.1em; + cursor: pointer; background-color: #ccc; - border: 2px solid #ccc; - border-radius: 5px; - outline: none; - font-family: Verdana, sans-serif; - font-size: 12px; + box-shadow: 0 0.1em 0 0 #888; +} +.toolbox-chord-label +{ + font-size: 3em; + font-family: "Homenaje", sans-serif; +} + + +#main +{ + width: 100%; + height: calc(100% - 0.25em); + padding-top: 0.25em; + display: grid; + grid-template-columns: 100%; + grid-template-rows: 0fr 0fr 1fr; + grid-gap: 0.5em 0; + justify-items: center; + align-items: center; } -.toolboxButtonRewind + +#toolbox +{ + display: grid; + grid-template-columns: 0fr 0fr 1fr 0fr 0fr 0fr 0fr 0fr; + grid-template-rows: 0fr; + grid-gap: 0.25em 0.25em; + justify-items: center; + align-items: center; +} + + +#toolbox-drawer-notes-chords +{ + padding: 0.5em; + padding-top: 1em; + padding-bottom: 1em; + display: grid; + grid-template-columns: 0fr 0fr 0fr 0fr 0fr 0fr 0fr 0fr; + grid-template-rows: 0fr 0fr 0fr; + grid-gap: 0.25em 0.25em; + justify-items: center; + align-items: center; + justify-content: center; +} + + +#editor { - height: 40px; + width: 100%; + height: 100%; } + .toolboxChord { width: 40px; @@ -158,12 +238,10 @@ body font-size: 12px; text-align: center; } - .toolboxChord:hover { cursor: pointer; } - .toolboxChord:active { cursor: pointer; From 4687a39e6db2ed9ecdcfd3eba8d9203721c6039d Mon Sep 17 00:00:00 2001 From: Henrique Lorenzi Date: Sun, 9 Jul 2017 22:17:09 -0300 Subject: [PATCH 43/44] re-add all features to gui --- editor.css | 229 ++++++++++++++++++++ index.html | 224 +++++++++++++++---- src/main.js | 414 ++---------------------------------- src/toolbox.js | 100 ++++++++- src/toolbox_file.js | 145 +++++++++++++ src/toolbox_markers.js | 83 ++++++++ src/toolbox_notes_chords.js | 188 +++++++++++++++- src/toolbox_settings.js | 23 ++ style.css | 364 +++++++------------------------ 9 files changed, 1029 insertions(+), 741 deletions(-) create mode 100644 editor.css create mode 100644 src/toolbox_file.js create mode 100644 src/toolbox_markers.js create mode 100644 src/toolbox_settings.js diff --git a/editor.css b/editor.css new file mode 100644 index 0000000..53fd100 --- /dev/null +++ b/editor.css @@ -0,0 +1,229 @@ +.editorLabelTitle +{ + fill: #000; + font-family: Verdana, sans-serif; + font-size: 22px; + font-weight: bold; + text-anchor: start; + alignment-baseline: middle; +} + +.editorLabelAlbum +{ + fill: #888; + font-family: Verdana, sans-serif; + font-size: 10px; + text-anchor: start; + alignment-baseline: middle; +} + +.editorLabelAuthors +{ + fill: #000; + font-family: Verdana, sans-serif; + font-size: 10px; + text-anchor: start; + alignment-baseline: middle; +} + +.editorBlockBackground +{ + stroke-width: 0px; + fill: #eee; +} + +.editorBlockSelection +{ + stroke-width: 0px; + fill: rgba(0, 0, 255, 0.25); +} + +.editorBlockFrame +{ + stroke: #333; + stroke-width: 2px; + fill: rgba(0, 0, 0, 0); +} + +.editorBeat +{ + stroke: #fff; + stroke-width: 2px; +} + +.editorOctaveLine +{ + stroke: #333; + stroke-width: 2px; +} + +.editorNote +{ + stroke-width: 0px; +} + +.editorNoteSelected +{ + stroke-width: 2px; +} + +.editorNoteInChordBackground +{ + stroke-width: 0px; +} + +.editorChordBackground +{ + stroke-width: 0px; + fill: white; +} + +.editorChordOrnament +{ + stroke-width: 0px; +} + +.editorChordOrnamentSelected +{ + stroke-width: 2px; +} + +.editorChordRomanLabel +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 20px; + text-anchor: middle; + alignment-baseline: central; +} + +.editorChordRomanLabelSuperscript +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 14px; + text-anchor: middle; + alignment-baseline: central; + baseline-shift: super; +} + +.editorChordAbsoluteLabel +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 10px; + text-anchor: middle; + alignment-baseline: central; +} + +.editorChordAbsoluteLabelSuperscript +{ + fill: black; + font-family: Verdana, sans-serif; + font-size: 8px; + text-anchor: middle; + alignment-baseline: central; + baseline-shift: super; +} + +.editorKeyHandle +{ + fill: #f04; + stroke-width: 0px; +} + +.editorKeyHandleSelected +{ + stroke: #f04; + stroke-width: 2px; + fill: #fad; +} + +.editorKeyLine +{ + stroke: #f04; + stroke-width: 2px; +} + +.editorKeyLabel +{ + fill: #f04; + font-family: Verdana, sans-serif; + font-size: 12px; + text-anchor: start; + alignment-baseline: middle; +} + +.editorScaleLabel +{ + fill: #000; + font-family: Verdana, sans-serif; + font-size: 12px; + text-anchor: start; + alignment-baseline: middle; +} + +.editorMeterHandle +{ + fill: #0af; + stroke-width: 0px; +} + +.editorMeterHandleSelected +{ + stroke: #0af; + stroke-width: 2px; + fill: #aef; +} + +.editorMeterLine +{ + stroke: #0af; + stroke-width: 2px; +} + +.editorMeterLabel +{ + fill: #0af; + font-family: Verdana, sans-serif; + font-size: 12px; + text-anchor: start; + alignment-baseline: middle; +} + +.editorForcedMeasureHandle +{ + fill: #000; + stroke-width: 0px; +} + +.editorForcedMeasureHandleSelected +{ + stroke: #000; + stroke-width: 2px; + fill: #ddd; +} + +.editorForcedMeasureLine +{ + stroke: #000; + stroke-width: 2px; +} + +.editorCursor +{ + stroke: blue; + stroke-width: 2px; +} + +.editorCursorGhost +{ + stroke: rgba(0, 0, 255, 0.25); + stroke-width: 2px; +} + +.editorCursorPlayback +{ + stroke: red; + stroke-width: 2px; +} \ No newline at end of file diff --git a/index.html b/index.html index 90b0c1e..8337929 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,7 @@ Music Analysis + @@ -15,10 +16,15 @@ -
+