* midi working for the most part
This commit is contained in:
parent
1908d82012
commit
0305369944
|
|
@ -223,7 +223,7 @@
|
|||
if (enableVstTimeout) {
|
||||
clearTimeout(enableVstTimeout)
|
||||
}
|
||||
enableVstTimeout = setTimeout(function() { enableVst() }, 5000)
|
||||
enableVstTimeout = setTimeout(function() { enableVst() }, 1000)
|
||||
}
|
||||
|
||||
function enableVst () {
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 & 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})
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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++) {
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
height:220px;
|
||||
|
||||
.live-tracks {
|
||||
margin-bottom:5px;
|
||||
height:165px;
|
||||
overflow:auto;
|
||||
a {
|
||||
|
|
|
|||
|
|
@ -406,6 +406,6 @@ if defined?(Bundler)
|
|||
}
|
||||
}
|
||||
config.vst_enabled = true
|
||||
config.midi_enabled = false
|
||||
config.midi_enabled = true
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue