Exemple #1
0
 private void Window_Initialized(object sender, EventArgs e)
 {
     if (DataContext == null)
     {
         var carrier     = new SineWave(261.625565, 80, WaveType.Sine);
         var temperament = new EqualTemperament();
         var scaleSteps  = carrier.GetChord(temperament, ChordTypes.MajorTriad, true);
         DataContext = new MainViewModel(scaleSteps, temperament);
     }
 }
Exemple #2
0
        private Node <float> MmlToNode(string track, string mml)
        {
            var ticksPerBeat = 96;
            // TODO 該当トラックにインストゥルメントが定義されていないとこけるので、エラー処理
            var instrm = this.instruments[track];
            var temper = new EqualTemperament(440f);
            var vol    = Proxy(1f);

            var parser    = new SimpleMmlParser();
            var ast       = parser.Parse(mml);
            var instrcGen = new SimpleMmlInstructionGenerator();
            var freq      = Var <float>();

            // TODO input が複数の場合はとりあえず全てに freq を設定するが、
            // Input がちょうど 1 つでない場合はエラーにすべきか?
            foreach (var i in instrm.Input)
            {
                i.Source = freq;
            }
            instrcGen.AddFreqUsers(freq);
            foreach (var n in instrm.NoteUsers)
            {
                instrcGen.AddNoteUsers(n);
            }
            var instrcs = instrcGen.GenerateInstructions(ast, ticksPerBeat, temper).ToList();

            var tick = new Tick(this.tempo, ticksPerBeat);

            var parameters = new Dictionary <string, ProxyController <float> >(instrm.Parameters)
            {
                { SimpleMmlInstructionGenerator.PARAM_TRACK_VOLUME, vol },
            };

            new Sequencer(tick, parameters, instrcs);

            // TODO ステレオに正しく対応(キャストを除去)
            return((Node <float>)(instrm.Output * vol));
        }