6 #include <unordered_map>
9 #include <boost/variant.hpp>
11 #include <ast/composition.hpp>
12 #include <compiler/base.hpp>
13 #include <ir/module.hpp>
14 #include <ir2midi/command.hpp>
15 #include <ir2midi/context.hpp>
16 #include <midi/file.hpp>
24 class IR2MIDICompiler final : public Compiler::CompilerBase, public IIR2MIDICompiler, public boost::static_visitor<>
27 explicit IR2MIDICompiler(const IR::Module& ir) : m_IR(ir)
29 InitializeCommandProcessors();
33 IR2MIDICompiler(const IR::Module& ir, T func) : CompilerBase(func), m_IR(ir)
35 InitializeCommandProcessors();
38 IR2MIDICompiler(const IR2MIDICompiler&) = delete;
39 IR2MIDICompiler& operator=(const IR2MIDICompiler&) = delete;
41 virtual ~IR2MIDICompiler() = default;
43 bool Compile(const std::string& entryPoint);
45 MIDI::MIDIFile& GetMIDI();
46 const MIDI::MIDIFile& GetMIDI() const;
48 void operator()(const IR::TrackList& ir);
49 void operator()(const AST::Command& ast);
51 void operator()(int trackNumber, const IR::Event& ev);
52 void operator()(int trackNumber, const IR::BlockReference& blockRef);
54 virtual std::string GetSourceName() const override;
55 virtual TrackCompilerContext& GetTrackContext(int trackNumber) override;
56 virtual bool HasTrackBlock(const std::string& trackBlockName) const override;
59 void AddCommandProcessor(std::unique_ptr<ICommandProcessor> pProcessor);
60 void InitializeCommandProcessors();
61 virtual bool CompileTrackBlock(const std::string& trackBlockName) override;
62 void CompileBlock(int trackNumber, IR::BlockReference blockRef);
65 void CheckForUnprocessedAttributes(const std::vector<AST::Attribute>& attributes);
66 void EnsureTrackInitialized(int number);
68 int GetLastGlobalEventTime() const;
69 void UpdateLastEventTime();
70 MIDI::MIDITrack& GetTrack(int trackNumber);
73 MIDI::MIDIFile m_MIDI;
74 std::vector<TrackCompilerContext> m_Contexts;
75 std::unordered_map<std::string, std::unique_ptr<ICommandProcessor>> m_CommandProcessors;
76 int m_LastEventTime = 0;
79 } // namespace IR2MIDI