// changed at Mon Feb 09 2015 13:32:12 GMT+0100 (Central Europe Standard Time) by timfelgentr
eff
this.addScript(function reset() {
    this.get("Music").removeAllMorphs();
    this.setParameters();
});
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Rectangle
Tag:
run
save
Tests

-- ALL --

setParameters
voice1Chords
voice2Chords
Scripts
-
+
-
Connections
+
-- ALL --
all
ObjectEditor -- Rectangle>>reset
X

Menu

this Note13
Filter:
this.note = 'Bb5'
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Bind 'this' to selection
Inspector on: lively.morphic.Morph
X

Menu
// changed at Mon Feb 09 2015 13:31:53 GMT+0100 (Central Europe Standard Time) by timfelgen
treff
this.addScript(function constraints(gaplen) {
    this.reset();
    var noteProto = this.get("Note"),
        music = this.get("Music");
    noteProto.reset();
    bbb.defaultSolver = new BacktalkSolver();
    this.voice1 = Array.range(1, len).map(function(i) {
        var note = noteProto.copy();
        music.addMorph(note);
        note.time = i;
        always: { note.note.is in this.voice1Chords() }
        return note;
    }.bind(this));
    this.voice2 = Array.range(1, len + gap).map(function(i) {
        var note = noteProto.copy();
        if (i <= len) music.addMorph(note);
        note.time = i;
        always: { note.note.is in this.voice2Chords() }
        return note;
    }.bind(this));
    this.voice1.each(function (note1, idx) {
        var note2 = this.voice2[idx],
            note1f = this.voice1[idx + 1],
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<lively.morphic.Box#7FC63... - Rectangle>
Tag:
run
save
Tests

-- ALL --

isValidBichord
reset
setParameters
voice1Chords
voice2Chords
Scripts
-
+
-
Connections
+
-- ALL --
all
ObjectEditor -- Rectangle>>constraints
X

Menu
SystemBrowser
X

Menu
N

...
../
clojure/
cop/
lib/
lively/
media/
ometa/
servers/
styles/
-----
-----
-----
1
-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>
<
depth: 1
reset
users.timfelgentreff.midijs.midi.MIDIjs.play("http://www.midijs.net/midi/alan_jackson_dont_rock_the_jukebox.mid")
users.timfelgentreff.midijs.midi.MIDIjs.stop()
users.timfelgentreff.midijs.midi_writer.MidiTrack
String(["/home/tim/Dev/babelsberg-js/LivelyKernel/core/../users/timfelgentreff/z3/z3","-T:4","-smt2","-in"])
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
show vars
JavaScript Workspace
X

Menu

this Note1
Filter:
this.note = 'C5'
this.show()
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Bind 'this' to selection
Inspector on: lively.morphic.Morph
X

Menu
// changed at Mon Feb 09 2015 13:56:02 GMT+0100 (Central Europe Standard Time) by timfelgentr
eff
this.addScript(function doAction() {
    var MidiTrack = Global.users.timfelgentreff.midijs.midi_writer.MidiTrack,
        MidiWriter = Global.users.timfelgentreff.midijs.midi_writer.MidiWriter,
        MidiEvent = Global.users.timfelgentreff.midijs.midi_writer.MidiEvent,
        track1 = new MidiTrack({
            events: [
                MidiEvent.programChange(32)
            ].concat(this.owner.voice1.map(function(note) {
                return MidiEvent.createNote(note.note);
            }).flatten())
        }),
        track2 = new MidiTrack({
            events: [
                MidiEvent.programChange(32)
            ].concat(this.owner.voice2.slice(0, this.owner.numChords).map(function(note) {
                return MidiEvent.createNote(note.note);
            }).flatten())
        });
    var song  = MidiWriter({ tracks: [track1, track2] });
    // song.save()
    Global.users.timfelgentreff.midijs.midi.MIDIjs.playString(atob(song.b64));
});
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<lively.morphic.Button#4EB9B... - Button2>
Tag:
run
save
Tests

-- ALL --

Scripts
-
+
-
Connections
+
-- ALL --
fire,AttributeConnection(<lively.morphic.Button#4EB9B... - Button2>.fire --> <lively.morphic.Button#4EB9B... - Button2>.doAction)
all
ObjectEditor -- Button2>>doAction
X

Menu
30
Length
6
Gap
Make
Play
depth: 1
reset
var MidiTrack = users.timfelgentreff.midijs.midi_writer.MidiTrack;
var MidiWriter = users.timfelgentreff.midijs.midi_writer.MidiWriter
var noteEvents = [];
["Db4", "E4", "G4"].forEach(function(note) {
    Array.prototype.push.apply(
        noteEvents,
        users.timfelgentreff.midijs.midi_writer.MidiEvent.createNote(note));
});
var track = new MidiTrack({ events: noteEvents });
song  = MidiWriter({ tracks: [track] });
song.play
// song.save();
URL.createObjectURL
atob(song.b64)
users.timfelgentreff.midijs.midi.MIDIjs.playString(atob(song.b64))
new DataView(song.b64)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
show vars
JavaScript Workspace
X

Menu
    }.bind(this));
    this.voice2 = Array.range(1, len + gap).map(function(i) {
        var note = noteProto.copy();
        if (i <= len) music.addMorph(note);
        note.time = i;
        always: { note.note.is in this.voice2Chords() }
        return note;
    }.bind(this));
    this.voice1.each(function (note1, idx) {
        var note2 = this.voice2[idx],
            note2gap = this.voice2[idx + gap],
            self = this;
        always: { priority: 'strong'
            self.isValidBichord(note1.note, note2gap.note)
        }
        for (var i = idx + 1; i < len && i <= idx + gap; i++) {
            var note1f = this.voice1[i],
                note2f = this.voice2[i];
            if (note1f && note2f) {
                always: {
                    note1.note !== note1f.note || note2.note !== note2f.note
                }
            }
        }
    }.bind(this));
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<lively.morphic.Box#D25BB... - NzakaraHarp>
Tag:
run
save
Tests

-- ALL --
constraints
isValidBichord
reset
setParameters
voice1Chords
voice2Chords
Scripts
-
+
-
Connections
+
-- ALL --
all
ObjectEditor -- NzakaraHarp>>constraints
X

Menu
saved source