* midi working for the most part

This commit is contained in:
Seth Call 2015-12-22 21:28:19 -06:00
parent 1908d82012
commit 0305369944
13 changed files with 222 additions and 99 deletions

View File

@ -223,7 +223,7 @@
if (enableVstTimeout) {
clearTimeout(enableVstTimeout)
}
enableVstTimeout = setTimeout(function() { enableVst() }, 5000)
enableVstTimeout = setTimeout(function() { enableVst() }, 1000)
}
function enableVst () {

View File

@ -8,6 +8,8 @@
context.JK = context.JK || {};
var logger = context.JK.logger;
context.JK.MIDI_TRACK = 100
context.JK.OS = {
WIN32: "Win32",
OSX: "MacOSX",
@ -358,7 +360,9 @@
"PeerAudioInputMusicGroup": 13,
"PeerMediaTrackGroup": 14,
"JamTrackGroup": 15,
"MetronomeGroup": 16
"MetronomeGroup": 16,
"MidiInputMusicGroup": 17,
"PeerMidiInputMusicGroup": 18
};
context.JK.ChannelGroupLookup = {
@ -378,7 +382,9 @@
13: "PeerAudioInputMusicGroup",
14: "PeerMediaTrackGroup",
15: "JamTrackGroup",
16: "MetronomeGroup"
16: "MetronomeGroup",
17: "MidiInputMusicGroup",
18: "PeerMidiInputMusicGroup"
}
context.JK.CategoryGroupIds = {
"AudioInputMusic" : "AudioInputMusic",

View File

@ -147,6 +147,15 @@ ConfigureTracksStore = @ConfigureTracksStore
if @state.configureTracks?
if @state.configureTracks.scanningVsts
scan =
`<div className="vstScan">
<div className="spinner-small"></div><span>Scanning your system<br/>for VST &amp; AU plug-ins...</span>
</div>`
if @state.configureTracks.unscanned
initialScan = `<p className="initial-scan">If you want to use a midi instrument, click the <b>manage audio plugins</b> link above, and then click the <b>scan for new or updated plugins</b> link in the menu.</p>`
logger.debug("current midi device: " + @state.configureTracks.editingTrack.midiDeviceIndex)
selectedMidiInterface = @state.configureTracks.editingTrack.midiDeviceIndex
@ -193,6 +202,8 @@ ConfigureTracksStore = @ConfigureTracksStore
<div className="settings-holder">
<a onClick={this.vstSettings} className={vstSettingBtnClasses}>SETTING . . .</a>
</div>
{initialScan}
{scan}
</div>
</div>`
@ -223,11 +234,6 @@ ConfigureTracksStore = @ConfigureTracksStore
<h1>{header}</h1>
</div>
<div className="dialog-inner">
<div className="track-type">
<h3>Track Type</h3>
<div className="track-type-option"><input type="radio" value="audio" name="track-type" checked={isAudio} /><label>Audio</label></div>
<div className="track-type-option"><input type="radio" value="midi" name="track-type" checked={isMidi} /><label>MIDI</label></div>
</div>
{activeElement}
@ -328,33 +334,33 @@ ConfigureTracksStore = @ConfigureTracksStore
componentDidMount: () ->
$root = $(@getDOMNode())
$radio = context.JK.checkbox($root.find('input[type="radio"]'))
$radio.on("ifChanged", @trackTypeChanged);
#$radio = context.JK.checkbox($root.find('input[type="radio"]'))
#$radio.on("ifChanged", @trackTypeChanged);
componentWillUpdate: () ->
@ignoreICheck = true
#@ignoreICheck = true
$root = $(@getDOMNode())
$radio = $root.find('input[type="radio"]')
#$radio = $root.find('input[type="radio"]')
if gon.midi_enabled
$radio.iCheck('disable')
else
$radio.iCheck('enable')
#if gon.midi_enabled
# $radio.iCheck('disable')
# else
# $radio.iCheck('enable')
componentDidUpdate: () ->
$root = $(@getDOMNode())
$radio = $root.find('input[type="radio"]')
$radio = context.JK.checkbox($root.find('input[type="radio"]'))
$radio.on("ifChanged", @trackTypeChanged);
if gon.midi_enabled
if @state.configureTracks.editingTrack.assignment == 1
$radio.iCheck('disable')
else
$radio.iCheck('enable')
else
$radio.iCheck('disable')
#$radio = $root.find('input[type="radio"]')
#$radio = context.JK.checkbox($root.find('input[type="radio"]'))
#$radio.on("ifChanged", @trackTypeChanged);
#if gon.midi_enabled
# if @state.configureTracks.editingTrack.assignment == 1
# $radio.iCheck('disable')
# else
# $radio.iCheck('enable')
#else
# $radio.iCheck('disable')
@ignoreICheck = false
# @ignoreICheck = false
$manageAudioPlugins = $root.find('.manage-audio-plugins')
@ -416,10 +422,10 @@ ConfigureTracksStore = @ConfigureTracksStore
vstSelected = $select.val()
logger.debug("updateMidiAssocations", vstSelected, midiInterface)
if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
else
vstSelected = null
#if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
#else
# vstSelected = null
if midiInterface == ''
midiInterface = null
@ -437,6 +443,9 @@ ConfigureTracksStore = @ConfigureTracksStore
else if midi?
logger.debug("updating midi:#{midiInterface}")
ConfigureTracksActions.associateMIDIWithTrack(midiInterface)
else
logger.debug("unassociating midi:#{midiInterface}")
ConfigureTracksActions.associateMIDIWithTrack(null)
@setState({midiInterface: midiInterface})

View File

@ -6,6 +6,8 @@ VOICE_CHAT = context.JK.VOICE_CHAT
MAX_TRACKS = context.JK.MAX_TRACKS
MAX_OUTPUTS = context.JK.MAX_OUTPUTS
gearUtils = context.JK.GearUtils
MIDI_TRACK = context.JK.MIDI_TRACK
@ConfigureTracks = React.createClass({
@ -24,29 +26,42 @@ gearUtils = context.JK.GearUtils
trackAssignments = @state.configureTracks?.trackAssignments
if gon.midi_enabled
addMidiTrack = `<a onClick={this.openLiveTrackDialog.bind(this, 'midi')} className="button-orange">ADD MIDI TRACK . . . </a>`
if trackAssignments
for inputsForTrack in trackAssignments.inputs.assigned
for inputsForTrack, i in trackAssignments.inputs.assigned
candidate = inputsForTrack[0]
inputs = []
for input in inputsForTrack
inputs.push(`<div className="live-input">{input.name}</div>`)
if candidate.assignment == MIDI_TRACK
trackTypeLabel = 'MIDI'
midiDeviceName = 'UNKNOWN'
for midiDevice in @state.configureTracks.attachedMidiDevices.midiDevices
if midiDevice.deviceIndex == inputsForTrack.vst?.midiDeviceIndex
midiDeviceName = midiDevice.deviceName
inputs.push(`<div className="live-input">{midiDeviceName}</div>`)
else
trackTypeLabel = 'AUDIO'
for input in inputsForTrack
inputs.push(`<div className="live-input">{input.name}</div>`)
if !inputsForTrack.instrument_id?
instrument = `<span className="none">?</span>`
else
instrument = `<span><img src={context.JK.getInstrumentIconMap24()[inputsForTrack.instrument_id].asset} /></span>`
trackTypeLabel = 'AUDIO'
vstName = 'None'
if inputsForTrack.vst? && inputsForTrack.vst.name != 'NONE'
vstName = "#{inputsForTrack.vst.name} by #{inputsForTrack.vst.manuf}"
liveTracks.push(
`<div key={candidate.assignment} className="live-track">
<div className={classNames({'input-track-info': true, one: inputsForTrack.length == 1, two: inputsForTrack.length == 2})}><span className="assignment">{candidate.assignment}:</span><span className="track-type-label">{trackTypeLabel}</span>{inputs}</div>
`<div key={i + 1} className="live-track">
<div className={classNames({'input-track-info': true, one: inputsForTrack.length == 1, two: inputsForTrack.length == 2})}><span className="assignment">{i + 1}:</span><span className="track-type-label">{trackTypeLabel}</span>{inputs}</div>
<div className="plugin-info">{vstName}</div>
<div className="plugin-instrument">{instrument}</div>
<div className="live-track-actions">
@ -65,7 +80,7 @@ gearUtils = context.JK.GearUtils
<select className="certified-audio-profile" style={{display:'none'}}></select>
<div className="inputs-view">
<div>
<h3 className="session-audio-inputs-header">Session Audio Inputs (Live Performance Tracks)</h3>
<h3 className="session-audio-inputs-header">Session Audio Inputs (Live Tracks)</h3>
<h3 className="plugin-header">Plugin</h3>
<h3 className="instrument-header">Instrument</h3>
</div>
@ -73,7 +88,8 @@ gearUtils = context.JK.GearUtils
{liveTracks}
</div>
<div className="add-track-action">
<a onClick={this.openLiveTrackDialog} className="button-orange">ADD TRACK . . . </a>
<a onClick={this.openLiveTrackDialog.bind(this, 'audio')} className="button-orange">ADD AUDIO TRACK . . . </a>
{addMidiTrack}
</div>
</div>
<div className="outputs-view">
@ -100,18 +116,21 @@ gearUtils = context.JK.GearUtils
# can't delete the last assignment
context.JK.Banner.showAlert('You can not delete the 1st audio track.')
else
trackType = 'live'
if liveTrack.assignment == MIDI_TRACK
trackType = 'MIDI'
context.JK.Banner.showYesNo({
title: "Confirm Deletion",
html: "Are you sure you want to delete this live track?",
html: "Are you sure you want to delete this #{trackType} track?",
yes: =>
ConfigureTracksActions.deleteTrack(liveTrack.assignment)
})
openLiveTrackDialog: (e) ->
openLiveTrackDialog: (type, e) ->
e.preventDefault()
ConfigureTracksActions.showAddNewTrack()
ConfigureTracksActions.showAddNewTrack(type)
openOutputTrackDialog: (e) ->
e.preventDefault()

View File

@ -48,12 +48,15 @@ ConfigureTracksActions = @ConfigureTracksActions
'no-mixer' : !this.props.hasMixer
})
pan = if this.props.mixers.mixer? then this.props.mixers.mixer.pan else 0
unless @props.no_pan
pan = if this.props.mixers.mixer? then this.props.mixers.mixer.pan else 0
panStyle = {
transform: "rotate(#{pan}deg)"
WebkitTransform: "rotate(#{pan}deg)"
}
panStyle = {
transform: "rotate(#{pan}deg)"
WebkitTransform: "rotate(#{pan}deg)"
}
panJsx = `<div className="track-icon-pan" style={panStyle}/>`
classification = @state.stats?.classification
@ -77,7 +80,7 @@ ConfigureTracksActions = @ConfigureTracksActions
<SessionTrackVU orientation="horizontal" lightCount={5} lightWidth={17} lightHeight={3} side="best" mixers={this.props.mixers} />
<div className="track-buttons">
<div className={classes} data-control="mute" data-mixer-id={muteMixerId} onClick={this.handleMute}/>
<div className="track-icon-pan" style={panStyle}/>
{panJsx}
{vst}
<div className={classNames(connectionStateClasses)}/>
</div>

View File

@ -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

View File

@ -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")

View File

@ -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.<br/><br/>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.<br/><br/>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}")

View File

@ -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()

View File

@ -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)

View File

@ -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++) {

View File

@ -10,6 +10,7 @@
height:220px;
.live-tracks {
margin-bottom:5px;
height:165px;
overflow:auto;
a {

View File

@ -406,6 +406,6 @@ if defined?(Bundler)
}
}
config.vst_enabled = true
config.midi_enabled = false
config.midi_enabled = true
end
end