jam-cloud/web/app/assets/javascripts/react-components/ConfigureLiveTracksDialog.j...

441 lines
15 KiB
CoffeeScript
Raw Permalink Normal View History

2015-10-30 14:59:50 +00:00
context = window
ConfigureTracksStore = @ConfigureTracksStore
@ConfigureLiveTracksDialog = React.createClass({
2015-11-09 21:33:04 +00:00
mixins: [Reflux.listenTo(@ConfigureTracksStore,"onConfigureTracksChanged"), Reflux.listenTo(@AppStore, "onAppInit")]
2015-10-30 14:59:50 +00:00
onConfigureTracksChanged:(configureTracks) ->
@setState({configureTracks: configureTracks})
2015-11-09 21:33:04 +00:00
onAppInit: (@app) ->
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
getInitialState: () ->
{configureTracks: null, midiInterface: null}
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
renderAudio: () ->
2015-10-30 14:59:50 +00:00
inputOneOptions = []
inputTwoOptions = []
defaultSelectionOne = `<option key="" value="">None</option>`
defaultSelectionTwo = `<option key="" value="">None</option>`
2015-10-30 14:59:50 +00:00
inputOneOptions.push(defaultSelectionOne)
inputTwoOptions.push(defaultSelectionTwo)
2015-11-09 21:33:04 +00:00
inputOneValue = ''
inputTwoValue = ''
selectedInstrument = ''
selectedVst = 'NONE'
2015-10-30 14:59:50 +00:00
instruments = []
instruments.push(`<option key="" value="">Select the instrument for this track</option>`)
for instrument in context.JK.server_to_client_instrument_alpha
instruments.push(`<option key={instrument.server_id} value={instrument.server_id}>{instrument.display}</option>`)
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
vsts = []
instrumentDisabled = true
vstDisabled = true
2015-11-13 21:35:13 +00:00
2015-10-30 14:59:50 +00:00
if @state.configureTracks?
2015-11-09 21:33:04 +00:00
2015-11-13 21:35:13 +00:00
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>`
2015-11-09 21:33:04 +00:00
selectedInstrument = @state.configureTracks.editingTrack.instrument_id if @state.configureTracks.editingTrack.instrument_id?
if @state.configureTracks.editingTrack.length == 1
input = @state.configureTracks.editingTrack[0]
if input.number == 0
inputOneValue = input.id
else
inputTwoValue = input.id
if @state.configureTracks.editingTrack.length > 1
inputOneValue = @state.configureTracks.editingTrack[0].id
inputTwoValue = @state.configureTracks.editingTrack[1].id
instrumentDisabled = @state.configureTracks.editingTrack.length == 0
vstDisabled = @state.configureTracks.editingTrack.length == 0 || @state.configureTracks.unscanned
if @state.configureTracks.unscanned
2015-12-22 15:32:22 +00:00
initialScan = `<p className="initial-scan">If you want to use an audio plugin, 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>`
2015-11-09 21:33:04 +00:00
2015-10-30 14:59:50 +00:00
for input in @state.configureTracks.musicPorts.inputs
2015-11-09 21:33:04 +00:00
include = false
# we need to see that this input is unassigned, or one of the two selected
for unassignedInputs in @state.configureTracks.trackAssignments.inputs.unassigned
if unassignedInputs.id == input.id
include = true
break
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
if !include
# not see if it's the currently edited track
for currentInput in @state.configureTracks.editingTrack
if currentInput.id == input.id
include = true
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
if include
item = `<option key={input.id} value={input.id}>{input.name}</option>`
2015-11-09 21:33:04 +00:00
inputOneOptions.push(item)
inputTwoOptions.push(item)
for plugin in @state.configureTracks.vstPluginList.vsts
2015-12-22 15:32:22 +00:00
if plugin.category == 'NONE'
vsts.push(`<option key={plugin.file} value={plugin.file}>No VST/AU plugin selected</option>`)
2015-12-22 15:32:22 +00:00
else if plugin.isInstrument == false
vsts.push(`<option key={plugin.file} value={plugin.file}>{plugin.name} by {plugin.manuf}</option>`)
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
if @state.configureTracks.editingTrack.vst?
vstAssignedThisTrack = true
selectedVst = @state.configureTracks.editingTrack.vst.file
vstSettingBtnClasses = classNames({'button-orange': vstAssignedThisTrack, 'button-grey': !vstAssignedThisTrack})
`<div className="audio">
2015-10-30 14:59:50 +00:00
<div className="audio-input-ports">
<h3>Audio Input Ports</h3>
<p>Select one or two inputs ports to assign to this track. Note that if you assign a single input port, the app will automatically duplicate this port into a stereo track.</p>
<select className="input-one input-selectors" name="input-one" onChange={this.inputChanged} value={inputOneValue}>
2015-10-30 14:59:50 +00:00
{inputOneOptions}
</select>
<select className="input-two input-selectors" name="input-two" onChange={this.inputChanged} value={inputTwoValue}>
2015-10-30 14:59:50 +00:00
{inputTwoOptions}
</select>
</div>
<div className="instrument-selection">
<h3>Instrument</h3>
2015-11-09 21:33:04 +00:00
<select className="instrument-pick" name="instrument" onChange={this.instrumentSelected} value={selectedInstrument} disabled={instrumentDisabled}>
2015-10-30 14:59:50 +00:00
{instruments}
</select>
</div>
<div className="audio-effects">
2015-12-22 15:32:22 +00:00
<h3>Audio Effects (optional)</h3>
2015-11-09 21:33:04 +00:00
<select className="vsts" name="vsts" onChange={this.vstsChanged} value={selectedVst} disabled={vstDisabled}>
2015-11-01 12:39:51 +00:00
{vsts}
2015-10-30 14:59:50 +00:00
</select>
2015-11-09 21:33:04 +00:00
<a className="manage-audio-plugins" onClick={this.manageAudioPlugins}>manage audio plugins <div className="down-arrow"></div></a>
<div className="settings-holder">
<a onClick={this.vstSettings} className={vstSettingBtnClasses}>SETTINGS . . .</a>
</div>
2015-12-22 15:32:22 +00:00
{initialScan}
2015-11-13 21:35:13 +00:00
{scan}
2015-11-01 12:39:51 +00:00
</div>
2015-11-09 21:33:04 +00:00
</div>`
renderMidi: () ->
midiInterfaces = []
midiInterfaces.push(`<option key="" value="">Select a MIDI interface</option>`)
2015-11-09 21:33:04 +00:00
midiInstruments = []
instruments = []
for instrument in context.JK.server_to_client_instrument_alpha
instruments.push(`<option key={instrument.server_id} value={instrument.server_id}>{instrument.display}</option>`)
2015-11-09 21:33:04 +00:00
selectedMidiInterface = ''
2015-11-13 20:00:37 +00:00
selectedInstrument = context.JK.client_to_server_instrument_map[50].server_id # default to electric guitar
2015-11-09 21:33:04 +00:00
selectedMidiInstrument = ''
instrumentDisabled = true
midiInstrumentDisabled = true
vstAssignedThisTrack = false
if @state.configureTracks?
2015-12-23 03:28:19 +00:00
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>`
2015-11-09 21:33:04 +00:00
logger.debug("current midi device: " + @state.configureTracks.editingTrack.midiDeviceIndex)
selectedMidiInterface = @state.midiInterface || @state.configureTracks.editingTrack.midiDeviceIndex
2015-11-09 21:33:04 +00:00
selectedInstrument = @state.configureTracks.editingTrack.instrument_id if @state.configureTracks.editingTrack.instrument_id?
instrumentDisabled = !@state.midiInterface? || !selectedMidiInterface?
2015-12-23 17:31:10 +00:00
midiInstrumentDisabled = @state.configureTracks.unscanned
2015-11-09 21:33:04 +00:00
instrumentDisabled = false
if @state.configureTracks.editingTrack.vst?
vstAssignedThisTrack = true
selectedMidiInstrument = @state.configureTracks.editingTrack.vst.file
vstSettingBtnClasses = classNames({'button-orange': vstAssignedThisTrack, 'button-grey': !vstAssignedThisTrack})
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
for midiDevice in @state.configureTracks.attachedMidiDevices.midiDevices
midiInterfaces.push(`<option value={midiDevice.deviceIndex}>{midiDevice.deviceName}</option>`)
for plugin in @state.configureTracks.vstPluginList.vsts
if plugin.isInstrument == true
midiInstruments.push(`<option key={plugin.file} value={plugin.file}>{plugin.name} by {plugin.manuf}</option>`)
2015-11-09 21:33:04 +00:00
else if plugin.category == 'NONE'
midiInstruments.push(`<option key={plugin.file} value={plugin.file}>Select a VST or AU instrument</option>`)
2015-11-09 21:33:04 +00:00
`<div className="midi">
<div className="midi-interface">
<h3>MIDI Interface</h3>
2015-12-23 17:31:10 +00:00
<select className="midi-select" name="midi-select" onChange={this.midiInterfaceChanged} value={selectedMidiInterface} disabled={midiInstrumentDisabled} >
2015-11-09 21:33:04 +00:00
{midiInterfaces}
</select>
<a className="scan-midi" onClick={this.scanMidi}>scan for connected MIDI interfaces</a>
</div>
<div className="instrument-selection">
<h3>Instrument</h3>
<select className="instrument-pick" name="instrument" onChange={this.instrumentSelected} value={selectedInstrument} disabled={instrumentDisabled}>
{instruments}
</select>
</div>
<div className="midi-instrument">
<h3>MIDI Instrument (VST or AU Plugin)</h3>
<select className="vsts" name="midi-instrument" onChange={this.vstsChanged} value={selectedMidiInstrument} disabled={midiInstrumentDisabled}>
{midiInstruments}
</select>
<a className="manage-audio-plugins" onClick={this.manageAudioPlugins}>manage audio plugins <div className="down-arrow"></div></a>
<div className="settings-holder">
<a onClick={this.vstSettings} className={vstSettingBtnClasses}>SETTING . . .</a>
</div>
2015-12-23 03:28:19 +00:00
{initialScan}
{scan}
2015-10-30 14:59:50 +00:00
</div>
</div>`
2015-11-09 21:33:04 +00:00
render: () ->
action = 'ADD TRACK'
header = 'add track'
isAudio = !@state.configureTracks? || @state.configureTracks.trackType == 'audio'
isMidi = !isAudio
if isAudio
activeElement = @renderAudio()
scanHelpRight = `<a className="dont-see-plugin right-side" onClick={this.dontSeePlugin}>Don't see your plug-in in the list above?</a>`
2015-11-09 21:33:04 +00:00
else
activeElement = @renderMidi()
scanHelpLeft = `<a className="dont-see-plugin left-side" onClick={this.dontSeePlugin}>Don't see your plug-in in the list above?</a>`
2015-11-09 21:33:04 +00:00
if !@state.configureTracks?.newTrack
action = 'CLOSE'
header = 'update track'
else
cancelBtn = `<a onClick={this.onCancel} className="button-grey">CANCEL</a>`
2015-11-09 21:33:04 +00:00
`<div>
<div className="content-head">
<img className="content-icon" src="/assets/content/icon_add.png" height={19} width={19}/>
<h1>{header}</h1>
</div>
<div className="dialog-inner">
{activeElement}
<div className="actions">
{scanHelpLeft}
2015-11-09 21:33:04 +00:00
{cancelBtn}
<a onClick={this.doClose} className="button-orange">{action}</a>
{scanHelpRight}
2015-11-09 21:33:04 +00:00
</div>
</div>
</div>`
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
inputChanged: (e) ->
$root = $(@getDOMNode())
$select1 = $root.find('.input-one')
$select2 = $root.find('.input-two')
audioInput1 = $select1.val()
audioInput2 = $select2.val()
if audioInput1 == ''
audioInput1 = null
if audioInput2 == ''
audioInput2 = null
logger.debug("ConfigureLiveTracksDialog: ", audioInput1, audioInput2)
2015-11-09 21:33:04 +00:00
if audioInput1? && audioInput1 == audioInput2
e.preventDefault()
# TODO: tell user they can't do this
return
ConfigureTracksActions.associateInputsWithTrack(audioInput1, audioInput2)
2015-11-09 21:33:04 +00:00
vstsChanged: (e) ->
$root = $(@getDOMNode())
$select = $root.find('select.vsts')
vstSelected = $select.val()
2015-12-12 03:14:00 +00:00
#if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
2015-11-09 21:33:04 +00:00
if @state.configureTracks?.trackType == 'midi'
2015-12-04 21:29:59 +00:00
@updateMidiAssociations()
else
2015-12-12 03:14:00 +00:00
logger.debug("associating vst", vstSelected)
2015-12-04 21:29:59 +00:00
ConfigureTracksActions.associateVSTWithTrack(vstSelected)
2015-11-09 21:33:04 +00:00
@setState({midiInterface: null})
instrumentSelected: (e) ->
$root = $(@getDOMNode())
$select = $root.find('.instrument-pick')
instrumentId = $select.val()
ConfigureTracksActions.associateInstrumentWithTrack(instrumentId)
doClose: (e) ->
2015-11-01 12:39:51 +00:00
e.preventDefault()
2015-11-09 21:33:04 +00:00
# check that instrument is selected
$root = $(@getDOMNode())
$instrument = $root.find('.instrument-pick')
instrumentId = $instrument.val()
$select1 = $root.find('.input-one')
$select2 = $root.find('.input-two')
audioInput1 = $select1.val()
audioInput2 = $select2.val()
if audioInput1 == ''
audioInput1 = null
if audioInput2 == ''
audioInput2 = null
if audioInput1 == null && audioInput2 == null
context.JK.Banner.showAlert("At least one input must be specified.")
return
if instrumentId == null || instrumentId == ''
context.JK.Banner.showAlert("Please select an instrument.")
return
@app.layout.closeDialog('configure-live-tracks-dialog', false)
onCancel: (e) ->
ConfigureTracksActions.cancelEdit()
@app.layout.closeDialog('configure-live-tracks-dialog', true)
2015-11-01 12:39:51 +00:00
vstSettings: (e) ->
e.preventDefault()
ConfigureTracksActions.showVstSettings()
2015-11-09 21:33:04 +00:00
2015-10-30 14:59:50 +00:00
componentDidMount: () ->
$root = $(@getDOMNode())
2015-11-09 21:33:04 +00:00
componentWillUpdate: () ->
$root = $(@getDOMNode())
componentDidUpdate: () ->
$root = $(@getDOMNode())
$manageAudioPlugins = $root.find('.manage-audio-plugins')
unless $manageAudioPlugins.data('initialized')
$manageAudioPlugins.manageVsts().on(context.JK.EVENTS.VST_OPERATION_SELECTED, @vstOperation).data('initialized', true)
if true # easyDropdown support
context.JK.dropdown($root.find('select'))
$root.find('select.input-selectors').unbind('change').change(@inputChanged)
$root.find('select.instrument-pick').unbind('change').change(@instrumentSelected)
$root.find('select.vsts').unbind('change').change(@vstsChanged)
2015-11-09 21:33:04 +00:00
trackTypeChanged: (event) ->
if @ignoreICheck
logger.debug("ignoring track type changed")
return
$checkedType = $(event.target);
value = $checkedType.val()
logger.debug("trackTypeChanged: " + value, $checkedType)
ConfigureTracksActions.desiredTrackType(value)
#@setState({trackType: value})
initialScan: (e) ->
e.preventDefault()
ConfigureTracksActions.vstScan()
dontSeePlugin: (e) ->
e.preventDefault()
context.JK.popExternalLink('https://jamkazam.desk.com/customer/portal/articles/2252557-adding-a-scan-folder-path-for-plugins')
2015-11-09 21:33:04 +00:00
vstOperation: (e, data) ->
if data.vstOperation == 'scan'
ConfigureTracksActions.vstScan()
else if data.vstOperation == 'clear'
ConfigureTracksActions.clearVsts()
else if data.vstOperation == 'manage'
ConfigureTracksActions.manageVsts()
2015-11-09 21:33:04 +00:00
manageAudioPlugins: (e) ->
e.preventDefault()
$root = $(@getDOMNode())
$manageAudioPlugins = $root.find('.manage-audio-plugins')
$manageAudioPlugins.btOn()
scanMidi: (e) ->
e.preventDefault()
ConfigureTracksActions.midiScan()
midiInterfaceChanged: (e) ->
2015-12-04 21:29:59 +00:00
@updateMidiAssociations()
updateMidiAssociations: (e) ->
2015-11-09 21:33:04 +00:00
$root = $(@getDOMNode())
$select = $root.find('select.midi-select')
midiInterface = $select.val()
2015-12-04 21:29:59 +00:00
$select = $root.find('select.vsts')
vstSelected = $select.val()
logger.debug("updateMidiAssocations", vstSelected, midiInterface)
2015-12-23 03:28:19 +00:00
#if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
#else
# vstSelected = null
2015-12-04 21:29:59 +00:00
2015-11-09 21:33:04 +00:00
if midiInterface == ''
midiInterface = null
2015-12-04 21:29:59 +00:00
midi = @state.midiInterface || midiInterface
if vstSelected? && midi?
logger.debug("updating midi:#{midi} & vst: #{vstSelected.file}")
ConfigureTracksActions.associateVSTWithTrack(vstSelected)
setTimeout((() =>
ConfigureTracksActions.associateMIDIWithTrack(midi)
), 250)
else if midi?
logger.debug("updating midi:#{midiInterface}")
ConfigureTracksActions.associateMIDIWithTrack(midiInterface)
2015-12-23 03:28:19 +00:00
else
logger.debug("unassociating midi:#{midiInterface}")
ConfigureTracksActions.associateMIDIWithTrack(null)
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
@setState({midiInterface: midiInterface})
2015-12-04 21:29:59 +00:00
2015-10-30 14:59:50 +00:00
})