private void ProgramTheProgram() { const string midiFile = "res://Resources/Midi/Fireflies.mid"; const string soundFontFile = "res://Resources/Midi/choriumreva.sf2"; _program = MidiFile.Read( ProjectSettings.GlobalizePath(midiFile), new ReadingSettings { NotEnoughBytesPolicy = NotEnoughBytesPolicy.Ignore }) .ToProgram(); var lightBoard = GetNode <IGlowingArray>("Objects/LightBoard"); var lightBoardMapper = new PersistingGlowMapper(lightBoard); var lightBoardTrack1 = _program.GetMusicTrack((byte)InstrumentNames.ElectricBass_pick); // var lightBoardTrack2 = _program.GetMusicTrack((byte) InstrumentNames.ElectricBass_finger); // var lightBoardTrack3 = _program.GetMusicTrack((byte) InstrumentNames.AcousticGrandPiano); lightBoardTrack1?.Mappers.Add(lightBoardMapper); // lightBoardTrack2?.Mappers.Add(lightBoardMapper); // lightBoardTrack3?.Mappers.Add(lightBoardMapper); // var launcherMapper = new CollisionTimingMapper(_launcher, EventToLaunch); var xylophone = GetNode <Xylophone>("Objects/Xylophone"); var launcher = GetNode <Launcher>("Objects/Launcher"); var xylophoneMapper = xylophone.GetNoteToBarMapper(); var targetMapper = TrackToLaunchMappers.FromEventToTargetMapper( xylophoneMapper, new Targeting.Params { StartPos = launcher.GetGlobalTranslation(), Gravity = GravityVec * Gravity, MinLaunchVelocity = 5, UseUpper = true }); var timingRecorder = new TimingRecorder { ProcessMode = ProcessNode.Mode.Physics }; GlobalNode.Instance.AddChild(timingRecorder); _launchMapper = new CollisionTimingMapper(_launcher, timingRecorder, targetMapper); var xyloGlowMapper = new PersistingGlowMapper(xylophone); var xyloTrack = _program.GetMusicTrack((byte)InstrumentNames.MusicBox); xyloTrack?.Mappers.Add(_launchMapper); xyloTrack?.Mappers.Add(xyloGlowMapper); var movingObject = GetNode <MovingObject>("Objects/MovingObject"); var movingObjectMapper = new MovingObjectMapper(movingObject); var movingObjectTrack = _program.GetMusicTrack((byte)InstrumentNames.SynthVoice); movingObjectTrack?.Mappers.Add(movingObjectMapper); _airLauncher = GetNode <Launcher>("Objects/AirLauncher"); timingRecorder = new TimingRecorder { ProcessMode = ProcessNode.Mode.Physics }; GlobalNode.Instance.AddChild(timingRecorder); _airLaunchMapper = new CollisionTimingMapper(_airLauncher, timingRecorder, AirMapper); var airLaunchTrack = _program.GetMusicTrack((byte)InstrumentNames.AcousticGrandPiano); airLaunchTrack?.Mappers.Add(_airLaunchMapper); var drums = GetNode <Drums>("Objects/Drums"); var drumMapper = new PulsingGlowMapper(drums, 100_000); var drumTrack = _program.GetDrumTrack(); drumTrack?.Mappers.Add(drumMapper); var synth = new SortofVirtualSynth { NumChannels = _program.Tracks.Count, SoundFontFile = soundFontFile, UsedPresetNumbers = _program.Tracks.OfType <MusicTrack>().Select(track => track.CombinedPresetNum).ToGdArray(), ProcessMode = ProcessNode.Mode.Audio }; AddChild(synth); synth.MatchProgram(_program); var synthMapper = synth.GetMapper(); foreach (var track in _program.Tracks) { track.Mappers.Add(synthMapper); } _programPlayer = new ProgramPlayer(_program); AddChild(_programPlayer); foreach (var track in _program.Tracks) { Console.WriteLine(track); } }
public CollisionTimingMapper(ILauncher launcher, TimingRecorder timingRecorder, TrackToLaunchMapper trackToLaunch) { _launcher = launcher ?? throw new ArgumentNullException(nameof(launcher)); _timingRecorder = timingRecorder ?? throw new ArgumentNullException(nameof(timingRecorder)); _trackToLaunch = trackToLaunch ?? throw new ArgumentNullException(nameof(trackToLaunch)); }