Skip to content

Commit

Permalink
Merge pull request #738 from maiko3tattun/0603_SoloMute2
Browse files Browse the repository at this point in the history
Solo and mute improvements
  • Loading branch information
stakira committed Jun 17, 2023
2 parents 998dbfc + 79309f5 commit baeb389
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 25 deletions.
3 changes: 2 additions & 1 deletion OpenUtau.Core/PlaybackManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ private PlaybackManager() {
public Audio.IAudioOutput AudioOutput { get; set; } = new Audio.DummyAudioOutput();
public bool Playing => AudioOutput.PlaybackState == PlaybackState.Playing;
public bool StartingToPlay { get; private set; }
public bool SoloTrackExist { get; set; } = false;

public void PlayTestSound() {
masterMix = null;
Expand Down Expand Up @@ -170,7 +171,7 @@ public void RenderToFiles(UProject project, string exportPath) {
RenderEngine engine = new RenderEngine(project);
var trackMixes = engine.RenderTracks(DocManager.Inst.MainScheduler, ref renderCancellation);
for (int i = 0; i < trackMixes.Count; ++i) {
if (trackMixes[i] == null || i >= project.tracks.Count || project.tracks[i].Mute) {
if (trackMixes[i] == null || i >= project.tracks.Count || project.tracks[i].Muted) {
continue;
}
var file = PathManager.Inst.GetExportPath(exportPath, project.tracks[i]);
Expand Down
2 changes: 1 addition & 1 deletion OpenUtau.Core/Render/RenderEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public Tuple<WaveMix, List<Fader>> RenderMixdown(int startTick, TaskScheduler ui
}));
var trackMix = new WaveMix(trackSources);
var fader = new Fader(trackMix);
fader.Scale = PlaybackManager.DecibelToVolume(track.Mute ? -24 : track.Volume);
fader.Scale = PlaybackManager.DecibelToVolume(track.Muted ? -24 : track.Volume);
fader.Pan = (float)track.Pan;
fader.SetScaleToTarget();
faders.Add(fader);
Expand Down
11 changes: 8 additions & 3 deletions OpenUtau.Core/Ustx/UTrack.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OpenUtau.Api;
using OpenUtau.Core.Render;
Expand Down Expand Up @@ -89,8 +88,9 @@ public USinger Singer {
[YamlIgnore] public string SingerName => Singer != null ? Singer.DisplayName : "[No Singer]";
[YamlIgnore] public int TrackNo { set; get; }
public string TrackName { get; set; } = "New Track";
public bool Mute { set; get; }
public bool Solo { set; get; }
[YamlIgnore] public bool Muted { set; get; }
public bool Mute { get; set; }
public bool Solo { get; set; }
public double Volume { set; get; }
public double Pan { set; get; }
[YamlIgnore] public UExpressionDescriptor VoiceColorExp { set; get; }
Expand Down Expand Up @@ -179,6 +179,11 @@ public void AfterLoad(UProject project) {
};
}
TrackNo = project.tracks.IndexOf(this);
if (Solo) {
PlaybackManager.Inst.SoloTrackExist = true;
} else if (Mute) {
Muted = true;
}
}
}
}
2 changes: 1 addition & 1 deletion OpenUtau/Controls/TrackHeader.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
</Button>
<ToggleButton Grid.Row="1" Grid.Column="3" Margin="1" Padding="0" Height="18"
HorizontalAlignment="Stretch"
IsChecked="{Binding Mute}">
IsChecked="{Binding Muted, Mode=OneWay}" Command="{Binding ToggleMute}">
<TextBlock Text="M" TextAlignment="Center"/>
</ToggleButton>
<ToggleButton Grid.Row="2" Grid.Column="3" Margin="1" Padding="0" Height="18"
Expand Down
42 changes: 35 additions & 7 deletions OpenUtau/Controls/TrackHeaderCanvas.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Avalonia;
using Avalonia.Controls;
using OpenUtau.App.ViewModels;
using OpenUtau.Core;
using OpenUtau.Core.Ustx;
using ReactiveUI;

Expand Down Expand Up @@ -51,7 +52,13 @@ public TrackHeaderCanvas() {
MessageBus.Current.Listen<TracksRefreshEvent>()
.Subscribe(_ => {
foreach (var (track, header) in trackHeaders) {
header.ViewModel?.ManuallyRaise();
if (header.ViewModel == null) {
continue;
}
if (PlaybackManager.Inst.SoloTrackExist && !track.Solo) {
header.ViewModel.Muted = true;
}
header.ViewModel.ManuallyRaise();
}
if (trackAdder != null) {
trackAdder.TrackNo = trackHeaders.Count;
Expand All @@ -61,18 +68,39 @@ public TrackHeaderCanvas() {
.Subscribe(e => {
foreach (var (track, header) in trackHeaders) {
if (header.ViewModel != null) {
if (track.TrackNo == e.trackNo) {
header.ViewModel.Solo = e.solo;
if (e.solo) {
header.ViewModel.Mute = false;
if (e.solo) {
PlaybackManager.Inst.SoloTrackExist = true;
if (track.TrackNo == e.trackNo) {
header.ViewModel.Solo = true;
header.ViewModel.Muted = false;
} else {
header.ViewModel.Solo = false;
header.ViewModel.Muted = true;
}
} else {
header.ViewModel.Solo = false;
header.ViewModel.Mute = e.solo;
PlaybackManager.Inst.SoloTrackExist = false;
if (track.TrackNo == e.trackNo) {
header.ViewModel.Solo = false;
}
if (track.Mute) {
header.ViewModel.Muted = true;
} else {
header.ViewModel.Muted = false;
}
}
header.ViewModel.ManuallyRaise();
}
}
}); MessageBus.Current.Listen<TracksMuteEvent>()
.Subscribe(e => {
foreach (var (track, header) in trackHeaders) {
if (header.ViewModel != null) {
if (track.TrackNo == e.trackNo) {
header.ViewModel.ToggleMute();
}
}
}
});
}

Expand Down
37 changes: 25 additions & 12 deletions OpenUtau/ViewModels/TrackHeaderViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class TrackHeaderViewModel : ViewModelBase, IActivatableViewModel {
[Reactive] public string TrackName { get; set; } = string.Empty;
[Reactive] public double Volume { get; set; }
[Reactive] public double Pan { get; set; }
[Reactive] public bool Mute { get; set; }
[Reactive] public bool Muted { get; set; }
[Reactive] public bool Solo { get; set; }
[Reactive] public Bitmap? Avatar { get; set; }

Expand Down Expand Up @@ -130,26 +130,22 @@ public TrackHeaderViewModel(UTrack track) {
TrackName = track.TrackName;
Volume = track.Volume;
Pan = track.Pan;
Mute = track.Mute;
Muted = track.Muted;
Solo = track.Solo;
this.WhenAnyValue(x => x.track.TrackName)
.Subscribe(trackName => {
TrackName = trackName;
});
this.WhenAnyValue(x => x.Volume)
.Subscribe(volume => {
track.Volume = volume;
DocManager.Inst.ExecuteCmd(new VolumeChangeNotification(track.TrackNo, Mute ? -24 : volume));
DocManager.Inst.ExecuteCmd(new VolumeChangeNotification(track.TrackNo, Muted ? -24 : volume));
});
this.WhenAnyValue(x => x.Pan)
.Subscribe(pan => {
track.Pan = pan;
DocManager.Inst.ExecuteCmd(new PanChangeNotification(track.TrackNo, pan));
});
this.WhenAnyValue(x => x.Mute)
.Subscribe(mute => {
track.Mute = mute;
DocManager.Inst.ExecuteCmd(new VolumeChangeNotification(track.TrackNo, mute ? -24 : Volume));
this.WhenAnyValue(x => x.Muted)
.Subscribe(muted => {
track.Muted = muted;
DocManager.Inst.ExecuteCmd(new VolumeChangeNotification(track.TrackNo, muted ? -24 : Volume));
});
this.WhenAnyValue(x => x.Solo)
.Subscribe(solo => {
Expand All @@ -163,6 +159,21 @@ public void ToggleSolo() {
MessageBus.Current.SendMessage(new TracksSoloEvent(track.TrackNo, !track.Solo));
}

public void ToggleMute() {
if (!track.Mute) {
track.Mute = true;
Muted = true;
} else {
track.Mute = false;
if (PlaybackManager.Inst.SoloTrackExist) {
Muted = true;
} else {
Muted = false;
}
}
this.RaisePropertyChanged(nameof(Muted));
}

private bool TryChangePhonemizer(string phonemizerName) {
try {
var factory = DocManager.Inst.PhonemizerFactories.FirstOrDefault(factory => factory.type.FullName == phonemizerName);
Expand Down Expand Up @@ -269,7 +280,7 @@ public void ManuallyRaise() {
this.RaisePropertyChanged(nameof(Phonemizer));
this.RaisePropertyChanged(nameof(PhonemizerTag));
this.RaisePropertyChanged(nameof(Renderer));
this.RaisePropertyChanged(nameof(Mute));
this.RaisePropertyChanged(nameof(Muted));
this.RaisePropertyChanged(nameof(Solo));
this.RaisePropertyChanged(nameof(Volume));
this.RaisePropertyChanged(nameof(Pan));
Expand Down Expand Up @@ -326,6 +337,7 @@ public void Duplicate() {
Phonemizer = track.Phonemizer,
RendererSettings = track.RendererSettings,
Mute = track.Mute,
Muted = track.Muted,
Solo = track.Solo,
Volume = track.Volume,
Pan = track.Pan,
Expand All @@ -350,6 +362,7 @@ public void DuplicateSettings() {
Phonemizer = track.Phonemizer,
RendererSettings = track.RendererSettings,
Mute = track.Mute,
Muted = track.Muted,
Solo = track.Solo,
Volume = track.Volume,
Pan = track.Pan,
Expand Down
6 changes: 6 additions & 0 deletions OpenUtau/ViewModels/TracksViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ public TracksSoloEvent(int trackNo, bool solo) {
this.solo = solo;
}
}
public class TracksMuteEvent {
public readonly int trackNo;
public TracksMuteEvent(int trackNo) {
this.trackNo = trackNo;
}
}
public class PartsSelectionEvent {
public readonly UPart[] selectedParts;
public readonly UPart[] tempSelectedParts;
Expand Down
22 changes: 22 additions & 0 deletions OpenUtau/Views/MainWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,28 @@ void OnKeyDown(object sender, KeyEventArgs args) {
args.Handled = false;
break;
}
} else if (args.KeyModifiers == KeyModifiers.Shift) {
args.Handled = true;
switch (args.Key) {
// solo
case Key.S:
if (viewModel.TracksViewModel.SelectedParts.Count > 0) {
var part = viewModel.TracksViewModel.SelectedParts.First();
var track = DocManager.Inst.Project.tracks[part.trackNo];
MessageBus.Current.SendMessage(new TracksSoloEvent(part.trackNo, !track.Solo));
}
break;
// mute
case Key.M:
if (viewModel.TracksViewModel.SelectedParts.Count > 0) {
var part = viewModel.TracksViewModel.SelectedParts.First();
MessageBus.Current.SendMessage(new TracksMuteEvent(part.trackNo));
}
break;
default:
args.Handled = false;
break;
}
} else if (args.KeyModifiers == (cmdKey | KeyModifiers.Shift)) {
args.Handled = true;
switch (args.Key) {
Expand Down
12 changes: 12 additions & 0 deletions OpenUtau/Views/PianoRollWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1190,6 +1190,18 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
_ = MainWindow?.Save();
return true;
}
// solo
if(isShift) {
var track = project.tracks[notesVm.Part.trackNo];
MessageBus.Current.SendMessage(new TracksSoloEvent(notesVm.Part.trackNo, !track.Solo));
return true;
}
break;
case Key.M:
// mute
if (isShift) {
MessageBus.Current.SendMessage(new TracksMuteEvent(notesVm.Part.trackNo));
}
break;
case Key.F:
// scroll selection into focus
Expand Down

0 comments on commit baeb389

Please sign in to comment.