Exemple #1
0
        private void DoDirective(DirectiveStatement dir)
        {
            switch (dir.Name)
            {
            case "use":
                if (dir.Arguments.Length == 1 && dir.Arguments[0] == "strict")
                {
                    StrictMode = true;
                }
                else
                {
                    throw Error("invalid mode");
                }
                break;

            default:
                throw Error("invalid directive");
            }
        }
Exemple #2
0
        private void ProcessDirectiveStatement(DirectiveStatement stmt)
        {
            TryWithNode(stmt, () => {
                if (stmt.Name == "tempo")
                {
                    this.tempo = this.evaluator.Evaluate(stmt.Arguments.TryGet(0)).AsFloat();
                }
                else if (stmt.Name == "instrument")
                {
                    var tracks = this.evaluator.Evaluate(stmt.Arguments.TryGet(0)).AsTrackSet();

                    foreach (var track in tracks)
                    {
                        var instrm = this.evaluator.Evaluate(stmt.Arguments.TryGet(1)).AsModule();
                        // TODO 重複設定はエラーにする
                        this.instruments.Add(track, instrm);
                    }
                }
                else if (stmt.Name == "params")
                {
                    var tracks = this.evaluator.Evaluate(stmt.Arguments.TryGet(0)).AsTrackSet();

                    foreach (var track in tracks)
                    {
                        var entries = this.evaluator.Evaluate(stmt.Arguments.TryGet(1)).AsAssocArray();
                        foreach (var entry in entries)
                        {
                            // TODO パラメータが見つからない場合はエラーにする
                            this.instruments[track].AssignModuleToParameter(entry.Key, entry.Value.AsModule());
                        }
                    }
                }
                else if (stmt.Name == "mute" || stmt.Name == "solo")
                {
                    this.muteSpecifiedTracks = stmt.Name == "mute";
                    var tracks = this.evaluator.Evaluate(stmt.Arguments.TryGet(0)).AsTrackSet();
                    // 最後の 1 文だけが有効
                    this.mutedOrUnmutedTracks.Clear();
                    this.mutedOrUnmutedTracks.UnionWith(tracks);
                }
            });
        }