public TwinkleArchive Decode(TwinkleBeatmaniaChunk chunk) { if (chunk?.Data == null || chunk.Data.Length < 0x1A00000) { return(null); } var definitions = Enumerable.Range(0, 255) .ToDictionary(i => i, i => _twinkleBeatmaniaSoundDefinitionDecoder.Decode(chunk.Data.AsSpan(i * 0x12))); var sounds = definitions .Where(def => def.Value != null && def.Value.SizeInBlocks > 0) .Select(def => { var sample = _twinkleBeatmaniaSoundDecoder.Decode(def.Value, chunk.Data.AsSpan(0x100000)); sample[NumericData.Id] = def.Key + 1; return(sample); }) .ToList(); var charts = ChartOffsets .Select((offset, index) => { if (_twinkleBeatmaniaChartHeuristic.Match(chunk.Data.AsMemory(offset, 0x4000)) == null) { return(null); } var events = _twinkleBeatmaniaChartDecoder .Decode(chunk.Data.AsSpan(offset), 0x4000) .Select(_twinkleBeatmaniaChartEventConverter.ConvertToBeatmaniaPc1) .ToList(); if (!events.Any()) { return(null); } var chart = _beatmaniaPc1ChartDecoder.Decode(events, TwinkleConstants.BeatmaniaRate); if (chart != null) { chart[NumericData.ByteOffset] = offset; chart[NumericData.Id] = index; _twinkleBeatmaniaChartMetadataDecoder.AddMetadata(chart, index); } return(chart); }) .Where(c => c != null) .ToList(); return(new TwinkleArchive { Charts = charts, Samples = sounds }); }
public BeatmaniaPcSongSet MigrateToBemaniPc(TwinkleBeatmaniaChunk chunk) { if (chunk?.Data == null || chunk.Data.Length < 0x1A00000) { return(null); } var definitions = Enumerable.Range(0, 255) .ToDictionary(i => i, i => _twinkleBeatmaniaSoundDefinitionDecoder.Decode(chunk.Data.AsSpan(i * 0x12))); var sounds = definitions .Select(def => { var source = def.Value != null ? _twinkleBeatmaniaSoundDecoder.Decode(def.Value, chunk.Data.AsSpan(0x100000)) : new Sound { Samples = new[] { new Sample { Data = new float[0] } }, [NumericData.Rate] = 44100 }; using (var mem = new MemoryStream()) { _riffStreamWriter.Write(mem, _riffPcm16SoundEncoder.Encode(source)); mem.Flush(); return(new BeatmaniaPcAudioEntry { Channel = def.Value?.Channel ?? 255, Data = mem.ToArray(), ExtraInfo = new byte[0], Panning = def.Value?.Panning ?? 0x40, Volume = def.Value?.Volume ?? 0x01 }); } }) .ToList(); var charts = ChartOffsets .Select((offset, index) => { if (_twinkleBeatmaniaChartHeuristic.Match(chunk.Data.AsMemory(offset, 0x4000)) == null) { return(null); } var events = _twinkleBeatmaniaChartDecoder .Decode(chunk.Data.AsSpan(offset), 0x4000) .Select(_twinkleBeatmaniaChartEventConverter.ConvertToBeatmaniaPc1) .ToList(); if (!events.Any()) { return(null); } var noteCountEvents = _twinkleBeatmaniaChartEventConverter.ConvertNoteCountsToBeatmaniaPc1( _twinkleBeatmaniaChartDecoder.GetNoteCounts(chunk.Data.AsSpan(offset), 0x4000)); return(new BeatmaniaPc1Chart { Index = index, Data = noteCountEvents.Concat(events).ToList() }); }) .Where(c => c != null) .ToList(); return(new BeatmaniaPcSongSet { Charts = charts, Sounds = sounds }); }