public ISound Decode(BeatmaniaPs2Keysound keysound) { var samples = keysound.Data.SelectMany(d => _vagDecoder.Decode(d).Samples).ToList(); var leftRate = keysound.FrequencyLeft == 0 ? null : (int?)keysound.FrequencyLeft; var rightRate = keysound.FrequencyRight == 0 ? null : (int?)keysound.FrequencyRight; var left = true; foreach (var sample in samples) { sample[NumericData.Rate] = left ? leftRate : rightRate; left = !left; } return(new Sound { Samples = samples, [NumericData.Volume] = _beatmaniaDspTranslator.GetLinearVolume(keysound.Volume), [NumericData.SourceVolume] = keysound.Volume, [NumericData.Panning] = _beatmaniaDspTranslator.GetBm2dxPanning(keysound.Panning), [NumericData.SourcePanning] = keysound.Panning, [NumericData.Channel] = keysound.Channel }); }
public BeatmaniaPs2KeysoundSet Read(Stream stream) { var reader = new BinaryReader(stream); var header = Enumerable.Range(0, 8).Select(i => reader.ReadInt32()).ToArray(); var length = header[0]; var hunk = reader.ReadBytes(length - 0x20); using (var hunkMem = new MemoryStream(hunk)) { var hunkReader = new BinaryReader(hunkMem); var entries = Enumerable.Range(0, 511).Select(i => { hunkMem.Position = i * 0x20; var result = new BeatmaniaPs2Keysound { SampleNumber = hunkReader.ReadInt16(), Reserved0 = hunkReader.ReadInt16(), Channel = hunkReader.ReadByte(), Volume = hunkReader.ReadByte(), Panning = hunkReader.ReadByte(), SampleType = hunkReader.ReadByte(), FrequencyLeft = hunkReader.ReadInt32(), FrequencyRight = hunkReader.ReadInt32(), OffsetLeft = hunkReader.ReadInt32(), OffsetRight = hunkReader.ReadInt32(), PseudoLeft = hunkReader.ReadInt32(), PseudoRight = hunkReader.ReadInt32() }; switch (result.SampleType) { case 2: { hunkMem.Position = result.OffsetLeft - 61488; result.Data = new List <VagChunk> { _vagStreamReader.Read(hunkMem, 1, 0) }; break; } case 3: { hunkMem.Position = header[1] + result.OffsetLeft + 16368; result.Data = new List <VagChunk> { _vagStreamReader.Read(hunkMem, 1, 0) }; break; } case 4: { hunkMem.Position = result.OffsetLeft - 61488; var dataLeft = _vagStreamReader.Read(hunkMem, 1, 0); hunkMem.Position = result.OffsetRight - 61488; var dataRight = _vagStreamReader.Read(hunkMem, 1, 0); result.Data = new List <VagChunk> { dataLeft, dataRight }; break; } default: { return(null); } } return(result); }).Where(entry => entry != null).ToList(); return(new BeatmaniaPs2KeysoundSet { Keysounds = entries }); } }