using TeaBox.Macros; using System; using System.IO; using System.Linq; using JD.Audio.Sound; using JD.Serialization; namespace JDSongConverter.Tasks { /// /// Extracts Audio Preview and volume information from the trk file and moves them into the SongDesc.tpl and MusicTrack.tpl, respectively. /// Use only until JD2015 Format! /// #pragma warning disable 0618 //This warning is about obsolete classes but I need those to convert public class ExtractPreviewAndVolumeFromTrkTask : Task { protected LuaSerializer m_luaSerializer; public override string Name { get { return "Extract Audio Preview and Volume From Trk"; } set { } } public override string ProgressText { get { return "Extracting Audio Preview and Volume From Trk"; } } public override TaskResult Process(IExecutionContext executionContext) { TaskResult progressResult = TaskResult.Ok; if(!Context.OutputMap.IsAlternate) // only classic maps (main maps) have audio preview data { m_luaSerializer = new LuaSerializer(); m_luaSerializer.IgnoreDefaultValues = true; var musicTrackTpl = Context.OutputMap.MusicTrack; var wave = Wave.LoadFromMusicTrackTpl(musicTrackTpl, Wave.LoadingMode.StructureOnly); int previewStart = (int) wave.Annotations.PreviewEntry; int previewStartLoop = (int) wave.Annotations.PreviewLoopStart; int previewLoopEnd = (int) wave.Annotations.PreviewLoopEnd; float volume = wave.Annotations.Volume; progressResult = SaveAudioPreviewToSongDesc(previewStart, previewStartLoop, previewLoopEnd); if (progressResult == TaskResult.Ok) { progressResult = SaveVolumeToMusicTrackTpl(volume); } } return progressResult; } private TaskResult SaveAudioPreviewToSongDesc(int previewStart, int previewStartLoop, int previewEndLoop) { String songDescTplPath = Context.OutputMap.SongDescPath; Actor_Template actorTemplate = m_luaSerializer.LoadObject(songDescTplPath); JD_SongDescTemplate songDesc = actorTemplate.COMPONENTS.OfType().FirstOrDefault(); if (songDesc == null) return TaskResult.Error; if (songDesc.AudioPreviews.Count > 0) songDesc.AudioPreviews.Clear(); JD_SongDescTemplate.AudioPreview coverflowPreview = new JD_SongDescTemplate.AudioPreview(); coverflowPreview.Name = "coverflow"; coverflowPreview.Startbeat = previewStart; coverflowPreview.Endbeat = 0; //Not used JD_SongDescTemplate.AudioPreview preLobbyPreview = new JD_SongDescTemplate.AudioPreview(); preLobbyPreview.Name = "prelobby"; preLobbyPreview.Startbeat = previewStartLoop; preLobbyPreview.Endbeat = previewEndLoop; songDesc.AudioPreviews.Add(coverflowPreview); songDesc.AudioPreviews.Add(preLobbyPreview); songDesc.AudioPreviewFadeTime = 0.5f; m_luaSerializer.SaveObjectToFile(actorTemplate, songDescTplPath); return TaskResult.Ok; } private TaskResult SaveVolumeToMusicTrackTpl(float volume) { String musicTrackCompPath = Context.OutputMap.MusicTrack; String alltext = File.ReadAllText(musicTrackCompPath); String replaceText = ""; //If volume is already there in template and require updating with new volume if (!alltext.Contains("volume")) { replaceText = "= structure, volume = " + volume; alltext = alltext.ReplaceIgnoreCase("= structure", replaceText); } else { Actor_Template actorTemplate = m_luaSerializer.LoadObject(musicTrackCompPath); MusicTrackComponent_Template musicTrackComp = actorTemplate.COMPONENTS.OfType().FirstOrDefault(); float oldVolume = musicTrackComp.TrackData.Volume; replaceText = "volume = " + volume; alltext = alltext.ReplaceIgnoreCase("volume = " + oldVolume, replaceText); } File.WriteAllText(musicTrackCompPath, alltext); return TaskResult.Ok; } } }