1 /*
2  * Copyright (C) 2018-2020 Rerrah
3  *
4  * Permission is hereby granted, free of charge, to any person
5  * obtaining a copy of this software and associated documentation
6  * files (the "Software"), to deal in the Software without
7  * restriction, including without limitation the rights to use,
8  * copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following
11  * conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23  * OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 #pragma once
27 
28 #include <memory>
29 #include <vector>
30 #include "io/binary_container.hpp"
31 
32 class AbstractInstrument;
33 class InstrumentsManager;
34 struct WOPNFile;
35 
36 class AbstractBank
37 {
38 public:
39 	virtual ~AbstractBank() = default;
40 
41 	virtual size_t getNumInstruments() const = 0;
42 	virtual std::string getInstrumentIdentifier(size_t index) const = 0;
43 	virtual std::string getInstrumentName(size_t index) const = 0;
44 	virtual AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const = 0;
45 };
46 
47 class BtBank : public AbstractBank
48 {
49 public:
50 	BtBank(std::vector<int> ids, std::vector<std::string> names);
51 	BtBank(std::vector<int> ids, std::vector<std::string> names,
52 		   std::vector<BinaryContainer> instSecs, BinaryContainer propSec, uint32_t version);
53 	~BtBank() override;
54 
55 	size_t getNumInstruments() const override;
56 	std::string getInstrumentIdentifier(size_t index) const override;
57 	std::string getInstrumentName(size_t index) const override;
58 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
59 
60 private:
61 	std::vector<BinaryContainer> instCtrs_;
62 	BinaryContainer propCtr_;
63 	std::vector<int> ids_;
64 	std::vector<std::string> names_;
65 	uint32_t version_;
66 };
67 
68 class WopnBank : public AbstractBank
69 {
70 public:
71 	explicit WopnBank(WOPNFile *wopn);
72 	~WopnBank() override;
73 
74 	size_t getNumInstruments() const override;
75 	std::string getInstrumentIdentifier(size_t index) const override;
76 	std::string getInstrumentName(size_t index) const override;
77 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
78 
79 private:
80 	struct WOPNDeleter {
81 		void operator()(WOPNFile *x);
82 	};
83 	std::unique_ptr<WOPNFile, WOPNDeleter> wopn_;
84 
85 	struct InstEntry;
86 	std::vector<InstEntry> entries_;
87 };
88 
89 class FfBank : public AbstractBank
90 {
91 public:
92 	explicit FfBank(std::vector<int> ids, std::vector<std::string> names, std::vector<BinaryContainer> ctrs);
93 
94 	size_t getNumInstruments() const override;
95 	std::string getInstrumentIdentifier(size_t index) const override;
96 	std::string getInstrumentName(size_t index) const override;
97 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
98 
99 	void setInstrumentName(size_t index, const std::string& name);
100 
101 private:
102 	std::vector<int> ids_;
103 	std::vector<std::string> names_;
104 	std::vector<BinaryContainer> instCtrs_;
105 };
106 
107 class PpcBank : public AbstractBank
108 {
109 public:
110 	explicit PpcBank(std::vector<int> ids, std::vector<std::vector<uint8_t>> samples);
111 
112 	size_t getNumInstruments() const override;
113 	std::string getInstrumentIdentifier(size_t index) const override;
114 	std::string getInstrumentName(size_t index) const override;
115 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
116 
117 private:
118 	std::vector<int> ids_;
119 	std::vector<std::vector<uint8_t>> samples_;
120 };
121 
122 class PviBank : public AbstractBank
123 {
124 public:
125 	explicit PviBank(std::vector<int> ids, std::vector<std::vector<uint8_t>> samples);
126 
127 	size_t getNumInstruments() const override;
128 	std::string getInstrumentIdentifier(size_t index) const override;
129 	std::string getInstrumentName(size_t index) const override;
130 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
131 
132 private:
133 	std::vector<int> ids_;
134 	std::vector<std::vector<uint8_t>> samples_;
135 };
136 
137 class Mucom88Bank : public AbstractBank
138 {
139 public:
140 	explicit Mucom88Bank(std::vector<int> ids, std::vector<std::string> names, std::vector<BinaryContainer> ctrs);
141 
142 	size_t getNumInstruments() const override;
143 	std::string getInstrumentIdentifier(size_t index) const override;
144 	std::string getInstrumentName(size_t index) const override;
145 	AbstractInstrument* loadInstrument(size_t index, std::weak_ptr<InstrumentsManager> instMan, int instNum) const override;
146 
147 	void setInstrumentName(size_t index, const std::string& name);
148 
149 private:
150 	std::vector<int> ids_;
151 	std::vector<std::string> names_;
152 	std::vector<BinaryContainer> instCtrs_;
153 };
154