OSDN Git Service

AST2IR::AutpPop => Common::AutoPop へ移動
[yamml/yamml-git.git] / include / ir2midi / ir2midi.hpp
1
2 #pragma once
3
4 #include <memory>
5 #include <string>
6 #include <unordered_map>
7 #include <vector>
8
9 #include <boost/variant.hpp>
10
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>
17
18 namespace YAMML
19 {
20
21 namespace IR2MIDI
22 {
23
24 class IR2MIDICompiler final : public Compiler::CompilerBase, public IIR2MIDICompiler, public boost::static_visitor<>
25 {
26 public:
27     explicit IR2MIDICompiler(const IR::Module& ir) : m_IR(ir)
28     {
29         InitializeCommandProcessors();
30     }
31
32     template<typename T>
33     IR2MIDICompiler(const IR::Module& ir, T func) : CompilerBase(func), m_IR(ir)
34     {
35         InitializeCommandProcessors();
36     }
37
38     IR2MIDICompiler(const IR2MIDICompiler&) = delete;
39     IR2MIDICompiler& operator=(const IR2MIDICompiler&) = delete;
40
41     virtual ~IR2MIDICompiler() = default;
42
43     bool Compile(const std::string& entryPoint);
44
45     MIDI::MIDIFile& GetMIDI();
46     const MIDI::MIDIFile& GetMIDI() const;
47
48     void operator()(const IR::TrackList& ir);
49     void operator()(const AST::Command& ast);
50
51     void operator()(int trackNumber, const IR::Event& ev);
52     void operator()(int trackNumber, const IR::BlockReference& blockRef);
53
54     virtual std::string GetSourceName() const override;
55     virtual TrackCompilerContext& GetTrackContext(int trackNumber) override;
56     virtual bool HasTrackBlock(const std::string& trackBlockName) const override;
57
58 private:
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);
63     void Finalize();
64
65     void CheckForUnprocessedAttributes(const std::vector<AST::Attribute>& attributes);
66     void EnsureTrackInitialized(int number);
67
68     int GetLastGlobalEventTime() const;
69     void UpdateLastEventTime();
70     MIDI::MIDITrack& GetTrack(int trackNumber);
71
72     IR::Module m_IR;
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;
77 };
78
79 } // namespace IR2MIDI
80
81 } // namespace YAMML