aboutsummaryrefslogtreecommitdiff
path: root/core/qmpmidioutfluid.hpp
blob: 6cd2058fb10649cbdc7fb6397418112541c7ff12 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef QMPMIDIOUTFLUID_H
#define QMPMIDIOUTFLUID_H
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include "../include/qmpcorepublic.hpp"
#include <fluidsynth.h>
class IFluidSettings
{
	public:
		virtual void setOptStr(const char* opt,const char* val)=0;
		virtual void setOptInt(const char* opt,int val)=0;
		virtual void setOptNum(const char* opt,double val)=0;
		virtual void loadSFont(const char* path)=0;
		virtual void setGain(double gain)=0;
		virtual void setReverbPara(int e,double r,double d,double w,double l)=0;
		virtual void setChorusPara(int e,int fb,double l,double r,double d,int type)=0;
};
class qmpMidiOutFluid:public qmpMidiOutDevice,public IFluidSettings
{
	private:
		fluid_settings_t* settings;
		fluid_synth_t* synth;
		fluid_audio_driver_t* adriver;
		std::vector<std::pair<uint16_t,std::string>> bnk;
		std::unordered_map<uint16_t,std::vector<std::string>> pst;
		void update_preset_list();
	public:
		qmpMidiOutFluid();
		~qmpMidiOutFluid();
		void deviceInit();
		void deviceDeinit();
		void deviceDeinit(bool freshsettings);
		void basicMessage(uint8_t type,uint8_t p1,uint8_t p2);
		void extendedMessage(uint32_t length,const char *data);
		void rpnMessage(uint8_t ch,uint16_t type,uint16_t val);
		void nrpnMessage(uint8_t ch,uint16_t type,uint16_t val);
		void panic(uint8_t ch);
		void reset(uint8_t ch);
		void onMapped(uint8_t ch,int refcnt);
		void onUnmapped(uint8_t ch,int refcnt);
		std::vector<std::pair<uint16_t,std::string>> getBankList();
		std::vector<std::pair<uint8_t,std::string>> getPresets(uint16_t bank);
		std::string getPresetName(uint16_t bank,uint8_t preset);
		bool getChannelPreset(int ch,uint16_t *bank,uint8_t *preset,std::string &presetname);
		uint8_t getInitialCCValue(uint8_t cc);
		//FluidSynth specific stuff
		void setOptStr(const char* opt,const char* val);
		void setOptInt(const char* opt,int val);
		void setOptNum(const char* opt,double val);
		void loadSFont(const char* path);
		int getSFCount();

		int getPolyphone();
		int getMaxPolyphone();
		void setGain(double gain);
		void getChannelInfo(int ch,int *b,int *p,char *s);
		void getReverbPara(double *r,double *d,double *w,double *l);
		void setReverbPara(int e,double r,double d,double w,double l);
		void getChorusPara(int *fb,double *l,double *r,double *d,int *type);
		void setChorusPara(int e,int fb,double l,double r,double d,int type);
};
class qmpFileRendererFluid:public IFluidSettings
{
	private:
		fluid_settings_t* settings;
		fluid_synth_t* synth;
		fluid_player_t* player;
		bool finished;
		std::string fn;
	public:
		qmpFileRendererFluid(const char* _fn,const char* _ofn);
		~qmpFileRendererFluid();
		void renderInit();
		void renderDeinit();
		void renderWorker();
		void setOptStr(const char* opt,const char* val);
		void setOptInt(const char* opt,int val);
		void setOptNum(const char* opt,double val);
		void loadSFont(const char *path);
		bool isFinished();
		void setGain(double gain);
		void setReverbPara(int e,double r,double d,double w,double l);
		void setChorusPara(int e,int fb,double l,double r,double d,int type);

};
#endif // QMPMIDIOUTFLUID_H