void InitMidiDetail(bool renderMidiList = true) { midi = res.QueryMidiById(level.selectedMidiId); if (!string.IsNullOrEmpty(midi.coverBlurUrl)) { Net.WebCache.instance.LoadTexture(midi.coverBlurUrl, job => { level.backgroundImage.texture = job.GetData(); game.backgroundTexture = job.GetData(); }); } else { level.backgroundImage.texture = level.defaultBackgroundTexture; game.backgroundTexture = null; } song = res.QuerySongById(midi.songId); album = res.QueryAlbumById(song.albumId); author = res.QueryPersonById(midi.authorId); // _id is path for custom midis byte[] bytes = ResourceStorage.ReadMidiBytes(midi); midiId = midi._id; midiFile = new MidiFile(bytes); sequenceCollection = new NoteSequenceCollection(midiFile); sourceText.text = string.Format("{0} • {1}", album.name.TranslateArtifact(), song.name.TranslateArtifact()); titleText.text = midi.name; artistText.text = string.Format("by {0}", author?.name ?? midi.artistName); infoText.text = string.Format("{0:N0} Sequences • {1:N0} Notes • {2}", sequenceCollection.sequences.Count, sequenceCollection.noteCount, hash = MiscHelper.GetHexEncodedMd5Hash(bytes)); statisticsText.text = string.Format(" <size=12>{0:N0}</size> <size=12>{1:N0}</size> <size=12>{2:N0}</size> <size=12>{3:N0}</size>", midi.trialCount, midi.downloadCount, midi.voteSum, midi.loveCount); statusText.text = midi.status; if (string.IsNullOrWhiteSpace(midi.coverUrl)) { coverCutter.Cut(defaultTexture.name, defaultTexture); } else { Net.WebCache.instance.LoadTexture(midi.coverUrl, job => { coverCutter.Cut(job.GetKey(), job.GetData()); }); } if (renderMidiList) { RenderMidiList(midi.songId); } }
public void Start() { configPageGroup.gameObject.SetActive(false); pausePageGroup.gameObject.SetActive(false); startTime = Time.time; game_ = GameScheduler.instance; anim_ = AnimationManager.instance; if (game_.backgroundTexture != null) { backgroundImage.texture = game_.backgroundTexture; } switch (game_.gameplayConfig.layoutPreset) { //case GameplayConfigProto.LAYOUT_PRESET_SCANNING_LINE: gameplayManager = scanningLineGameplayManagerV2; break; default: gameplayManager = oneOnlyGameplayManager; break; } hasStarted = false; sf2File = new Sf2File(Resources.Load <TextAsset>("sf2/GeneralUser GS v1.471").bytes); var audioConfig = AudioSettings.GetConfiguration(); sampleRate = audioConfig.sampleRate; sf2Synth = new Sf2Synth(sf2File, new Sf2Synth.Table(sampleRate), 128); sf2Synth.SetVolume(-10); infoText.text = string.Format("{1}\n{0}\n{2}", game_.title, game_.subtitle, ((GameplayConfigProto.DifficaultyPresetEnum)game_.gameplayConfig.difficultyPreset).ToString()); midiFile = game_.midiFile ?? new MidiFile(Resources.Load <TextAsset>(testMidiPath).bytes); sequenceCollection = game_.noteSequenceCollection ?? new NoteSequenceCollection(midiFile); midiFileSha256Hash = MiscHelper.GetBase64EncodedSha256Hash(midiFile.bytes); cacheTicks = cacheBeats * midiFile.ticksPerBeat; endTicks = sequenceCollection.end + (game_.gameplayConfig.graceTime + endDelayBeats) * midiFile.ticksPerBeat; midiSequencer = new MidiSequencer(midiFile, sf2Synth); midiSequencer.isMuted = true; synthConfig = MidiSynthConfigProto.LoadOrCreateDefault(game_, sequenceCollection, midiFileSha256Hash); foreach (var seqConfig in synthConfig.sequenceStateList) { sf2Synth.ProgramChange(seqConfig.channel, (byte)seqConfig.programOverride); if (seqConfig.shouldUseInGame) { gameSequences.Add(sequenceCollection.sequences[seqConfig.sequenceIndex]); } else if (!seqConfig.isMuted) { backgroundSequences.Add(sequenceCollection.sequences[seqConfig.sequenceIndex]); } } sf2Synth.ignoreProgramChange = true; pausePageGroup.gameObject.SetActive(false); if (shouldLoadGameplayConfig) { LoadGameplayConfig(); } scoringManager.Init(this); gameplayManager.Init(this); backgroundTracks = new BackgroundTrack[backgroundSequences.Count]; for (int i = 0; i < backgroundTracks.Length; i++) { backgroundTracks[i] = new BackgroundTrack(); } Debug.LogFormat("background tracks: {0}, game tracks: {1}", backgroundSequences.Count, gameSequences.Count); ShowReadyAnimation(); }
public override void Enable() { base.Enable(); var audioConfig = AudioSettings.GetConfiguration(); sampleRate = audioConfig.sampleRate; audioConfigText.text = string.Format( "Sample Rate: {0:N0} Hz\n" + "DSP Buffer Size: {1:N0}\n" + "DSP Theoratical Delay: {2:N1} ms ({4:N1} Hz)\n" + "{3:N0} Channels\n\n", sampleRate, audioConfig.dspBufferSize, (float)audioConfig.dspBufferSize / sampleRate * 1000, (int)audioConfig.speakerMode, sampleRate / (float)audioConfig.dspBufferSize) + string.Format( "Model: {0}\n" + "Name: {1}\n" + "OS: {2}\n" + "CPU: {3}\n" + "GPU: {4}\n", SystemInfo.deviceModel, SystemInfo.deviceName, SystemInfo.operatingSystem, SystemInfo.processorType, SystemInfo.graphicsDeviceType); sf2Synth = new Sf2Synth(sf2File, new Sf2Synth.Table(sampleRate), 128); sf2Synth.SetVolume(-10); if (midiFile != null && level.midiDetailPage.midiFile == midiFile) { return; } sf2Synth.Reset(); midiFile = level.midiDetailPage.midiFile ?? new MidiFile(Resources.Load <TextAsset>("test").bytes); sequenceCollection = level.midiDetailPage.sequenceCollection ?? new NoteSequenceCollection(midiFile); midiFileSha256Hash = MiscHelper.GetBase64EncodedSha256Hash(midiFile.bytes); previewTicks = previewBeats * midiFile.ticksPerBeat; midiSequencer = new MidiSequencer(midiFile, sf2Synth); midiSequencer.isMuted = true; state = MidiSynthConfigProto.LoadOrCreateDefault(game, sequenceCollection, midiFileSha256Hash); sequenceConfigItems = new SequenceConfigItemController[sequenceCollection.sequences.Count]; int childCount = scrollViewContentRect.childCount; for (int i = 0; i < sequenceCollection.sequences.Count; i++) { var instance = i < childCount?scrollViewContentRect.GetChild(i).gameObject : Instantiate(sequenceConfigItemPrefab, scrollViewContentRect); instance.SetActive(true); var item = instance.GetComponent <SequenceConfigItemController>(); sequenceConfigItems[i] = item; item.previewTrack.Reset(); item.button1Action = () => { item.state.shouldUseInGame = !item.state.shouldUseInGame; item.ApplyState(item.props, item.state); }; item.muteButtonAction = () => { item.state.isMuted = !item.state.isMuted; item.ApplyState(item.props, item.state); }; item.soloButtonAction = () => { if (state.soloSequenceIndex == item.state.sequenceIndex) { state.soloSequenceIndex = -1; } else { state.soloSequenceIndex = item.state.sequenceIndex; } ApplyState(); }; item.onProgramOverrideSelectChanged = value => { sf2Synth.ignoreProgramChange = false; sf2Synth.ProgramChange(item.state.channel, (byte)value); sf2Synth.ignoreProgramChange = true; }; } for (int i = sequenceCollection.sequences.Count; i < childCount; i++) { scrollViewContentRect.GetChild(i).gameObject.SetActive(false); } ApplyState(); }