+ {panJsx}
{vst}
diff --git a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee
index 642b79bea..590848abc 100644
--- a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee
+++ b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee
@@ -19,7 +19,7 @@ MIX_MODES = context.JK.MIX_MODES;
@mediaSummary = {}
@mediaTrackGroups = [ChannelGroupIds.MediaTrackGroup, ChannelGroupIds.JamTrackGroup,
ChannelGroupIds.MetronomeGroup]
- @muteBothMasterAndPersonalGroups = [ChannelGroupIds.AudioInputMusicGroup, ChannelGroupIds.MediaTrackGroup,
+ @muteBothMasterAndPersonalGroups = [ChannelGroupIds.AudioInputMusicGroup, ChannelGroupIds.MidiInputMusicGroup, ChannelGroupIds.MediaTrackGroup,
ChannelGroupIds.JamTrackGroup, ChannelGroupIds.MetronomeGroup]
@vuStats = {}
@shouldCollectVuStats = false
@@ -636,7 +636,7 @@ MIX_MODES = context.JK.MIX_MODES;
muteMixer = mixer
# sanity checks
- if mixer && mixer.group_id != ChannelGroupIds.AudioInputMusicGroup
+ if mixer && (mixer.group_id != ChannelGroupIds.AudioInputMusicGroup && mixer.group_id != ChannelGroupIds.MidiInputMusicGroup)
logger.error("found local mixer that was not of groupID: AudioInputMusicGroup", mixer)
if mixer
@@ -649,7 +649,7 @@ MIX_MODES = context.JK.MIX_MODES;
# sanity checks
if !oppositeMixer
logger.error("unable to find opposite mixer for local mixer", mixer)
- else if oppositeMixer.group_id != ChannelGroupIds.AudioInputMusicGroup
+ else if oppositeMixer.group_id != ChannelGroupIds.AudioInputMusicGroup && oppositeMixer.group_id != ChannelGroupIds.MidiInputMusicGroup
logger.error("found local mixer in opposite mode that was not of groupID: AudioInputMusicGroup", mixer, oppositeMixer)
else
logger.debug("local track is not present: ", track, @allMixers)
@@ -661,7 +661,7 @@ MIX_MODES = context.JK.MIX_MODES;
mixer = @getMixerByTrackId(track.client_track_id, MIX_MODES.MASTER)
# sanity check
- if mixer && mixer.group_id != ChannelGroupIds.PeerAudioInputMusicGroup
+ if mixer && (mixer.group_id != ChannelGroupIds.PeerAudioInputMusicGroup && mixer.group_id != ChannelGroupIds.PeerMidiInputMusicGroup)
logger.warn("master: found remote mixer that was not of groupID: PeerAudioInputMusicGroup", client_id, track.client_track_id, mixer)
vuMixer = mixer
@@ -689,7 +689,7 @@ MIX_MODES = context.JK.MIX_MODES;
oppositeMixer = @getMixerByTrackId(track.client_track_id, MIX_MODES.MASTER)
if !oppositeMixer
logger.debug("personal: unable to find a PeerAudioInputMusicGroup master mixer matching a UserMusicInput", client_id, track.client_track_id)
- else if oppositeMixer.group_id != ChannelGroupIds.PeerAudioInputMusicGroup
+ else if oppositeMixer.group_id != ChannelGroupIds.PeerAudioInputMusicGroup && oppositeMixer.group_id != mixer.group_id != ChannelGroupIds.PeerMidiInputMusicGroup
logger.error("personaol: found remote mixer that was not of groupID: PeerAudioInputMusicGroup", client_id, track.client_track_id, mixer)
#vuMixer = oppositeMixer; # for personal mode, use the PeerAudioInputMusicGroup's VUs
diff --git a/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee b/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee
index 73fed532f..d414dbc49 100644
--- a/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee
+++ b/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee
@@ -1,4 +1,7 @@
context = window
+ChannelGroupIds = context.JK.ChannelGroupIds
+MIDI_TRACK = context.JK.MIDI_TRACK
+
@SessionMyTracksMixin = {
@@ -51,16 +54,28 @@ context = window
trackName = "#{name}: #{track.instrument}"
+ no_pan = false
associatedVst = null
+
# find any VST info
if hasMixer && @configureTracks?
# bug in the backend; track is wrong for personal mixers (always 1), but correct for master mix
trackAssignment = -1
if @props.mode == context.JK.MIX_MODES.MASTER
- trackAssignment = mixerData.mixer.track
+ if mixerData.mixer.group_id == ChannelGroupIds.MidiInputMusicGroup
+ trackAssignment = MIDI_TRACK
+ else
+ trackAssignment = mixerData.mixer.track
else
- trackAssignment = mixerData.oppositeMixer?.track
+ if mixerData.mixer.group_id == ChannelGroupIds.MidiInputMusicGroup
+ trackAssignment = MIDI_TRACK
+ else
+ trackAssignment = mixerData.oppositeMixer?.track
+
+ if trackAssignment == MIDI_TRACK
+ no_pan = true
+ track.no_pan = no_pan
for vst in @configureTracks.vstTrackAssignments.vsts
if vst.track == trackAssignment - 1 && vst.name != 'NONE'
@@ -68,7 +83,7 @@ context = window
associatedVst = vst
break
- tracks.push({track: track, mixerFinder: mixerFinder, mixers: mixerData, hasMixer:hasMixer, name: name, trackName: trackName, instrumentIcon: instrumentIcon, photoUrl: photoUrl, clientId: participant.client_id, associatedVst: associatedVst})
+ tracks.push({track: track, mixerFinder: mixerFinder, mixers: mixerData, hasMixer:hasMixer, name: name, trackName: trackName, instrumentIcon: instrumentIcon, photoUrl: photoUrl, clientId: participant.client_id, associatedVst: associatedVst, no_pan: no_pan})
else
logger.warn("SessionMyTracks: unable to find participant")
diff --git a/web/app/assets/javascripts/react-components/stores/ConfigureTracksStore.js.coffee b/web/app/assets/javascripts/react-components/stores/ConfigureTracksStore.js.coffee
index 132ee871c..5484b0845 100644
--- a/web/app/assets/javascripts/react-components/stores/ConfigureTracksStore.js.coffee
+++ b/web/app/assets/javascripts/react-components/stores/ConfigureTracksStore.js.coffee
@@ -8,6 +8,7 @@ MAX_OUTPUTS = context.JK.MAX_OUTPUTS
gearUtils = context.JK.GearUtils
AUDIO_UNIT_TYPE_ID = 0
VST_TYPE_ID = 1
+MIDI_TRACK = context.JK.MIDI_TRACK
###
@@ -165,7 +166,6 @@ void removeSearchPath(int typeId, QString pathToRemove);
@vstPluginList = context.jamClient.VSTListVsts()
@vstTrackAssignments = context.jamClient.VSTListTrackAssignments()
- console.log("@vstTrackAssignments", @vstTrackAssignments)
onMidiScan: () ->
@performMidiScan()
@@ -192,7 +192,60 @@ void removeSearchPath(int typeId, QString pathToRemove);
context.jamClient.VSTShowHideGui(true, trackNumber) if trackNumber?
+
+ findMidiTrack: () ->
+ midi = null
+ for assignment in @trackAssignments.inputs.assigned
+ if assignment.assignment == MIDI_TRACK
+ midi = assignment
+ break
+ midi
+
+ removeMidiTrack: () ->
+ removeIndex = -1
+ for assignment, i in @trackAssignments.inputs.assigned
+ if assignment.assignment == MIDI_TRACK
+ # remove this
+ removeIndex = i
+ break
+
+ if removeIndex > -1
+ @trackAssignments.inputs.assigned.splice(removeIndex, 1)
+
+ defaultTrackInstrument: (trackNumber) ->
+ clientInstrument = context.jamClient.TrackGetInstrument(trackNumber)
+ if clientInstrument == 0
+ logger.debug("defaulting midi instrument for assignment #{trackNumber}")
+ # ensure that we always have an instrument set (50 = electric guitar
+ context.jamClient.TrackSetInstrument(trackNumber, 50)
+ clientInstrument = 50
+
+ context.JK.client_to_server_instrument_map[clientInstrument];
+ # the backend does not have a consistent way of tracking assigned inputs for midi.
+ # let's make it seem consistent
+ injectMidiToTrackAssignments: () ->
+ if @vstTrackAssignments?
+ for vst in @vstTrackAssignments.vsts
+ if vst.track == MIDI_TRACK - 1
+ if vst.midiDeviceIndex > -1
+
+ # first see if midi is already there
+ midi = @findMidiTrack()
+
+ if !midi?
+ instrument = @defaultTrackInstrument(MIDI_TRACK)
+
+ midi = [{assignment: MIDI_TRACK}]
+ midi.instrument_id = instrument?.server_id
+ midi.assignment = MIDI_TRACK
+ @trackAssignments.inputs.assigned.push(midi)
+ else
+ @removeMidiTrack()
+
changed: () ->
+
+ @injectMidiToTrackAssignments()
+
@editingTrack = []
@editingTrack.assignment = @trackNumber
@@ -218,11 +271,9 @@ void removeSearchPath(int typeId, QString pathToRemove);
if @editingTrack.vst?
logger.debug("current track has a VST assigned:" + @editingTrack.vst.file)
- logger.debug("trackAssignments:", @trackAssignments)
- logger.debug("editingTrack:", @editingTrack)
unscanned = !@scannedBefore && @vstPluginList.vsts.length <= 1
- console.log("@vstPluginList, unscanned", @vstPluginList.vsts.length, unscanned)
+
@item = {
unscanned: unscanned,
musicPorts: @musicPorts,
@@ -322,10 +373,22 @@ void removeSearchPath(int typeId, QString pathToRemove);
logger.debug("context.jamClient.TrackSetInstrument(trackNumber, track.instrument_id)", @trackNumber, instrumentId)
+ clientInstrumentId = null
if instrumentId != null && instrumentId != ''
- context.jamClient.TrackSetInstrument(@trackNumber, context.JK.instrument_id_to_instrument[instrumentId].client_id)
+ clientInstrumentId = context.JK.instrument_id_to_instrument[instrumentId].client_id
else
- context.jamClient.TrackSetInstrument(@trackNumber, 0)
+ clientInstrumentId = 0
+
+ context.jamClient.TrackSetInstrument(@trackNumber, clientInstrumentId)
+
+ if @trackNumber == MIDI_TRACK
+ logger.debug("checking midi track for track instrument synchronization")
+ # keep artificial midi track in sync
+ midi = @findMidiTrack()
+ if midi?
+ logger.debug("synced midi track with #{instrumentId}")
+ midi.instrument_id = instrumentId
+
if(!result || result.length == 0)
@@ -381,33 +444,45 @@ void removeSearchPath(int typeId, QString pathToRemove);
logger.error("unable to process cancel for an existing track")
onDeleteTrack: (assignment) ->
- track = null
- for inputsForTrack in @trackAssignments.inputs.assigned
- if inputsForTrack.assignment == assignment
- track = inputsForTrack
- break
+ logger.debug("deleting track with assignment #{assignment}")
+ if assignment != MIDI_TRACK
+ track = null
+ for inputsForTrack in @trackAssignments.inputs.assigned
+ if inputsForTrack.assignment == assignment
+ track = inputsForTrack
+ break
- if track?
- for input in inputsForTrack
- context.jamClient.TrackSetAssignment(input.id, true, ASSIGNMENT.UNASSIGNED)
- result = context.jamClient.TrackSaveAssignments()
+ if track?
+ for input in inputsForTrack
+ context.jamClient.TrackSetAssignment(input.id, true, ASSIGNMENT.UNASSIGNED)
+ result = context.jamClient.TrackSaveAssignments()
- if(!result || result.length == 0)
+ if(!result || result.length == 0)
- else
- context.JK.Banner.showAlert('Unable to save assignments. ' + result);
+ else
+ context.JK.Banner.showAlert('Unable to save assignments. ' + result);
+ else
+ logger.error("unable to find track to delete")
else
- logger.error("unable to find track to delete")
+ logger.debug("deleting midi track")
+ @onAssociateMIDIWithTrack(null)
+ @removeMidiTrack()
+ @changed()
- onShowAddNewTrack: () ->
+ onShowAddNewTrack: (type) ->
# check if we have what we need... namely, free ports
- if @trackAssignments.inputs.unassigned.length == 0
- context.JK.Banner.showAlert('You have no more unassigned input ports.
You can free some up by editing an AUDIO track.')
- return
-
- @openLiveTrackDialog(@nextTrackNumber)
+ if type == 'audio'
+ if @trackAssignments.inputs.unassigned.length == 0
+ context.JK.Banner.showAlert('You have no more unassigned input ports.
You can free some up by editing an AUDIO track.')
+ return
+ @openLiveTrackDialog(@nextTrackNumber)
+ else
+ if @findMidiTrack()?
+ context.JK.Banner.showAlert('You have only one MIDI input.')
+ return
+ @openLiveTrackDialog(MIDI_TRACK)
onShowEditTrack: (trackNumber) ->
@openLiveTrackDialog(trackNumber)
@@ -423,22 +498,12 @@ void removeSearchPath(int typeId, QString pathToRemove);
@newTrack = false
break
- if @newTrack
- @trackType = 'audio'
+ if @trackNumber == MIDI_TRACK
+ @trackType = 'midi'
else
- if @trackNumber == 1
- @trackType = 'audio'
- else
- @trackType = 'audio'
- for trackAssignment in @vstTrackAssignments.vsts
- if trackAssignment.track == @trackNumber - 1
- if trackAssignment.midiDeviceIndex > -1
- logger.debug("editing midi track")
- @trackType = 'midi'
- break
+ @trackType = 'audio'
if @newTrack
-
assignment = context.jamClient.TrackGetInstrument(@trackNumber)
if assignment == 0
@@ -457,7 +522,7 @@ void removeSearchPath(int typeId, QString pathToRemove);
@trackType = trackType
if @trackType == 'midi'
- @trackNumber = 100
+ @trackNumber = MIDI_TRACK
@changed()
onUpdateOutputs: (outputId1, outputId2) ->
@@ -477,7 +542,7 @@ void removeSearchPath(int typeId, QString pathToRemove);
onAssociateMIDIWithTrack: (midiInterface) ->
- @trackNumber = 100
+ @trackNumber = MIDI_TRACK
if !midiInterface? || midiInterface == ''
logger.debug("disabling midiInterface:#{midiInterface}, track:#{@trackNumber - 1}")
diff --git a/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee b/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee
index d98600ca5..96066d255 100644
--- a/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee
+++ b/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee
@@ -132,6 +132,8 @@ rest = context.JK.Rest()
@masterMixers = context.jamClient.SessionGetAllControlState(true);
@personalMixers = context.jamClient.SessionGetAllControlState(false);
+ #console.log("@personalMixers", @personalMixers)
+ #console.log("@masterMixers", @masterMixers)
@mixers = new context.MixerHelper(@session, @masterMixers, @personalMixers, @metro, @noAudioUsers, @mixers?.mixMode || MIX_MODES.PERSONAL)
@issueChange()
diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js
index 5f5ef170c..37115a72a 100644
--- a/web/app/assets/javascripts/session.js
+++ b/web/app/assets/javascripts/session.js
@@ -1641,7 +1641,7 @@
muteMixer = mixer;
// sanity checks
- if(mixer && (mixer.group_id != ChannelGroupIds.AudioInputMusicGroup)) { logger.error("found local mixer that was not of groupID: AudioInputMusicGroup", mixer) }
+ if(mixer && (mixer.group_id != ChannelGroupIds.AudioInputMusicGroup || mixer.group_id != ChannelGroupIds.MidiInputMusicGroup) ) { logger.error("found local mixer that was not of groupID: AudioInputMusicGroup", mixer) }
if(mixer) {
// find the matching AudioInputMusicGroup for the opposite mode
@@ -1653,7 +1653,7 @@
// sanity checks
if(!oppositeMixer) {logger.error("unable to find opposite mixer for local mixer", mixer)}
- else if(oppositeMixer.group_id != ChannelGroupIds.AudioInputMusicGroup) { logger.error("found local mixer in opposite mode that was not of groupID: AudioInputMusicGroup", mixer, oppositeMixer)}
+ else if(oppositeMixer.group_id != ChannelGroupIds.AudioInputMusicGroup || oppositeMixer.group_id != ChannelGroupIds.MidiInputMusicGroup) { logger.error("found local mixer in opposite mode that was not of groupID: AudioInputMusicGroup", mixer, oppositeMixer)}
}
else {
logger.debug("local track is not present: ", track)
diff --git a/web/app/assets/javascripts/trackHelpers.js b/web/app/assets/javascripts/trackHelpers.js
index f2be21ea5..edf3dca2f 100644
--- a/web/app/assets/javascripts/trackHelpers.js
+++ b/web/app/assets/javascripts/trackHelpers.js
@@ -82,10 +82,13 @@
*/
getUserTracks: function(jamClient, allTracks) {
var localMusicTracks = [];
+ var localMidiTracks = [];
var i;
localMusicTracks = context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.AudioInputMusicGroup, allTracks);
+ localMidiTracks = context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.MidiInputMusicGroup, allTracks);
+ localMusicTracks = localMusicTracks.concat(localMidiTracks)
var trackObjects = [];
for (i=0; i < localMusicTracks.length; i++) {
diff --git a/web/app/assets/stylesheets/client/react-components/ConfigureTracks.css.scss b/web/app/assets/stylesheets/client/react-components/ConfigureTracks.css.scss
index 72d90891a..2769a9545 100644
--- a/web/app/assets/stylesheets/client/react-components/ConfigureTracks.css.scss
+++ b/web/app/assets/stylesheets/client/react-components/ConfigureTracks.css.scss
@@ -10,6 +10,7 @@
height:220px;
.live-tracks {
+ margin-bottom:5px;
height:165px;
overflow:auto;
a {
diff --git a/web/config/application.rb b/web/config/application.rb
index 22758e55e..7428e6d5c 100644
--- a/web/config/application.rb
+++ b/web/config/application.rb
@@ -406,6 +406,6 @@ if defined?(Bundler)
}
}
config.vst_enabled = true
- config.midi_enabled = false
+ config.midi_enabled = true
end
end