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"); } }
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); } }); }