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