Beispiel #1
0
        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
            });
        }
Beispiel #2
0
        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
            });
        }