JD2022-TU1/main/tools/framework/JD.Serialization/Timeline/Clips/KaraokeClip.cs

81 lines
2.6 KiB
C#

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace JD.Serialization
{
partial class KaraokeClip
{
public override Clip ConvertToFit(TapeTrack track)
{
var clip = (KaraokeClip)base.ConvertToFit(track);
var karaokeTrack = track as KaraokeTrack;
if (karaokeTrack != null)
{
clip.ContentType = (ContentType_Enum)karaokeTrack.ContentType;
clip.MidiNote = karaokeTrack.MidiNote;
}
return clip;
}
[Browsable(false)]
[Category("Karaoke")]
[Description("The midi note")]
[Range(0, 127)]
public int MidiNote
{
get { return MidiUtils.FrequencyToMidi(Pitch); }
set { Pitch = MidiUtils.MidiToFrequency(Math.Max(0, Math.Min(value, 127))); }
}
[Browsable(true)]
[Category("Karaoke")]
[Description("The midi note name")]
[DisplayName("MidiNote")]
public string MidiNoteName => MidiUtils.MidiNoteName(MidiNote);
public override System.Collections.Generic.IEnumerable<CollisionArea> CollisionAreas
{
get
{
foreach (var area in base.CollisionAreas)
{
area.CollisionGroup = ContentType;
yield return area;
}
}
}
public override string ToString()
{
switch (ContentType)
{
case ContentType_Enum.KaraokeContent_LyricsOnly:
return $"{Lyrics} (Lyrics only)";
case ContentType_Enum.KaraokeContent_Rap:
return $"{Lyrics} (Rap)";
case ContentType_Enum.KaraokeContent_Singing:
return $"{Lyrics} ({MidiNoteName})";
}
return Lyrics;
}
}
public static class KaraokeClipExtensions
{
public static KaraokeClip InstantiateKaraokeClip(this TapeTrack track, string lyrics, int startFrame)
{
var karaokeTrack = track as KaraokeTrack;
var newClip = (KaraokeClip)Clip.Instantiate(typeof(KaraokeClip), track, startFrame);
newClip.Lyrics = lyrics;
newClip.BeatDuration = Math.Max(1, lyrics.Length/4.0f);
if (karaokeTrack != null)
{
newClip.ContentType = (KaraokeClip.ContentType_Enum)karaokeTrack.ContentType;
newClip.Pitch = karaokeTrack.Pitch;
}
return newClip;
}
}
}