Skip to content

Commit

Permalink
Add multi midi track support for new track helper
Browse files Browse the repository at this point in the history
  • Loading branch information
otomad committed Mar 16, 2023
1 parent 4a54844 commit efb4ad3
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions otomad_helper/Otomad Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ public class EntryPoint {
private bool requestShowProgress = false;
private Media sonarSolidColor = null;
private List<Track> assignedSonarTracks = new List<Track>();
private int? nextTrackIndex = null;

// 媒体 / MIDI 参数变量
internal MIDI midi = null;
Expand Down Expand Up @@ -1048,8 +1049,8 @@ private bool GenerateOtomad() {
bool sonarMode = currentChannel.IsDrumKit && SonarConfig;
int topIndex = GenerateBelowTopAdjustmentTrack ? GetFirstNotAdjustmentTrackIndex() : 0;
var trackHelper = TrackHelper.New(this,
!AConfig ? null : IsAPreferredTrack ? AConfigPreferredTrack.Track as object : topIndex as object,
!VConfig ? null : IsVPreferredTrack ? VConfigPreferredTrack.Track as object : topIndex as object,
!AConfig ? null : nextTrackIndex.HasValue ? nextTrackIndex.Value as object : IsAPreferredTrack ? AConfigPreferredTrack.Track as object : topIndex as object,
!VConfig ? null : nextTrackIndex.HasValue ? nextTrackIndex.Value as object : IsVPreferredTrack ? VConfigPreferredTrack.Track as object : topIndex as object,
!AConfigMultitrack, !VConfigMultitrack && !sonarMode, name);
bool requireTwoKey = VConfigStartSize != VConfigEndSize || // 如果为起始尺寸与终止尺寸大小相等,则没有必要打两个关键帧了。
VConfigStartRotation != VConfigEndRotation ||
Expand Down Expand Up @@ -1432,9 +1433,8 @@ private bool GenerateOtomad() {
if (!(midiEvent is ControlChangeEvent)) continue;
ControlChangeEvent controlChangeEvent = midiEvent as ControlChangeEvent;
if (controlChangeEvent.Controller == MidiController.Pan) {
if (!MidiUseDynamicMidiBpm)
startTime = midiEvent.AbsoluteTime * midi.MsPerQuarter / midi.TicksPerQuarter;
else
startTime = !MidiUseDynamicMidiBpm ?
midiEvent.AbsoluteTime * midi.MsPerQuarter / midi.TicksPerQuarter :
startTime = integrator.GetActualTime(midiEvent.AbsoluteTime);

if (startTime < MidiConfigStartTime) continue;
Expand Down Expand Up @@ -1592,6 +1592,7 @@ private bool GenerateOtomad() {
trackEvent.Selected = true;

if (!sonarMode) generatedVideoTracks.AddRange(trackHelper.videoTracks);
nextTrackIndex = trackHelper.SumUp();
return !progressForm.RequestAbort;
}

Expand Down Expand Up @@ -10800,6 +10801,8 @@ public class TrackHelper<A, V> {
public List<Track> AllTracks { get { return videoTracks.Cast<Track>().Concat(audioTracks.Cast<Track>()).ToList(); } }
public readonly bool audioSingleTrack;
public readonly bool videoSingleTrack;
private int topmostTrackIndex = int.MaxValue;
private void SetTopmostTrackIndex(int value) { if (value < topmostTrackIndex) topmostTrackIndex = value; }

/// <summary>
/// 构造生成轨道辅助类。
Expand Down Expand Up @@ -10963,6 +10966,7 @@ public T AddEvent<T>(T trackEvent, Timecode start, Timecode length, IEnumerable<
T copiedEvent = trackEvent.Copy(track, start) as T;
if (copiedEvent.Name == EXAMPLE_EVENT_NAME) copiedEvent.Name = "";
copiedEvent.Length = length;
SetTopmostTrackIndex(track.Index);
return copiedEvent;
}

Expand All @@ -10980,6 +10984,7 @@ public T AddEvent<T>(Timecode start, Timecode length, IEnumerable<Track> exceptT
if (!TrackVacateSpace<T>(track, start, length)) return null;
T trackEvent = IsAudio<T>() ? new AudioEvent(start, length) as T : new VideoEvent(start, length) as T;
track.Events.Add(trackEvent);
SetTopmostTrackIndex(track.Index);
return trackEvent;
}

Expand Down Expand Up @@ -11059,6 +11064,18 @@ private bool IsSingleTrack<T>() where T : TrackEvent {
bool isAudio = IsAudio<T>();
return isAudio && audioSingleTrack || !isAudio && videoSingleTrack;
}

/// <summary>
/// 总结,结算。<br />
/// 在某个乐轨完成后调用。
/// </summary>
/// <returns>
/// 如果轨道完全没有被使用过,完全没有新增任何轨道事件,则返回 <c>null</c>,这样生成下一组乐轨时仍然可以继续沿用现有设定。<br />
/// 如果轨道使用过至少一次了(添加示例轨道事件除外),则根据生成后的轨道情况提供一个建议的新参照轨道索引值。
/// </returns>
public int? SumUp() {
return topmostTrackIndex == int.MaxValue ? null : topmostTrackIndex as int?;
}
}

partial class AutoLayoutTracksGridForm {
Expand Down

0 comments on commit efb4ad3

Please sign in to comment.