OSDN Git Service

[FMGEN] Initial implementation of OPN2 (YM2612) from OPNA.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmgen / opm.h
1 // ---------------------------------------------------------------------------
2 //      OPM-like Sound Generator
3 //      Copyright (C) cisc 1998, 2003.
4 // ---------------------------------------------------------------------------
5 //      $Id: opm.h,v 1.14 2003/06/07 08:25:53 cisc Exp $
6
7 #ifndef FM_OPM_H
8 #define FM_OPM_H
9
10 #include "fmgen.h"
11 #include "fmtimer.h"
12 #include "psg.h"
13
14 class csp_state_utils;
15 class CSP_Logger;
16 // ---------------------------------------------------------------------------
17 //      class OPM
18 //      OPM \82É\97Ç\82­\8e\97\82½(?)\89¹\82ð\90\90¬\82·\82é\89¹\8c¹\83\86\83j\83b\83g
19 //      
20 //      interface:
21 //      bool Init(uint clock, uint rate, bool);
22 //              \8f\89\8aú\89»\81D\82±\82Ì\83N\83\89\83X\82ð\8eg\97p\82·\82é\91O\82É\82©\82È\82ç\82¸\8cÄ\82ñ\82Å\82¨\82­\82±\82Æ\81D
23 //              \92\8d\88Ó: \90ü\8c`\95â\8a®\83\82\81[\83h\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½
24 //
25 //              clock:  OPM \82Ì\83N\83\8d\83b\83N\8eü\94g\90\94(Hz)
26 //
27 //              rate:   \90\90¬\82·\82é PCM \82Ì\95W\96{\8eü\94g\90\94(Hz)
28 //
29 //                              
30 //              \95Ô\92l    \8f\89\8aú\89»\82É\90¬\8c÷\82·\82ê\82Πtrue
31 //
32 //      bool SetRate(uint clock, uint rate, bool)
33 //              \83N\83\8d\83b\83N\82â PCM \83\8c\81[\83g\82ð\95Ï\8dX\82·\82é
34 //              \88ø\90\94\93\99\82Í Init \82Æ\93¯\97l\81D
35 //      
36 //      void Mix(Sample* dest, int nsamples)
37 //              Stereo PCM \83f\81[\83^\82ð nsamples \95ª\8d\87\90¬\82µ\81C dest \82Å\8en\82Ü\82é\94z\97ñ\82É
38 //              \89Á\82¦\82é(\89Á\8eZ\82·\82é)
39 //              \81Edest \82É\82Í sample*2 \8cÂ\95ª\82Ì\97Ì\88æ\82ª\95K\97v
40 //              \81E\8ai\94[\8c`\8e®\82Í L, R, L, R... \82Æ\82È\82é\81D
41 //              \81E\82 \82­\82Ü\82Å\89Á\8eZ\82È\82Ì\82Å\81C\82 \82ç\82©\82\82ß\94z\97ñ\82ð\83[\83\8d\83N\83\8a\83A\82·\82é\95K\97v\82ª\82 \82é
42 //              \81EFM_SAMPLETYPE \82ª short \8c^\82Ì\8fê\8d\87\83N\83\8a\83b\83s\83\93\83O\82ª\8ds\82í\82ê\82é.
43 //              \81E\82±\82Ì\8aÖ\90\94\82Í\89¹\8c¹\93à\95\94\82Ì\83^\83C\83}\81[\82Æ\82Í\93Æ\97§\82µ\82Ä\82¢\82é\81D
44 //                Timer \82Í Count \82Æ GetNextEvent \82Å\91\80\8dì\82·\82é\95K\97v\82ª\82 \82é\81D
45 //      
46 //      void Reset()
47 //              \89¹\8c¹\82ð\83\8a\83Z\83b\83g(\8f\89\8aú\89»)\82·\82é
48 //
49 //      void SetReg(uint reg, uint data)
50 //              \89¹\8c¹\82Ì\83\8c\83W\83X\83^ reg \82É data \82ð\8f\91\82«\8d\9e\82Þ
51 //      
52 //      uint ReadStatus()
53 //              \89¹\8c¹\82Ì\83X\83e\81[\83^\83X\83\8c\83W\83X\83^\82ð\93Ç\82Ý\8fo\82·
54 //              busy \83t\83\89\83O\82Í\8fí\82É 0
55 //      
56 //      bool ReadIRQ()
57 //              IRQ \8fo\97Í\82ð\93Ç\82Ý\8fo\82·
58 //      
59 //      bool Count(uint32 t)
60 //              \89¹\8c¹\82Ì\83^\83C\83}\81[\82ð t [clock] \90i\82ß\82é\81D
61 //              \89¹\8c¹\82Ì\93à\95\94\8fó\91Ô\82É\95Ï\89»\82ª\82 \82Á\82½\8e\9e(timer \83I\81[\83o\81[\83t\83\8d\81[)
62 //              true \82ð\95Ô\82·
63 //
64 //      uint32 GetNextEvent()
65 //              \89¹\8c¹\82Ì\83^\83C\83}\81[\82Ì\82Ç\82¿\82ç\82©\82ª\83I\81[\83o\81[\83t\83\8d\81[\82·\82é\82Ü\82Å\82É\95K\97v\82È
66 //              \8e\9e\8aÔ[clock]\82ð\95Ô\82·
67 //              \83^\83C\83}\81[\82ª\92â\8e~\82µ\82Ä\82¢\82é\8fê\8d\87\82Í 0 \82ð\95Ô\82·\81D
68 //      
69 //      void SetVolume(int db_l, int db_r)
70 //              \8ae\89¹\8c¹\82Ì\89¹\97Ê\82ð\81{\81|\95û\8cü\82É\92²\90ß\82·\82é\81D\95W\8f\80\92l\82Í 0.
71 //              \92P\88Ê\82Í\96ñ 1/2 dB\81C\97L\8cø\94Í\88Í\82Ì\8fã\8cÀ\82Í 20 (10dB)
72 //
73 namespace FM
74 {
75         //      YM2151(OPM) ----------------------------------------------------
76         class DLL_PREFIX  OPM : public Timer
77         {
78         protected:
79                 int chip_num;
80         public:
81                 OPM();
82                 ~OPM() {}
83
84                 bool    Init(uint c, uint r, bool=false);
85                 bool    SetRate(uint c, uint r, bool);
86                 void    SetLPFCutoff(uint freq);
87                 void    Reset();
88                 bool    ReadIRQ();
89                 
90                 void    SetReg(uint addr, uint data);
91                 uint    GetReg(uint addr);
92                 uint    ReadStatus() { return status & 0x03; }
93                 
94                 void    Mix(Sample* buffer, int nsamples);
95                 
96                 void    SetVolume(int db_l, int db_r);
97                 void    SetChannelMask(uint mask);
98
99                 void DeclState(void *f);
100                 void SaveState(void *f);
101                 bool LoadState(void *f);
102                 
103         private:
104                 void    Intr(bool value);
105         
106         private:
107                 enum
108                 {
109                         OPM_LFOENTS = 512,
110                 };
111                 
112                 void    SetStatus(uint bit);
113                 void    ResetStatus(uint bit);
114                 void    SetParameter(uint addr, uint data);
115                 void    TimerA();
116                 void    RebuildTimeTable();
117                 void    MixSub(int activech, ISample**);
118                 void    MixSubL(int activech, ISample**);
119                 void    LFO();
120                 uint    Noise();
121                 
122                 int             fmvolume_l;
123                 int             fmvolume_r;
124
125                 uint    clock;
126                 uint    rate;
127                 uint    pcmrate;
128
129                 uint    pmd;
130                 uint    amd;
131                 uint    lfocount;
132                 uint    lfodcount;
133
134                 uint    lfo_count_;
135                 uint    lfo_count_diff_;
136                 uint    lfo_step_;
137                 uint    lfo_count_prev_;
138
139                 uint    lfowaveform;
140                 uint    rateratio;
141                 uint    noise;
142                 int32   noisecount;
143                 uint32  noisedelta;
144                 
145                 bool    interpolation;
146                 uint8   lfofreq;
147                 uint8   status;
148                 bool    interrupt;
149                 uint8   reg01;
150
151                 uint8   kc[8];
152                 uint8   kf[8];
153                 uint8   pan[8];
154
155                 Channel4 ch[8];
156                 Chip    chip;
157
158                 static void     BuildLFOTable();
159                 static int amtable[4][OPM_LFOENTS];
160                 static int pmtable[4][OPM_LFOENTS];
161
162         public:
163                 int             dbgGetOpOut(int c, int s) { return ch[c].op[s].dbgopout_; }
164                 Channel4* dbgGetCh(int c) { return &ch[c]; }
165
166         };
167 }
168
169 #endif // FM_OPM_H