diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb index ce830d39d..fdffa9dcd 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb @@ -19,7 +19,7 @@ co-writing music, or just hopping into open jams with other musicians for fun. - Check out this Getting Started YouTube Video for help setting up + Check out this Getting Started Guide for help setting up.

Learn & Play Along With Your Favorite Music
diff --git a/web/app/assets/images/web/saturated-ok.png b/web/app/assets/images/web/saturated-ok.png new file mode 100644 index 000000000..efab0f421 Binary files /dev/null and b/web/app/assets/images/web/saturated-ok.png differ diff --git a/web/app/assets/javascripts/react-components/SessionBackingTrack.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionBackingTrack.js.jsx.coffee index 6fb659414..a0a695f73 100644 --- a/web/app/assets/javascripts/react-components/SessionBackingTrack.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionBackingTrack.js.jsx.coffee @@ -21,7 +21,8 @@ MixerActions = @MixerActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@props.mixers['master'].mixer, @props.mixers['personal'].mixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([@props.mixers['master'].mixer, @props.mixers['personal'].mixer], muting) render: () -> @@ -76,7 +77,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@mixers()} + {mixers:@mixers(), trackType: 'SessionBackingTracks', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionChatMixer.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionChatMixer.js.jsx.coffee index 36e047005..8922949a5 100644 --- a/web/app/assets/javascripts/react-components/SessionChatMixer.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionChatMixer.js.jsx.coffee @@ -11,7 +11,8 @@ context = window muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@props.mixers.mixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([@props.mixers.mixer], muting) render: () -> diff --git a/web/app/assets/javascripts/react-components/SessionJamTrack.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionJamTrack.js.jsx.coffee index e57edee87..f3a4166de 100644 --- a/web/app/assets/javascripts/react-components/SessionJamTrack.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionJamTrack.js.jsx.coffee @@ -21,7 +21,8 @@ MixerActions = @MixerActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@props.mixers['master'].mixer, @props.mixers['personal'].mixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([@props.mixers['master'].mixer, @props.mixers['personal'].mixer], muting) render: () -> @@ -76,7 +77,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@mixers()} + {mixers:@mixers(), trackType: 'SessionJamTracks', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionJamTrackCategory.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionJamTrackCategory.js.jsx.coffee index 9997b410a..d81a88ada 100644 --- a/web/app/assets/javascripts/react-components/SessionJamTrackCategory.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionJamTrackCategory.js.jsx.coffee @@ -66,7 +66,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@props.mixers} + {mixers:@props.mixers, trackType: 'SessionJamTrackCategory', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionMasterMyTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMasterMyTracks.js.jsx.coffee index 5fdde3e90..d33703280 100644 --- a/web/app/assets/javascripts/react-components/SessionMasterMyTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMasterMyTracks.js.jsx.coffee @@ -4,7 +4,11 @@ logger = context.JK.logger @SessionMasterMyTracks = React.createClass({ - mixins: [@SessionMyTracksMixin, Reflux.listenTo(@SessionMyTracksStore,"onInputsChanged"), Reflux.listenTo(@AppStore,"onAppInit")] + mixins: [Reflux.listenTo(@SessionMyTracksStore,"onInputsChanged")] + + + onInputsChanged: (update) -> + this.setState(update) render: () -> @@ -13,7 +17,7 @@ logger = context.JK.logger if this.state.tracks.length > 0 for track in this.state.tracks - track.mode = MIX_MODES.MASTER + track.mode = @props.mode tracks.push(``) if @state.chat @@ -24,7 +28,7 @@ logger = context.JK.logger logger.debug("no 'my inputs' for master mix") `

-

my live tracks

+

audio tracks

{content} {tracks} @@ -32,8 +36,6 @@ logger = context.JK.logger
` getInitialState:() -> - {tracks:[], session: null} + {tracks:[], session: null, chat:null} - onAppInit: (app) -> - @app = app }) diff --git a/web/app/assets/javascripts/react-components/SessionMediaTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMediaTracks.js.jsx.coffee index afebb8978..0e5c3924e 100644 --- a/web/app/assets/javascripts/react-components/SessionMediaTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMediaTracks.js.jsx.coffee @@ -188,6 +188,7 @@ ChannelGroupIds = context.JK.ChannelGroupIds render: () -> + content = null scrollerClassData = {'session-tracks-scroller': true} mediaOptions = `
@@ -248,6 +249,8 @@ ChannelGroupIds = context.JK.ChannelGroupIds Close {mediaType} ` + content = null + if this.state.mediaSummary.backingTrackOpen @@ -257,7 +260,7 @@ ChannelGroupIds = context.JK.ChannelGroupIds else if this.state.mediaSummary.recordingOpen - mediaTracks.push(``) + mediaTracks.push(``) for recordedTrack in @state.recordedTracks recordedTrack.mode = @props.mode mediaTracks.push(``) @@ -274,7 +277,7 @@ ChannelGroupIds = context.JK.ChannelGroupIds # The Category mixer # The Metronome # All the JamTracks - mediaTracks.push(``) + mediaTracks.push(``) if @state.metronome? # && @state.jamTrackMixdown.id == null @state.metronome.mode = @props.mode @@ -299,9 +302,10 @@ ChannelGroupIds = context.JK.ChannelGroupIds scrollerClasses = classNames(scrollerClassData) `
-

recorded audio

+

recorded audio ?

{contents}
+ {content} {mediaTracks}
` @@ -326,6 +330,9 @@ ChannelGroupIds = context.JK.ChannelGroupIds componentDidMount: () -> context.JK.HandleBackingTrackSelectedCallback2 = @handleBackingTrackSelectedCallback + $root = $(@getDOMNode()) + context.JK.helpBubble($root.find(".session-tracks-help"), "session-media-tracks-instructions", {}, {offsetParent:$root.closest('.top-parent'), positions: ['right', 'bottom'], width:450}) + componentDidUpdate: () -> diff --git a/web/app/assets/javascripts/react-components/SessionMetronome.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMetronome.js.jsx.coffee index afd9567da..f9fe8acd6 100644 --- a/web/app/assets/javascripts/react-components/SessionMetronome.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMetronome.js.jsx.coffee @@ -12,7 +12,8 @@ MIX_MODES = context.JK.MIX_MODES muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@mixer()], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([@mixer()], muting) render: () -> @@ -78,7 +79,7 @@ MIX_MODES = context.JK.MIX_MODES $mute, 'SessionTrackVolumeHover', () => - {mixers:@mixers()} + {mixers:@mixers(), trackType: 'SessionMetronome', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$topParent}) diff --git a/web/app/assets/javascripts/react-components/SessionMyChat.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMyChat.js.jsx.coffee index 1fad123f2..eaa4f8636 100644 --- a/web/app/assets/javascripts/react-components/SessionMyChat.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMyChat.js.jsx.coffee @@ -17,7 +17,8 @@ MixerActions = @MixerActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([mixers.mixer, mixers.oppositeMixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([mixers.mixer, mixers.oppositeMixer], muting) render: () -> @@ -63,7 +64,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@mixers()} + {mixers:@mixers(), trackType: 'SessionMyChat', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) }) diff --git a/web/app/assets/javascripts/react-components/SessionMyTrack.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMyTrack.js.jsx.coffee index a631b41db..4e9e480fb 100644 --- a/web/app/assets/javascripts/react-components/SessionMyTrack.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMyTrack.js.jsx.coffee @@ -17,7 +17,7 @@ ConfigureTracksActions = @ConfigureTracksActions else clientStats = null {stats: clientStats} - + handleMute: (e) -> e.preventDefault() @@ -27,7 +27,8 @@ ConfigureTracksActions = @ConfigureTracksActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([this.props.mixers.mixer, this.props.mixers.oppositeMixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([this.props.mixers.mixer, this.props.mixers.oppositeMixer], muting) render: () -> @@ -103,7 +104,7 @@ ConfigureTracksActions = @ConfigureTracksActions $mute, 'SessionTrackVolumeHover', () => - {mixers:this.props.mixers} + {mixers:this.props.mixers, trackType: 'SessionMyTrack', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionMyTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMyTracks.js.jsx.coffee index 4a3294724..8995d6450 100644 --- a/web/app/assets/javascripts/react-components/SessionMyTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMyTracks.js.jsx.coffee @@ -11,19 +11,21 @@ SessionActions = context.SessionActions SessionActions.leaveSession.trigger({location: '/client#/account/audio'}) + render: () -> content = null videoTutorialLink = null tracks = [] - if @state.session?.preppingVstEnable + if @state.mySession?.preppingVstEnable delayVstEnable = `
Enabling VSTs ...
` else videoTutorialLink = `` if @state.tracks.length > 0 for track in @state.tracks + track = $.extend({}, track) track.mode = @props.mode tracks.push(``) @@ -31,7 +33,7 @@ SessionActions = context.SessionActions @state.chat.mode = @props.mode tracks.push(``) - else if @state.session? && @state.session.inSession() + else if @state.mySession? && @state.mySession.inSession() content = `

You have not set up any inputs for your instrument or vocals. @@ -41,7 +43,7 @@ SessionActions = context.SessionActions

` `
-

my live tracks

+

audio inputs ?

{videoTutorialLink} @@ -54,7 +56,11 @@ SessionActions = context.SessionActions
` getInitialState:() -> - {tracks:[], session: null, chat:null} + {tracks:[], mySession: null, chat:null} + + componentDidMount:() -> + $root = $(@getDOMNode()) + context.JK.helpBubble($root.find(".session-tracks-help"), "session-audio-inputs-instructions", {}, {offsetParent:$root.closest('.top-parent'), positions: ['right', 'bottom'], width:450}) onAppInit: (app) -> @app = app diff --git a/web/app/assets/javascripts/react-components/SessionNotification.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionNotification.js.jsx.coffee index b1decbf08..2b885972b 100644 --- a/web/app/assets/javascripts/react-components/SessionNotification.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionNotification.js.jsx.coffee @@ -25,5 +25,5 @@ context = window context.JK.popExternalLinks($root) if @props.detail? - context.JK.hoverBubble($root, @props.detail, {offsetParent:$root.closest('.top-parent'), positions: ['left', 'bottom']}) + context.JK.hoverBubble($root, @props.detail, {offsetParent:$root.closest('.screen'), positions: ['left', 'bottom']}) }) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/SessionOtherTrack.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionOtherTrack.js.jsx.coffee index 8095b1034..67001d6ef 100644 --- a/web/app/assets/javascripts/react-components/SessionOtherTrack.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionOtherTrack.js.jsx.coffee @@ -28,7 +28,8 @@ MixerActions = @MixerActions mixers = if this.props.tracks.length > 0 then this.props.tracks[0].mixers else {} - MixerActions.mute([mixers.mixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + #MixerActions.mute([mixers.mixer], muting) render: () -> @@ -108,7 +109,7 @@ MixerActions = @MixerActions 'SessionTrackVolumeHover', () => mixers = if this.props.tracks.length > 0 then this.props.tracks[0].mixers else {} - {mixers:mixers} + {mixers:mixers, trackType: 'SessionOtherTrack', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.screen')}) diff --git a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee index 5566c8595..7f2e095ae 100644 --- a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee @@ -1,11 +1,12 @@ +$ = jQuery context = window MixerActions = context.MixerActions @SessionOtherTracks = React.createClass({ - mixins: [Reflux.listenTo(@SessionOtherTracksStore,"onInputsChanged"), Reflux.listenTo(@AppStore,"onAppInit")] + mixins: [@SessionMyTracksMixin, Reflux.listenTo(@SessionOtherTracksStore,"onOtherInputsChanged"), Reflux.listenTo(@SessionMyTracksStore,"onInputsChanged"), Reflux.listenTo(@AppStore,"onAppInit")] - onInputsChanged: (sessionMixers) -> + onOtherInputsChanged: (sessionMixers) -> session = sessionMixers.session mixers = sessionMixers.mixers noAudioUsers = mixers.noAudioUsers @@ -95,16 +96,26 @@ MixerActions = context.MixerActions content = null participants = [] - noOthers = `
No other musicians are in your session.
` + if @state.tracks.length > 0 + for track in @state.tracks + track = $.extend({}, track) + track.mode = @props.mode + participants.push(``) + + if @state.chat + chat= $.extend({}, @state.chat) + chat.mode = @props.mode + participants.push(``) if this.state.participants.length > 0 for participant in this.state.participants + participant.mode = @props.mode participants.push(``) else if this.state.session? && this.state.session.inSession() - content = noOthers + content = null `
-

other live tracks

+

personal mix ?

{content} @@ -114,7 +125,12 @@ MixerActions = context.MixerActions
` getInitialState:() -> - {participants:[], session: null} + {participants:[], session: null, mySession: null, tracks:[], chat:null} + + componentDidMount:() -> + $root = $(@getDOMNode()) + context.JK.helpBubble($root.find(".session-tracks-help"), "session-personal-mix-instructions", {}, {offsetParent:$root.closest('.top-parent'), positions: ['right', 'bottom'], width:450}) + onAppInit: (app) -> @app = app diff --git a/web/app/assets/javascripts/react-components/SessionRecordedCategory.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionRecordedCategory.js.jsx.coffee index fff2db3d6..a5f7814d2 100644 --- a/web/app/assets/javascripts/react-components/SessionRecordedCategory.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionRecordedCategory.js.jsx.coffee @@ -13,7 +13,8 @@ MixerActions = @MixerActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([this.props.mixers.mixer, this.props.mixers.oppositeMixer], muting) + # this button is annoying. the hover shows mute and it's good to use instead + # MixerActions.mute([this.props.mixers.mixer, this.props.mixers.oppositeMixer], muting) render: () -> @@ -69,7 +70,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@props.mixers} + {mixers:@props.mixers, trackType: 'SessionRecordedCategory', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionRecordedTrack.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionRecordedTrack.js.jsx.coffee index f8db4915d..c6214e77e 100644 --- a/web/app/assets/javascripts/react-components/SessionRecordedTrack.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionRecordedTrack.js.jsx.coffee @@ -76,7 +76,7 @@ MixerActions = @MixerActions $mute, 'SessionTrackVolumeHover', () => - {mixers:@mixers()} + {mixers:@mixers(), trackType: 'SessionRecordedTrack', mode: @props.mode} , {width:235, positions:['right', 'left'], offsetParent:$root.closest('.top-parent')}) diff --git a/web/app/assets/javascripts/react-components/SessionScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionScreen.js.jsx.coffee index 610fe05e4..2d97cbeff 100644 --- a/web/app/assets/javascripts/react-components/SessionScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionScreen.js.jsx.coffee @@ -30,7 +30,6 @@ SessionActions = @SessionActions {videoBtn} {filesBtn} -
diff --git a/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee index 8d41f2017..c1b4c923d 100644 --- a/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee @@ -21,13 +21,13 @@ ptrCount = 0 onInputsChanged: (sessionMixers) -> mixers = sessionMixers.mixers - newMixers = mixers.refreshMixer(@state.mixers) + if mixers? + newMixers = mixers.refreshMixer(@state.mixers) - newMixers = {} unless newMixers? - sessionController = sessionMixers.session.sessionController() - logger.debug("session controller", sessionController) + newMixers = {} unless newMixers? + sessionController = sessionMixers.session.sessionController() - this.setState({mixers: newMixers, sessionController: sessionController}) + this.setState({mixers: newMixers, sessionController: sessionController}) getInitialState: () -> {mixers: this.props.mixers, ptr: "STVH#{ptrCount++}", sessionController: window.SessionStore.helper.sessionController()} @@ -38,10 +38,10 @@ ptrCount = 0 muting = $(e.currentTarget).is('.enabled') # if it's a chat, my input, or media track, or jam track, or media track group, then do both mixers at the same time - if @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputMusicGroup || @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputChatGroup || @state.mixers.mixer.group_id == ChannelGroupIds.MediaTrackGroup || @state.mixers.mixer.group_id == ChannelGroupIds.JamTrackGroup || ((@state.mixers.mixer.group_id == ChannelGroupIds.MonitorCatGroup || @state.mixers.mixer.group_id == ChannelGroupIds.MasterCatGroup) && @state.mixers.mixer.name == CategoryGroupIds.MediaTrack) - MixerActions.mute([this.state.mixers.mixer, this.state.mixers.oppositeMixer], muting) - else - MixerActions.mute(this.state.mixers.mixer, muting) + #if @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputMusicGroup || @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputChatGroup || @state.mixers.mixer.group_id == ChannelGroupIds.MediaTrackGroup || @state.mixers.mixer.group_id == ChannelGroupIds.JamTrackGroup || ((@state.mixers.mixer.group_id == ChannelGroupIds.MonitorCatGroup || @state.mixers.mixer.group_id == ChannelGroupIds.MasterCatGroup) && @state.mixers.mixer.name == CategoryGroupIds.MediaTrack) + # MixerActions.mute([this.state.mixers.mixer, this.state.mixers.oppositeMixer], muting) + #else + # MixerActions.mute(this.state.mixers.mixer, muting) handleMuteCheckbox: (e) -> @@ -76,6 +76,49 @@ ptrCount = 0 'muted' : muteMixer?.mute }) + textualHelp = null + + if (@props.trackType == 'SessionMyTrack' || @props.trackType == 'SessionMyChat') && @props.mode == context.JK.MIX_MODES.MASTER + textualHelp = `
+

Use the gain knobs on your + audio interface or this slider to + adjust your input level up/down.

+ +

Play or sing, and watch where the + meter lights peak.

+ +

These lights should reach the top of + the green lights, and maybe one light + into the orange/red zone.

+
` + else if @props.trackType == 'SessionOtherTrack' || @props.trackType == 'SessionMyTrack' + textualHelp = `
+

Use this slider to adjust this audio + track's volume up or down to get + your mix where you like.

+ +

This only affects what you hear, not + what others hear in your session.

+ +

Your personal mix is what will be + used for recordings and broadcasts + you personally control in sessions.

+
` + else + textualHelp = `
+

Use this slider to adjust this audio + track's volume up or down to get + your mix where you like.

+ +

This only affects what you hear, not + what others hear in your session.

+ +

Your personal mix is what will be + used for recordings and broadcasts + you personally control in sessions.

+
` + + `
@@ -95,11 +138,7 @@ ptrCount = 0
-
-

Use this slider to control the volume of this track in your personal mix.

-

This will not affect the volume of this track for other musicians in the session.

-

To adjust master levels for all musicians for recordings and broadcasts, use Mixer button in the toolbar.

-
+ {textualHelp}
close 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 a475caad5..ae4a65a7f 100644 --- a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee +++ b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee @@ -523,7 +523,7 @@ MIX_MODES = context.JK.MIX_MODES; # supply the master mixer of a media track, and this function will harvest out the rest mediaMixers:(masterMixer, isOpener) -> - personalMixer = if isOpener then @getMixerByResourceId(masterMixer.rid, MIX_MODES.PERSONAL) else null + personalMixer = if isOpener then @getMixerByResourceId(masterMixer.rid, MIX_MODES.PERSONAL) else masterMixer personalVuMixer = if isOpener then personalMixer else masterMixer { isOpener: isOpener @@ -569,6 +569,7 @@ MIX_MODES = context.JK.MIX_MODES; null getMixer: (mixerId, mode) -> + beforeMode = mode mode = @mixMode unless mode? @allMixers[(if mode then 'M' else 'P') + mixerId] 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 6a6430b33..87fe9f0fb 100644 --- a/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee +++ b/web/app/assets/javascripts/react-components/mixins/SessionMyTracksMixin.js.coffee @@ -89,7 +89,7 @@ MIDI_TRACK = context.JK.MIDI_TRACK else logger.warn("SessionMyTracks: unable to find participant") - this.setState(tracks: tracks, session:session, chat: chat) + this.setState(tracks: tracks, mySession:session, chat: chat) } \ No newline at end of file diff --git a/web/app/assets/javascripts/wizard/gear/gear_wizard.js b/web/app/assets/javascripts/wizard/gear/gear_wizard.js index ebf6202dd..5965657dc 100644 --- a/web/app/assets/javascripts/wizard/gear/gear_wizard.js +++ b/web/app/assets/javascripts/wizard/gear/gear_wizard.js @@ -218,11 +218,13 @@ var networkTest = $wizardSteps.filter($('.network-test')) wizard = new context.JK.Wizard(app); - stepUnderstandGear.initialize($wizardSteps.filter($('[layout-wizard-step=0]')), self); - stepSelectGear.initialize($wizardSteps.filter($('[layout-wizard-step=1]')), self); - stepConfigureTracks.initialize($wizardSteps.filter($('[layout-wizard-step=2]')), self); - stepConfigureVoiceChat.initialize($wizardSteps.filter($('[layout-wizard-step=3]')), self); - stepDirectMonitoring.initialize($wizardSteps.filter($('[layout-wizard-step=4]')), self); + + var operatingSystem = context.JK.GetOSAsString(); + stepUnderstandGear.initialize($wizardSteps.filter($('[layout-wizard-step=0]')), self, operatingSystem); + stepSelectGear.initialize($wizardSteps.filter($('[layout-wizard-step=1]')), self, operatingSystem); + stepConfigureTracks.initialize($wizardSteps.filter($('[layout-wizard-step=2]')), self, operatingSystem); + stepConfigureVoiceChat.initialize($wizardSteps.filter($('[layout-wizard-step=3]')), self, operatingSystem); + stepDirectMonitoring.initialize($wizardSteps.filter($('[layout-wizard-step=4]')), self, operatingSystem); stepSuccess.initialize($wizardSteps.filter($('.success')), self); var dynamicStepCount = 5 diff --git a/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js b/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js index f8aa60839..3d8f5fa11 100644 --- a/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js +++ b/web/app/assets/javascripts/wizard/gear/step_configure_tracks.js @@ -18,10 +18,16 @@ var wizard = null; var firstTime = true; var helpTimeout = null; + var operatingSystem = null; function handleHelp() { - return "https://www.youtube.com/watch?v=SjMeMZpKNR4" + if (operatingSystem == "Win32") { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123618-setup-wizard-windows-step-3-configuring-your-audio-input-tracks" + } + else { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123593-setup-wizard-mac-step-3-configuring-your-audio-input-tracks" + } } function handleNext() { @@ -62,10 +68,12 @@ }, 2000) } } - function initialize(_$step, _wizard) { + function initialize(_$step, _wizard, _operatingSystem) { $step = _$step; wizard = _wizard; + operatingSystem = _operatingSystem; $watchVideoBtn = $step.find('.watch-video') + $watchVideoBtn.attr('href', handleHelp()) configureTracksHelper.initialize($step); } diff --git a/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js b/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js index b33621450..b3a64241d 100644 --- a/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js +++ b/web/app/assets/javascripts/wizard/gear/step_configure_voice_chat.js @@ -22,9 +22,15 @@ var $watchVideoBtn = null; var firstTime = true; var helpTimeout = null; + var operatingSystem = null; function handleHelp() { - return "https://www.youtube.com/watch?v=f7niycdWm7Y"; + if (operatingSystem == "Win32") { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123633-setup-wizard-windows-step-4-setting-up-a-chat-mic" + } + else { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123594-setup-wizard-mac-step-4-setting-up-a-chat-mic" + } } function newSession() { @@ -66,12 +72,14 @@ } } - function initialize(_$step) { + function initialize(_$step, _wizard, _operatingSystem) { $step = _$step; + operatingSystem = _operatingSystem; voiceChatHelper.initialize($step, 'configure_voice_gear_wizard', true, {vuType: "vertical", lightCount: 8, lightWidth: 3, lightHeight: 10}, 101); $watchVideoBtn = $step.find('.watch-video') + $watchVideoBtn.attr('href', handleHelp()) } this.handleHelp = handleHelp; diff --git a/web/app/assets/javascripts/wizard/gear/step_direct_monitoring.js b/web/app/assets/javascripts/wizard/gear/step_direct_monitoring.js index b85464729..ade7a9549 100644 --- a/web/app/assets/javascripts/wizard/gear/step_direct_monitoring.js +++ b/web/app/assets/javascripts/wizard/gear/step_direct_monitoring.js @@ -16,7 +16,7 @@ var $watchVideoBtn = null; var firstTime = true; var helpTimeout = null; - + var operatingSystem = null; function checkIfPlaying() { var currentPositionMs = context.jamClient.SessionCurrrentPlayPosMs(); var atEnd = currentPositionMs == 0 || trackDurationMs == currentPositionMs; @@ -62,7 +62,12 @@ } function handleHelp() { - return "https://www.youtube.com/watch?v=-nC-D3JBHnk"; + if (operatingSystem == "Win32") { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123634-setup-wizard-windows-step-5-turning-off-direct-monitoring" + } + else { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123595-setup-wizard-mac-step-5-turning-off-direct-monitoring" + } } function handleNext() { @@ -126,7 +131,7 @@ } } - function initialize(_$step) { + function initialize(_$step, _wizard, _operatingSystem) { $step = _$step; $directMonitoringBtn = $step.find('.test-direct-monitoring'); @@ -134,6 +139,8 @@ $adjustSettingsDirectMonitor = $step.find('.adjust-settings-direct-monitor'); $adjustSettingsDirectMonitor.on('click', onAdjustGearRequested) $watchVideoBtn = $step.find('.watch-video') + operatingSystem = _operatingSystem + $watchVideoBtn.attr('href', handleHelp()) } this.handleHelp = handleHelp; diff --git a/web/app/assets/javascripts/wizard/gear/step_select_gear.js b/web/app/assets/javascripts/wizard/gear/step_select_gear.js index e3e7b4e44..79ffd0f68 100644 --- a/web/app/assets/javascripts/wizard/gear/step_select_gear.js +++ b/web/app/assets/javascripts/wizard/gear/step_select_gear.js @@ -1095,8 +1095,14 @@ initializeNextButtonState(); } + function handleHelp() { - return "https://www.youtube.com/channel/UC38nc9MMZgExJAd7ca3rkUA/videos" + if (operatingSystem == "Win32") { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123617-setup-wizard-windows-step-2-setting-up-your-audio-interface" + } + else { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123592-setup-wizard-mac-step-2-setting-up-your-audio-interface" + } } function handleNext() { @@ -1303,7 +1309,7 @@ } } - function initialize(_$step, _wizard) { + function initialize(_$step, _wizard, _operatingSystem) { $step = _$step; wizard = _wizard; @@ -1330,7 +1336,10 @@ $resyncStatusText = $step.find('.resynctext'); $latencyScoreBox = $step.find('.latency-score-section') - operatingSystem = context.JK.GetOSAsString(); + operatingSystem = _operatingSystem; + + $watchVideoBtn.attr('href', handleHelp()) + frameBuffers.initialize($knobs); $(frameBuffers) .on(frameBuffers.FRAMESIZE_CHANGED, onFramesizeChanged) diff --git a/web/app/assets/javascripts/wizard/gear/step_understand_gear.js b/web/app/assets/javascripts/wizard/gear/step_understand_gear.js index 2a1de8bb6..e94f12a42 100644 --- a/web/app/assets/javascripts/wizard/gear/step_understand_gear.js +++ b/web/app/assets/javascripts/wizard/gear/step_understand_gear.js @@ -9,7 +9,12 @@ var operatingSystem; function handleHelp() { - return "https://www.youtube.com/watch?v=Z1GxCljtdCY"; + if (operatingSystem == "Win32") { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123616-setup-wizard-windows-step-1-starting-the-setup-wizard" + } + else { + return "https://jamkazam.freshdesk.com/support/solutions/articles/66000123577-setup-wizard-mac-step-1-starting-the-setup-wizard" + } } function beforeShow() { @@ -18,13 +23,13 @@ if (operatingSystem == "Win32") { $watchVideo.attr('href', 'https://www.youtube.com/watch?v=Z1GxCljtdCY'); } - $watchVideo.attr('href', videoUrl); + $watchVideo.attr('href', handleHelp()); } - function initialize(_$step) { + function initialize(_$step, _wizard, _operatingSystem) { $step = _$step; - operatingSystem = context.JK.GetOSAsString(); + operatingSystem = _operatingSystem; } this.handleHelp = handleHelp; diff --git a/web/app/assets/stylesheets/client/help.scss b/web/app/assets/stylesheets/client/help.scss index 10d1afa4b..105cd2a15 100644 --- a/web/app/assets/stylesheets/client/help.scss +++ b/web/app/assets/stylesheets/client/help.scss @@ -74,6 +74,10 @@ html { } } + .session-help { + padding:5px; + } + .big-dark-help { font-size:20px; color: $ColorTextTypical; diff --git a/web/app/assets/stylesheets/client/react-components/SessionScreen.scss b/web/app/assets/stylesheets/client/react-components/SessionScreen.scss index b9797b1c3..97d4fef40 100644 --- a/web/app/assets/stylesheets/client/react-components/SessionScreen.scss +++ b/web/app/assets/stylesheets/client/react-components/SessionScreen.scss @@ -210,6 +210,15 @@ $session-screen-divider: 1190px; color: $ColorTextTypical; overflow: hidden; position: relative; + + .session-tracks-help { + font-size:14px; + text-decoration: none; + cursor: pointer; + color:$ColorLink; + top: -2px; + position: relative; + } } .my-tracks-header { @@ -304,10 +313,12 @@ $session-screen-divider: 1190px; } .when-empty { - margin-top: 25px; - margin-left: 22px; + //margin-top: 25px; + //margin-left: 22px; + margin:5px 0 10px 0; color: $ColorTextTypical; overflow: hidden; + font-size:12px; } .session-track-settings { diff --git a/web/app/views/clients/_help.html.slim b/web/app/views/clients/_help.html.slim index 1951c87a4..b4ad3e853 100644 --- a/web/app/views/clients/_help.html.slim +++ b/web/app/views/clients/_help.html.slim @@ -71,6 +71,43 @@ script type="text/template" id="template-help-recording-count" script type="text/template" id="template-help-session-count" | The number of sessions that this {{data.entity_type}} has played in. +script type="text/template" id="template-help-session-audio-inputs-instructions" + .session-audio-inputs-instructions.big-dark-help.session-help + p + | In this Audio Inputs section, set the input level on each of your audio tracks to a healthy level. + br + p + | To do this, hover your mouse over the volume icon on one of your audio tracks. You'll see a slider with meter lights on the sides. Use the gain knobs on your audio interface or the slider in the JamKazam app to adjust your input level up or down. Play and/or sing, and watch where the meter lights peak. These lights should reach the top of the green lights, and maybe one light into the orange/red zone. + br + p + | If your input is set too high, you'll get clipping and distortion. If your input is set too low, your audio may be too soft, or you'll get too much white noise mixed with your audio signal. + +script type="text/template" id="template-help-session-personal-mix-instructions" + .session-personal-mix-instructions.big-dark-help.session-help + p + | In this Personal Mix section, adjust the volume of each audio track in your session to get the mix where you like it. + br + p + | To do this, hover your mouse over the volume icon on any of the audio tracks. You'll see a slider with meter lights on the sides. Pull the slider in the JamKazam app up to make the track louder in the mix, or pull the slider down to make the track softer in the mix. Don't worry, as these changes only affect what you hear - they don't change what others in your sessions hear. + br + p + | Also, please note that your personal mix is the mix that will be used for any recordings that you personally make in the session and also for any broadcast that you personally send from your computer to YouTube, Facebook, etc. If another musician in your session makes a recording or broadcasts your session, that musician's personal mix is the mix that will be used. + + +script type="text/template" id="template-help-session-media-tracks-instructions" + .session-media-tracks-instructions.big-dark-help.session-help + p + | In this Recorded Audio section, you can open recordings you've made in JamKazam sessions, JamTracks (multi-track recordings of popular songs) you've purchased from JamKazam, or audio files (i.e. simple backing tracks). You can also start a metronome that everyone in the session will hear. + br + p + | For any of these features, you can adjust the associated volume of audio in your session to get the mix where you like it. + br + p + | To do this, hover your mouse over the volume icon on any of the audio tracks. You'll see a slider with meter lights on the sides. Pull the slider in the JamKazam app up to make the track louder in your personal mix, or pull the slider down to make the track softer in your mix. Don't worry, as these changes only affect what you hear - they don't change what others in your sessions hear. + br + p + | Also, please note that your personal mix is the mix that will be used for any recordings that you personally make in the session and also for any broadcast that you personally send from your computer to YouTube, Facebook, etc. If another musician in your session makes a recording or broadcasts your session, that musician's personal mix is the mix that will be used. + script type="text/template" id="template-help-musician-score-count" .help-musician-score-count p diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb index daa6ae36d..7c0fd678a 100644 --- a/web/app/views/clients/index.html.erb +++ b/web/app/views/clients/index.html.erb @@ -373,8 +373,8 @@ var singlePlayerProfileGuardDialog = new JK.SinglePlayerProfileGuardDialog(JK.app); singlePlayerProfileGuardDialog.initialize(); - var sessionMasterMixDialog = new JK.SessionMasterMixDialog(JK.app); - sessionMasterMixDialog.initialize(); + //var sessionMasterMixDialog = new JK.SessionMasterMixDialog(JK.app); + //sessionMasterMixDialog.initialize(); var signinDialog = new JK.SigninDialog(JK.app); signinDialog.initialize(); diff --git a/web/app/views/clients/wizard/gear/_gear_wizard.html.haml b/web/app/views/clients/wizard/gear/_gear_wizard.html.haml index cdbd11bd4..de9a2d795 100644 --- a/web/app/views/clients/wizard/gear/_gear_wizard.html.haml +++ b/web/app/views/clients/wizard/gear/_gear_wizard.html.haml @@ -11,7 +11,7 @@ It will take a few minutes, but it will educate you and save you time and trouble. .center.video-button-holder - %a.button-orange.watch-video{href:"#", rel:'external'} WATCH VIDEO + %a.button-orange.watch-video{href:"#", rel:'external'} INSTRUCTIONS .wizard-step{ 'layout-wizard-step' => "1", 'dialog-title' => "Select & Test Audio Gear", 'dialog-purpose' => "SelectAudioGear" } .ftuesteps @@ -27,7 +27,7 @@ %li Configure interface settings. %li View test results. .center - %a.button-orange.watch-video{href:'https://jamkazam.desk.com/customer/en/portal/articles/2400685-using-the-setup-wizard-%E2%80%93-step-2-%E2%80%93-select-and-test-audio-gear', rel:'external'} + %a.button-orange.watch-video{rel:'external'} INSTRUCTIONS .wizard-step-column %h2 Audio Input Device @@ -68,7 +68,7 @@ %li Edit the first audio track using the "update" link to set it up as an instrumental or vocal track as you like. %li If desired, add other audio or MIDI tracks for other instruments or vocals. .center - %a.button-orange.watch-video{href:'https://jamkazam.desk.com/customer/en/portal/articles/2400702-using-the-setup-wizard-%E2%80%93-step-3-%E2%80%93-configure-tracks', rel:'external'} INSTRUCTIONS + %a.button-orange.watch-video{rel:'external'} INSTRUCTIONS .wizard-step-column = react_component 'ConfigureTracks', {} @@ -83,7 +83,7 @@ %p If you have set up a mic in step 2 for your instrument or voice, click Next to move forward. %p Otherwise, follow the instructions to set up a voice chat mic. .center - %a.button-orange.watch-video{href:'https://jamkazam.desk.com/customer/en/portal/articles/2400826-using-the-setup-wizard-%E2%80%93-step-4-%E2%80%93-configure-voice-chat', rel:'external'} INSTRUCTIONS + %a.button-orange.watch-video{rel:'external'} INSTRUCTIONS .wizard-step-column %h2.sub-header Select Voice Chat Option %form.voice @@ -123,7 +123,7 @@ = "If audio is poor try " %a.adjust-settings-direct-monitor{'href'=>'#'}tweaking your settings .center - %a.button-orange.watch-video{href:'https://jamkazam.desk.com/customer/en/portal/articles/2400827-using-the-setup-wizard-%E2%80%93-step-5-%E2%80%93-turn-off-direct-monitoring', rel:'external'} INSTRUCTIONS + %a.button-orange.watch-video{rel:'external'} INSTRUCTIONS .wizard-step-column .help-content When you have fully turned off the direct monitoring control (if any) on your audio interface, diff --git a/web/app/views/dialogs/_sessionMasterMixDialog.html.slim b/web/app/views/dialogs/_sessionMasterMixDialog.html.slim index 15a04c214..95dec3b9b 100644 --- a/web/app/views/dialogs/_sessionMasterMixDialog.html.slim +++ b/web/app/views/dialogs/_sessionMasterMixDialog.html.slim @@ -5,5 +5,5 @@ .dialog-inner p.notice | The master mix is the audio mix used for both recordings and live broadcasts of session audio. Changes to the master mix are global, so there is only one master mix for the session. The master mix does not include controls for the metronome because the metronome is not recorded or broadcast. Any user in the session may use the volume and pan controls below to make adjustments to the master mix for everyone in the session. - = react_component 'SessionMasterMix', {} + //= react_component 'SessionMasterMix', {} a.button-orange.close-button layout-action="close" CLOSE