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 $
14 class csp_state_utils;
16 // ---------------------------------------------------------------------------
18 // OPM
\82É
\97Ç
\82
\8e\97\82½(?)
\89¹
\82ð
\90¶
\90¬
\82·
\82é
\89¹
\8c¹
\83\86\83j
\83b
\83g
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½
25 // clock: OPM
\82Ì
\83N
\83\8d\83b
\83N
\8eü
\94g
\90\94(Hz)
27 // rate:
\90¶
\90¬
\82·
\82é PCM
\82Ì
\95W
\96{
\8eü
\94g
\90\94(Hz)
30 //
\95Ô
\92l
\8f\89\8aú
\89»
\82É
\90¬
\8c÷
\82·
\82ê
\82Î true
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
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
47 //
\89¹
\8c¹
\82ð
\83\8a\83Z
\83b
\83g(
\8f\89\8aú
\89»)
\82·
\82é
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Þ
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
57 // IRQ
\8fo
\97Í
\82ð
\93Ç
\82Ý
\8fo
\82·
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[)
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
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)
75 // YM2151(OPM) ----------------------------------------------------
76 class DLL_PREFIX OPM : public Timer
84 bool Init(uint c, uint r, bool=false);
85 bool SetRate(uint c, uint r, bool);
86 void SetLPFCutoff(uint freq);
90 void SetReg(uint addr, uint data);
91 uint GetReg(uint addr);
92 uint ReadStatus() { return status & 0x03; }
94 void Mix(Sample* buffer, int nsamples);
96 void SetVolume(int db_l, int db_r);
97 void SetChannelMask(uint mask);
99 void DeclState(void *f);
100 void SaveState(void *f);
101 bool LoadState(void *f);
104 void Intr(bool value);
112 void SetStatus(uint bit);
113 void ResetStatus(uint bit);
114 void SetParameter(uint addr, uint data);
116 void RebuildTimeTable();
117 void MixSub(int activech, ISample**);
118 void MixSubL(int activech, ISample**);
135 uint lfo_count_diff_;
137 uint lfo_count_prev_;
158 static void BuildLFOTable();
159 static int amtable[4][OPM_LFOENTS];
160 static int pmtable[4][OPM_LFOENTS];
163 int dbgGetOpOut(int c, int s) { return ch[c].op[s].dbgopout_; }
164 Channel4* dbgGetCh(int c) { return &ch[c]; }