1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_Util.cpp
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 28239 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 #include <nw/snd/snd_Util.h>
18 
19 #include <nw/ut/ut_Inlines.h>
20 #include <nw/snd/snd_SoundArchive.h>
21 #include <nw/snd/snd_SoundArchivePlayer.h>
22 #include <nw/snd/snd_WaveArchiveFileReader.h>
23 #include <nw/snd/snd_SoundArchiveLoader.h>
24 #include <nw/snd/snd_PlayerHeapDataManager.h>
25 
26 namespace nw {
27 namespace snd {
28 namespace internal {
29 
30 namespace {
31 
32 const int OCTAVE_DIVISION            = 12;
33 const int VOLUME_TABLE_SIZE          = Util::VOLUME_DB_MAX - Util::VOLUME_DB_MIN + 1;
34 
35 #if 0
36 const f32 PAN_CURVE_MIN = 0.71f;
37 f32 s_PanCurveMax = 1.0f; // PAN_CURVE_MIN;
38 #endif
39 
40 const f32 SURROUND_MODE_PAN_CURVE_MAX = 0.8f;
41 
42 //  ピッチスケールテーブル ( 半音単位 )
43 const f32 NoteTable[ OCTAVE_DIVISION ] =
44 {
45     1.00000000000000f,
46     1.05946309435930f,
47     1.12246204830937f,
48     1.18920711500272f,
49     1.25992104989487f,
50     1.33483985417003f,
51     1.41421356237310f,
52     1.49830707687668f,
53     1.58740105196820f,
54     1.68179283050743f,
55     1.78179743628068f,
56     1.88774862536339f
57 };
58 //  ピッチスケールテーブル ( 半音の 1/256 単位 )
59 
60 const f32 PitchTable[ Util::PITCH_DIVISION_RANGE ] =
61 {
62     1.00000000000000f, 1.00022565930507f, 1.00045136953226f, 1.00067713069307f,
63     1.00090294279898f, 1.00112880586149f, 1.00135471989211f, 1.00158068490233f,
64     1.00180670090365f, 1.00203276790759f, 1.00225888592566f, 1.00248505496936f,
65     1.00271127505020f, 1.00293754617972f, 1.00316386836942f, 1.00339024163082f,
66     1.00361666597546f, 1.00384314141486f, 1.00406966796055f, 1.00429624562407f,
67     1.00452287441694f, 1.00474955435071f, 1.00497628543691f, 1.00520306768709f,
68     1.00542990111280f, 1.00565678572558f, 1.00588372153699f, 1.00611070855857f,
69     1.00633774680189f, 1.00656483627850f, 1.00679197699996f, 1.00701916897784f,
70     1.00724641222370f, 1.00747370674912f, 1.00770105256566f, 1.00792844968490f,
71     1.00815589811842f, 1.00838339787779f, 1.00861094897460f, 1.00883855142043f,
72     1.00906620522687f, 1.00929391040551f, 1.00952166696794f, 1.00974947492577f,
73     1.00997733429057f, 1.01020524507396f, 1.01043320728755f, 1.01066122094292f,
74     1.01088928605170f, 1.01111740262549f, 1.01134557067591f, 1.01157379021458f,
75     1.01180206125310f, 1.01203038380312f, 1.01225875787623f, 1.01248718348409f,
76     1.01271566063830f, 1.01294418935052f, 1.01317276963236f, 1.01340140149547f,
77     1.01363008495149f, 1.01385882001206f, 1.01408760668882f, 1.01431644499343f,
78     1.01454533493752f, 1.01477427653277f, 1.01500326979081f, 1.01523231472332f,
79     1.01546141134194f, 1.01569055965835f, 1.01591975968421f, 1.01614901143119f,
80     1.01637831491095f, 1.01660767013518f, 1.01683707711556f, 1.01706653586375f,
81     1.01729604639144f, 1.01752560871032f, 1.01775522283207f, 1.01798488876839f,
82     1.01821460653096f, 1.01844437613148f, 1.01867419758165f, 1.01890407089317f,
83     1.01913399607774f, 1.01936397314707f, 1.01959400211286f, 1.01982408298683f,
84     1.02005421578069f, 1.02028440050616f, 1.02051463717495f, 1.02074492579879f,
85     1.02097526638940f, 1.02120565895850f, 1.02143610351784f, 1.02166660007913f,
86     1.02189714865412f, 1.02212774925453f, 1.02235840189212f, 1.02258910657863f,
87     1.02281986332579f, 1.02305067214536f, 1.02328153304909f, 1.02351244604873f,
88     1.02374341115603f, 1.02397442838276f, 1.02420549774068f, 1.02443661924155f,
89     1.02466779289714f, 1.02489901871921f, 1.02513029671954f, 1.02536162690990f,
90     1.02559300930208f, 1.02582444390784f, 1.02605593073898f, 1.02628746980727f,
91     1.02651906112451f, 1.02675070470248f, 1.02698240055299f, 1.02721414868781f,
92     1.02744594911876f, 1.02767780185764f, 1.02790970691624f, 1.02814166430638f,
93     1.02837367403986f, 1.02860573612850f, 1.02883785058410f, 1.02907001741849f,
94     1.02930223664349f, 1.02953450827092f, 1.02976683231260f, 1.02999920878037f,
95     1.03023163768604f, 1.03046411904146f, 1.03069665285846f, 1.03092923914889f,
96     1.03116187792457f, 1.03139456919736f, 1.03162731297909f, 1.03186010928163f,
97     1.03209295811682f, 1.03232585949652f, 1.03255881343258f, 1.03279181993686f,
98     1.03302487902123f, 1.03325799069755f, 1.03349115497769f, 1.03372437187351f,
99     1.03395764139691f, 1.03419096355973f, 1.03442433837388f, 1.03465776585123f,
100     1.03489124600365f, 1.03512477884305f, 1.03535836438130f, 1.03559200263031f,
101     1.03582569360196f, 1.03605943730815f, 1.03629323376078f, 1.03652708297176f,
102     1.03676098495299f, 1.03699493971638f, 1.03722894727384f, 1.03746300763728f,
103     1.03769712081862f, 1.03793128682977f, 1.03816550568267f, 1.03839977738923f,
104     1.03863410196138f, 1.03886847941105f, 1.03910290975017f, 1.03933739299068f,
105     1.03957192914452f, 1.03980651822362f, 1.04004116023993f, 1.04027585520539f,
106     1.04051060313196f, 1.04074540403158f, 1.04098025791621f, 1.04121516479780f,
107     1.04145012468832f, 1.04168513759972f, 1.04192020354397f, 1.04215532253304f,
108     1.04239049457890f, 1.04262571969352f, 1.04286099788887f, 1.04309632917694f,
109     1.04333171356970f, 1.04356715107914f, 1.04380264171725f, 1.04403818549601f,
110     1.04427378242741f, 1.04450943252346f, 1.04474513579614f, 1.04498089225746f,
111     1.04521670191942f, 1.04545256479402f, 1.04568848089328f, 1.04592445022919f,
112     1.04616047281379f, 1.04639654865907f, 1.04663267777707f, 1.04686886017980f,
113     1.04710509587929f, 1.04734138488756f, 1.04757772721665f, 1.04781412287858f,
114     1.04805057188539f, 1.04828707424912f, 1.04852362998181f, 1.04876023909550f,
115     1.04899690160224f, 1.04923361751407f, 1.04947038684306f, 1.04970720960124f,
116     1.04994408580069f, 1.05018101545345f, 1.05041799857160f, 1.05065503516719f,
117     1.05089212525229f, 1.05112926883898f, 1.05136646593932f, 1.05160371656540f,
118     1.05184102072929f, 1.05207837844307f, 1.05231578971883f, 1.05255325456865f,
119     1.05279077300463f, 1.05302834503885f, 1.05326597068341f, 1.05350364995040f,
120     1.05374138285194f, 1.05397916940012f, 1.05421700960704f, 1.05445490348482f,
121     1.05469285104557f, 1.05493085230140f, 1.05516890726443f, 1.05540701594677f,
122     1.05564517836056f, 1.05588339451791f, 1.05612166443095f, 1.05635998811181f,
123     1.05659836557263f, 1.05683679682555f, 1.05707528188269f, 1.05731382075621f,
124     1.05755241345824f, 1.05779106000093f, 1.05802976039644f, 1.05826851465692f,
125     1.05850732279451f, 1.05874618482139f, 1.05898510074970f, 1.05922407059161f
126 };
127 
128 const f32 Decibel2RatioTable[ VOLUME_TABLE_SIZE ] =
129 {
130                   0.000000000f, 3.05492E-05f, 3.09030E-05f, 3.12608E-05f, // -90.4dB = -infinity
131     3.16228E-05f, 3.19890E-05f, 3.23594E-05f, 3.27341E-05f, 3.31131E-05f, // -90.0dB
132     3.34965E-05f, 3.38844E-05f, 3.42768E-05f, 3.46737E-05f, 3.50752E-05f,
133     3.54813E-05f, 3.58922E-05f, 3.63078E-05f, 3.67282E-05f, 3.71535E-05f,
134     3.75837E-05f, 3.80189E-05f, 3.84592E-05f, 3.89045E-05f, 3.93550E-05f,
135     3.98107E-05f, 4.02717E-05f, 4.07380E-05f, 4.12098E-05f, 4.16869E-05f,
136     4.21697E-05f, 4.26580E-05f, 4.31519E-05f, 4.36516E-05f, 4.41570E-05f,
137     4.46684E-05f, 4.51856E-05f, 4.57088E-05f, 4.62381E-05f, 4.67735E-05f,
138     4.73151E-05f, 4.78630E-05f, 4.84172E-05f, 4.89779E-05f, 4.95450E-05f,
139     5.01187E-05f, 5.06991E-05f, 5.12861E-05f, 5.18800E-05f, 5.24807E-05f,
140     5.30884E-05f, 5.37032E-05f, 5.43250E-05f, 5.49541E-05f, 5.55904E-05f,
141     5.62341E-05f, 5.68853E-05f, 5.75440E-05f, 5.82103E-05f, 5.88844E-05f,
142     5.95662E-05f, 6.02560E-05f, 6.09537E-05f, 6.16595E-05f, 6.23735E-05f,
143     6.30957E-05f, 6.38263E-05f, 6.45654E-05f, 6.53131E-05f, 6.60693E-05f, // -84.0dB
144     6.68344E-05f, 6.76083E-05f, 6.83912E-05f, 6.91831E-05f, 6.99842E-05f,
145     7.07946E-05f, 7.16143E-05f, 7.24436E-05f, 7.32825E-05f, 7.41310E-05f,
146     7.49894E-05f, 7.58578E-05f, 7.67361E-05f, 7.76247E-05f, 7.85236E-05f,
147     7.94328E-05f, 8.03526E-05f, 8.12831E-05f, 8.22243E-05f, 8.31764E-05f,
148     8.41395E-05f, 8.51138E-05f, 8.60994E-05f, 8.70964E-05f, 8.81049E-05f,
149     8.91251E-05f, 9.01571E-05f, 9.12011E-05f, 9.22571E-05f, 9.33254E-05f,
150     9.44061E-05f, 9.54993E-05f, 9.66051E-05f, 9.77237E-05f, 9.88553E-05f,
151     0.000100000f, 0.000101158f, 0.000102329f, 0.000103514f, 0.000104713f, // -80.0dB
152     0.000105925f, 0.000107152f, 0.000108393f, 0.000109648f, 0.000110917f,
153     0.000112202f, 0.000113501f, 0.000114815f, 0.000116145f, 0.000117490f,
154     0.000118850f, 0.000120226f, 0.000121619f, 0.000123027f, 0.000124451f,
155     0.000125893f, 0.000127350f, 0.000128825f, 0.000130317f, 0.000131826f, // -78.0dB
156     0.000133352f, 0.000134896f, 0.000136458f, 0.000138038f, 0.000139637f,
157     0.000141254f, 0.000142889f, 0.000144544f, 0.000146218f, 0.000147911f,
158     0.000149624f, 0.000151356f, 0.000153109f, 0.000154882f, 0.000156675f,
159     0.000158489f, 0.000160325f, 0.000162181f, 0.000164059f, 0.000165959f,
160     0.000167880f, 0.000169824f, 0.000171791f, 0.000173780f, 0.000175792f,
161     0.000177828f, 0.000179887f, 0.000181970f, 0.000184077f, 0.000186209f,
162     0.000188365f, 0.000190546f, 0.000192752f, 0.000194984f, 0.000197242f,
163     0.000199526f, 0.000201837f, 0.000204174f, 0.000206538f, 0.000208930f,
164     0.000211349f, 0.000213796f, 0.000216272f, 0.000218776f, 0.000221309f,
165     0.000223872f, 0.000226464f, 0.000229087f, 0.000231739f, 0.000234423f,
166     0.000237137f, 0.000239883f, 0.000242661f, 0.000245471f, 0.000248313f,
167     0.000251189f, 0.000254097f, 0.000257040f, 0.000260016f, 0.000263027f, // -72.0dB
168     0.000266073f, 0.000269153f, 0.000272270f, 0.000275423f, 0.000278612f,
169     0.000281838f, 0.000285102f, 0.000288403f, 0.000291743f, 0.000295121f,
170     0.000298538f, 0.000301995f, 0.000305492f, 0.000309030f, 0.000312608f,
171     0.000316228f, 0.000319890f, 0.000323594f, 0.000327341f, 0.000331131f,
172     0.000334965f, 0.000338844f, 0.000342768f, 0.000346737f, 0.000350752f,
173     0.000354813f, 0.000358922f, 0.000363078f, 0.000367282f, 0.000371535f,
174     0.000375837f, 0.000380189f, 0.000384592f, 0.000389045f, 0.000393550f,
175     0.000398107f, 0.000402717f, 0.000407380f, 0.000412098f, 0.000416869f,
176     0.000421697f, 0.000426580f, 0.000431519f, 0.000436516f, 0.000441570f,
177     0.000446684f, 0.000451856f, 0.000457088f, 0.000462381f, 0.000467735f,
178     0.000473151f, 0.000478630f, 0.000484172f, 0.000489779f, 0.000495450f,
179     0.000501187f, 0.000506991f, 0.000512861f, 0.000518800f, 0.000524807f, // -66.0dB
180     0.000530884f, 0.000537032f, 0.000543250f, 0.000549541f, 0.000555904f,
181     0.000562341f, 0.000568853f, 0.000575440f, 0.000582103f, 0.000588844f,
182     0.000595662f, 0.000602560f, 0.000609537f, 0.000616595f, 0.000623735f,
183     0.000630957f, 0.000638263f, 0.000645654f, 0.000653131f, 0.000660693f,
184     0.000668344f, 0.000676083f, 0.000683912f, 0.000691831f, 0.000699842f,
185     0.000707946f, 0.000716143f, 0.000724436f, 0.000732825f, 0.000741310f,
186     0.000749894f, 0.000758578f, 0.000767361f, 0.000776247f, 0.000785236f,
187     0.000794328f, 0.000803526f, 0.000812831f, 0.000822243f, 0.000831764f,
188     0.000841395f, 0.000851138f, 0.000860994f, 0.000870964f, 0.000881049f,
189     0.000891251f, 0.000901571f, 0.000912011f, 0.000922571f, 0.000933254f,
190     0.000944061f, 0.000954993f, 0.000966051f, 0.000977237f, 0.000988553f,
191     0.001000000f, 0.001011579f, 0.001023293f, 0.001035142f, 0.001047129f, // -60.0dB ( 1/1000 )
192     0.001059254f, 0.001071519f, 0.001083927f, 0.001096478f, 0.001109175f,
193     0.001122018f, 0.001135011f, 0.001148154f, 0.001161449f, 0.001174898f,
194     0.001188502f, 0.001202264f, 0.001216186f, 0.001230269f, 0.001244515f,
195     0.001258925f, 0.001273503f, 0.001288250f, 0.001303167f, 0.001318257f,
196     0.001333521f, 0.001348963f, 0.001364583f, 0.001380384f, 0.001396368f,
197     0.001412538f, 0.001428894f, 0.001445440f, 0.001462177f, 0.001479108f,
198     0.001496236f, 0.001513561f, 0.001531087f, 0.001548817f, 0.001566751f,
199     0.001584893f, 0.001603245f, 0.001621810f, 0.001640590f, 0.001659587f,
200     0.001678804f, 0.001698244f, 0.001717908f, 0.001737801f, 0.001757924f,
201     0.001778279f, 0.001798871f, 0.001819701f, 0.001840772f, 0.001862087f,
202     0.001883649f, 0.001905461f, 0.001927525f, 0.001949845f, 0.001972423f,
203     0.001995262f, 0.002018366f, 0.002041738f, 0.002065380f, 0.002089296f, // -54.0dB
204     0.002113489f, 0.002137962f, 0.002162719f, 0.002187762f, 0.002213095f,
205     0.002238721f, 0.002264644f, 0.002290868f, 0.002317395f, 0.002344229f,
206     0.002371374f, 0.002398833f, 0.002426610f, 0.002454709f, 0.002483133f,
207     0.002511886f, 0.002540973f, 0.002570396f, 0.002600160f, 0.002630268f,
208     0.002660725f, 0.002691535f, 0.002722701f, 0.002754229f, 0.002786121f,
209     0.002818383f, 0.002851018f, 0.002884032f, 0.002917427f, 0.002951209f,
210     0.002985383f, 0.003019952f, 0.003054921f, 0.003090295f, 0.003126079f,
211     0.003162278f, 0.003198895f, 0.003235937f, 0.003273407f, 0.003311311f,
212     0.003349654f, 0.003388442f, 0.003427678f, 0.003467369f, 0.003507519f,
213     0.003548134f, 0.003589219f, 0.003630781f, 0.003672823f, 0.003715352f,
214     0.003758374f, 0.003801894f, 0.003845918f, 0.003890451f, 0.003935501f,
215     0.003981072f, 0.004027170f, 0.004073803f, 0.004120975f, 0.004168694f, // -48.0dB
216     0.004216965f, 0.004265795f, 0.004315191f, 0.004365158f, 0.004415704f,
217     0.004466836f, 0.004518559f, 0.004570882f, 0.004623810f, 0.004677351f,
218     0.004731513f, 0.004786301f, 0.004841724f, 0.004897788f, 0.004954502f,
219     0.005011872f, 0.005069907f, 0.005128614f, 0.005188000f, 0.005248075f,
220     0.005308844f, 0.005370318f, 0.005432503f, 0.005495409f, 0.005559043f,
221     0.005623413f, 0.005688529f, 0.005754399f, 0.005821032f, 0.005888437f,
222     0.005956621f, 0.006025596f, 0.006095369f, 0.006165950f, 0.006237348f,
223     0.006309573f, 0.006382635f, 0.006456542f, 0.006531306f, 0.006606934f,
224     0.006683439f, 0.006760830f, 0.006839116f, 0.006918310f, 0.006998420f,
225     0.007079458f, 0.007161434f, 0.007244360f, 0.007328245f, 0.007413102f,
226     0.007498942f, 0.007585776f, 0.007673615f, 0.007762471f, 0.007852356f,
227     0.007943282f, 0.008035261f, 0.008128305f, 0.008222426f, 0.008317638f, // -42.0dB
228     0.008413951f, 0.008511380f, 0.008609938f, 0.008709636f, 0.008810489f,
229     0.008912509f, 0.009015711f, 0.009120108f, 0.009225714f, 0.009332543f,
230     0.009440609f, 0.009549926f, 0.009660509f, 0.009772372f, 0.009885531f,
231     0.010000000f, 0.010115795f, 0.010232930f, 0.010351422f, 0.010471285f, // -40.0dB ( 1/100 )
232     0.010592537f, 0.010715193f, 0.010839269f, 0.010964782f, 0.011091748f,
233     0.011220185f, 0.011350108f, 0.011481536f, 0.011614486f, 0.011748976f,
234     0.011885022f, 0.012022644f, 0.012161860f, 0.012302688f, 0.012445146f,
235     0.012589254f, 0.012735031f, 0.012882496f, 0.013031668f, 0.013182567f,
236     0.013335214f, 0.013489629f, 0.013645831f, 0.013803843f, 0.013963684f,
237     0.014125375f, 0.014288940f, 0.014454398f, 0.014621772f, 0.014791084f,
238     0.014962357f, 0.015135612f, 0.015310875f, 0.015488166f, 0.015667511f,
239     0.015848932f, 0.016032454f, 0.016218101f, 0.016405898f, 0.016595869f, // -36.0dB
240     0.016788040f, 0.016982437f, 0.017179084f, 0.017378008f, 0.017579236f,
241     0.017782794f, 0.017988709f, 0.018197009f, 0.018407720f, 0.018620871f,
242     0.018836491f, 0.019054607f, 0.019275249f, 0.019498446f, 0.019724227f,
243     0.019952623f, 0.020183664f, 0.020417379f, 0.020653802f, 0.020892961f,
244     0.021134890f, 0.021379621f, 0.021627185f, 0.021877616f, 0.022130947f,
245     0.022387211f, 0.022646443f, 0.022908677f, 0.023173946f, 0.023442288f,
246     0.023713737f, 0.023988329f, 0.024266101f, 0.024547089f, 0.024831331f,
247     0.025118864f, 0.025409727f, 0.025703958f, 0.026001596f, 0.026302680f,
248     0.026607251f, 0.026915348f, 0.027227013f, 0.027542287f, 0.027861212f,
249     0.028183829f, 0.028510183f, 0.028840315f, 0.029174270f, 0.029512092f,
250     0.029853826f, 0.030199517f, 0.030549211f, 0.030902954f, 0.031260794f,
251     0.031622777f, 0.031988951f, 0.032359366f, 0.032734069f, 0.033113112f, // -30.0dB
252     0.033496544f, 0.033884416f, 0.034276779f, 0.034673685f, 0.035075187f,
253     0.035481339f, 0.035892193f, 0.036307805f, 0.036728230f, 0.037153523f,
254     0.037583740f, 0.038018940f, 0.038459178f, 0.038904514f, 0.039355008f,
255     0.039810717f, 0.040271703f, 0.040738028f, 0.041209752f, 0.041686938f,
256     0.042169650f, 0.042657952f, 0.043151908f, 0.043651583f, 0.044157045f,
257     0.044668359f, 0.045185594f, 0.045708819f, 0.046238102f, 0.046773514f,
258     0.047315126f, 0.047863009f, 0.048417237f, 0.048977882f, 0.049545019f,
259     0.050118723f, 0.050699071f, 0.051286138f, 0.051880004f, 0.052480746f,
260     0.053088444f, 0.053703180f, 0.054325033f, 0.054954087f, 0.055590426f,
261     0.056234133f, 0.056885293f, 0.057543994f, 0.058210322f, 0.058884366f,
262     0.059566214f, 0.060255959f, 0.060953690f, 0.061659500f, 0.062373484f,
263     0.063095734f, 0.063826349f, 0.064565423f, 0.065313055f, 0.066069345f, // -24.0dB
264     0.066834392f, 0.067608298f, 0.068391165f, 0.069183097f, 0.069984200f,
265     0.070794578f, 0.071614341f, 0.072443596f, 0.073282453f, 0.074131024f,
266     0.074989421f, 0.075857758f, 0.076736149f, 0.077624712f, 0.078523563f,
267     0.079432823f, 0.080352612f, 0.081283052f, 0.082224265f, 0.083176377f,
268     0.084139514f, 0.085113804f, 0.086099375f, 0.087096359f, 0.088104887f,
269     0.089125094f, 0.090157114f, 0.091201084f, 0.092257143f, 0.093325430f,
270     0.094406088f, 0.095499259f, 0.096605088f, 0.097723722f, 0.098855309f,
271     0.100000000f, 0.101157945f, 0.102329299f, 0.103514217f, 0.104712855f, // -20.0dB ( 1/10 )
272     0.105925373f, 0.107151931f, 0.108392691f, 0.109647820f, 0.110917482f,
273     0.112201845f, 0.113501082f, 0.114815362f, 0.116144861f, 0.117489755f,
274     0.118850223f, 0.120226443f, 0.121618600f, 0.123026877f, 0.124451461f,
275     0.125892541f, 0.127350308f, 0.128824955f, 0.130316678f, 0.131825674f, // -18.0dB
276     0.133352143f, 0.134896288f, 0.136458314f, 0.138038426f, 0.139636836f,
277     0.141253754f, 0.142889396f, 0.144543977f, 0.146217717f, 0.147910839f,
278     0.149623566f, 0.151356125f, 0.153108746f, 0.154881662f, 0.156675107f,
279     0.158489319f, 0.160324539f, 0.162181010f, 0.164058977f, 0.165958691f,
280     0.167880402f, 0.169824365f, 0.171790839f, 0.173780083f, 0.175792361f,
281     0.177827941f, 0.179887092f, 0.181970086f, 0.184077200f, 0.186208714f,
282     0.188364909f, 0.190546072f, 0.192752491f, 0.194984460f, 0.197242274f,
283     0.199526231f, 0.201836636f, 0.204173794f, 0.206538016f, 0.208929613f,
284     0.211348904f, 0.213796209f, 0.216271852f, 0.218776162f, 0.221309471f,
285     0.223872114f, 0.226464431f, 0.229086765f, 0.231739465f, 0.234422882f,
286     0.237137371f, 0.239883292f, 0.242661010f, 0.245470892f, 0.248313311f,
287     0.251188643f, 0.254097271f, 0.257039578f, 0.260015956f, 0.263026799f, // -12.0dB ( 1/4 )
288     0.266072506f, 0.269153480f, 0.272270131f, 0.275422870f, 0.278612117f,
289     0.281838293f, 0.285101827f, 0.288403150f, 0.291742701f, 0.295120923f,
290     0.298538262f, 0.301995172f, 0.305492111f, 0.309029543f, 0.312607937f,
291     0.316227766f, 0.319889511f, 0.323593657f, 0.327340695f, 0.331131121f,
292     0.334965439f, 0.338844156f, 0.342767787f, 0.346736850f, 0.350751874f,
293     0.354813389f, 0.358921935f, 0.363078055f, 0.367282300f, 0.371535229f,
294     0.375837404f, 0.380189396f, 0.384591782f, 0.389045145f, 0.393550075f,
295     0.398107171f, 0.402717034f, 0.407380278f, 0.412097519f, 0.416869383f,
296     0.421696503f, 0.426579519f, 0.431519077f, 0.436515832f, 0.441570447f,
297     0.446683592f, 0.451855944f, 0.457088190f, 0.462381021f, 0.467735141f,
298     0.473151259f, 0.478630092f, 0.484172368f, 0.489778819f, 0.495450191f,
299     0.501187234f, 0.506990708f, 0.512861384f, 0.518800039f, 0.524807460f, //  -6.0dB ( 1/2 )
300     0.530884444f, 0.537031796f, 0.543250331f, 0.549540874f, 0.555904257f,
301     0.562341325f, 0.568852931f, 0.575439937f, 0.582103218f, 0.588843655f,
302     0.595662144f, 0.602559586f, 0.609536897f, 0.616595002f, 0.623734835f,
303     0.630957344f, 0.638263486f, 0.645654229f, 0.653130553f, 0.660693448f,
304     0.668343918f, 0.676082975f, 0.683911647f, 0.691830971f, 0.699841996f,
305     0.707945784f, 0.716143410f, 0.724435960f, 0.732824533f, 0.741310241f,
306     0.749894209f, 0.758577575f, 0.767361489f, 0.776247117f, 0.785235635f,
307     0.794328235f, 0.803526122f, 0.812830516f, 0.822242650f, 0.831763771f, //  -2.0dB
308     0.841395142f, 0.851138038f, 0.860993752f, 0.870963590f, 0.881048873f,
309     0.891250938f, 0.901571138f, 0.912010839f, 0.922571427f, 0.933254301f, //  -1.0dB
310     0.944060876f, 0.954992586f, 0.966050879f, 0.977237221f, 0.988553095f,
311     1.000000000f, 1.011579454f, 1.023292992f, 1.035142167f, 1.047128548f, //   0.0dB
312     1.059253725f, 1.071519305f, 1.083926914f, 1.096478196f, 1.109174815f,
313     1.122018454f, 1.135010816f, 1.148153621f, 1.161448614f, 1.174897555f, //   1.0dB
314     1.188502227f, 1.202264435f, 1.216186001f, 1.230268771f, 1.244514612f,
315     1.258925412f, 1.273503081f, 1.288249552f, 1.303166778f, 1.318256739f, //   2.0dB
316     1.333521432f, 1.348962883f, 1.364583137f, 1.380384265f, 1.396368361f,
317     1.412537545f, 1.428893959f, 1.445439771f, 1.462177174f, 1.479108388f,
318     1.496235656f, 1.513561248f, 1.531087462f, 1.548816619f, 1.566751070f,
319     1.584893192f, 1.603245391f, 1.621810097f, 1.640589773f, 1.659586907f,
320     1.678804018f, 1.698243652f, 1.717908387f, 1.737800829f, 1.757923614f,
321     1.778279410f, 1.798870915f, 1.819700859f, 1.840772001f, 1.862087137f,
322     1.883649089f, 1.905460718f, 1.927524913f, 1.949844600f, 1.972422736f,
323     1.995262315f                                                          //   6.0dB ( *2 )
324 };
325 
326 const int PAN_TABLE_MAX              = 256;
327 const int PAN_TABLE_MIN              = 0;
328 const int PAN_TABLE_CENTER           = 128;
329 const int PAN_TABLE_SIZE             = PAN_TABLE_MAX - PAN_TABLE_MIN + 1;
330 
331 const f32 Pan2RatioTableSqrt[ PAN_TABLE_SIZE ] =
332 {
333     1.000000000f, 0.998044964f, 0.996086091f, 0.994123358f, 0.992156742f, 0.990186220f, 0.988211769f, 0.986233365f,
334     0.984250984f, 0.982264603f, 0.980274196f, 0.978279740f, 0.976281209f, 0.974278579f, 0.972271824f, 0.970260919f,
335     0.968245837f, 0.966226552f, 0.964203039f, 0.962175270f, 0.960143218f, 0.958106857f, 0.956066159f, 0.954021095f,
336     0.951971638f, 0.949917760f, 0.947859431f, 0.945796622f, 0.943729304f, 0.941657448f, 0.939581024f, 0.937500000f,
337     0.935414347f, 0.933324033f, 0.931229027f, 0.929129297f, 0.927024811f, 0.924915537f, 0.922801441f, 0.920682491f,
338     0.918558654f, 0.916429894f, 0.914296177f, 0.912157470f, 0.910013736f, 0.907864940f, 0.905711047f, 0.903552018f,
339     0.901387819f, 0.899218411f, 0.897043756f, 0.894863816f, 0.892678554f, 0.890487928f, 0.888291900f, 0.886090430f,
340     0.883883476f, 0.881670999f, 0.879452955f, 0.877229303f, 0.875000000f, 0.872765003f, 0.870524267f, 0.868277749f,
341     0.866025404f, 0.863767185f, 0.861503047f, 0.859232943f, 0.856956825f, 0.854674646f, 0.852386356f, 0.850091907f,
342     0.847791248f, 0.845484329f, 0.843171098f, 0.840851503f, 0.838525492f, 0.836193010f, 0.833854004f, 0.831508418f,
343     0.829156198f, 0.826797285f, 0.824431622f, 0.822059152f, 0.819679816f, 0.817293552f, 0.814900301f, 0.812500000f,
344     0.810092587f, 0.807677999f, 0.805256170f, 0.802827036f, 0.800390530f, 0.797946583f, 0.795495129f, 0.793036096f,
345     0.790569415f, 0.788095013f, 0.785612818f, 0.783122755f, 0.780624750f, 0.778118725f, 0.775604603f, 0.773082305f,
346     0.770551750f, 0.768012858f, 0.765465545f, 0.762909726f, 0.760345316f, 0.757772228f, 0.755190373f, 0.752599661f,
347     0.750000000f, 0.747391296f, 0.744773455f, 0.742146380f, 0.739509973f, 0.736864133f, 0.734208758f, 0.731543744f,
348     0.728868987f, 0.726184377f, 0.723489806f, 0.720785162f, 0.718070331f, 0.715345196f, 0.712609641f, 0.709863543f,
349     0.707106781f, 0.704339229f, 0.701560760f, 0.698771243f, 0.695970545f, 0.693158532f, 0.690335064f, 0.687500000f, // center(-3dB)
350     0.684653197f, 0.681794507f, 0.678923781f, 0.676040864f, 0.673145601f, 0.670237831f, 0.667317391f, 0.664384113f,
351     0.661437828f, 0.658478360f, 0.655505530f, 0.652519157f, 0.649519053f, 0.646505027f, 0.643476884f, 0.640434423f,
352     0.637377439f, 0.634305723f, 0.631219059f, 0.628117226f, 0.625000000f, 0.621867148f, 0.618718434f, 0.615553613f,
353     0.612372436f, 0.609174647f, 0.605959982f, 0.602728173f, 0.599478940f, 0.596212001f, 0.592927061f, 0.589623821f,
354     0.586301970f, 0.582961191f, 0.579601156f, 0.576221529f, 0.572821962f, 0.569402099f, 0.565961571f, 0.562500000f,
355     0.559016994f, 0.555512151f, 0.551985054f, 0.548435274f, 0.544862368f, 0.541265877f, 0.537645329f, 0.534000234f,
356     0.530330086f, 0.526634361f, 0.522912517f, 0.519163991f, 0.515388203f, 0.511584548f, 0.507752400f, 0.503891109f,
357     0.500000000f, 0.496078371f, 0.492125492f, 0.488140605f, 0.484122918f, 0.480071609f, 0.475985819f, 0.471864652f,
358     0.467707173f, 0.463512405f, 0.459279327f, 0.455006868f, 0.450693909f, 0.446339277f, 0.441941738f, 0.437500000f,
359     0.433012702f, 0.428478413f, 0.423895624f, 0.419262746f, 0.414578099f, 0.409839908f, 0.405046294f, 0.400195265f,
360     0.395284708f, 0.390312375f, 0.385275875f, 0.380172658f, 0.375000000f, 0.369754986f, 0.364434493f, 0.359035165f,
361     0.353553391f, 0.347985273f, 0.342326598f, 0.336572800f, 0.330718914f, 0.324759526f, 0.318688720f, 0.312500000f,
362     0.306186218f, 0.299739470f, 0.293150985f, 0.286410981f, 0.279508497f, 0.272431184f, 0.265165043f, 0.257694102f,
363     0.250000000f, 0.242061459f, 0.233853587f, 0.225346955f, 0.216506351f, 0.207289049f, 0.197642354f, 0.187500000f,
364     0.176776695f, 0.165359457f, 0.153093109f, 0.139754249f, 0.125000000f, 0.108253175f, 0.088388348f, 0.062500000f,
365     0.000000000f
366 };
367 const f32 Pan2RatioTableSqrtSurround[ PAN_TABLE_SIZE ] =
368 {
369     0.800000000f, 0.799274272f, 0.798548543f, 0.797822815f, 0.797097087f, 0.796371359f, 0.795645630f, 0.794919902f,
370     0.794194174f, 0.793468446f, 0.792742717f, 0.792016989f, 0.791291261f, 0.790565532f, 0.789839804f, 0.789114076f,
371     0.788388348f, 0.787662619f, 0.786936891f, 0.786211163f, 0.785485435f, 0.784759706f, 0.784033978f, 0.783308250f,
372     0.782582521f, 0.781856793f, 0.781131065f, 0.780405337f, 0.779679608f, 0.778953880f, 0.778228152f, 0.777502424f,
373     0.776776695f, 0.776050967f, 0.775325239f, 0.774599510f, 0.773873782f, 0.773148054f, 0.772422326f, 0.771696597f,
374     0.770970869f, 0.770245141f, 0.769519413f, 0.768793684f, 0.768067956f, 0.767342228f, 0.766616499f, 0.765890771f,
375     0.765165043f, 0.764439315f, 0.763713586f, 0.762987858f, 0.762262130f, 0.761536402f, 0.760810673f, 0.760084945f,
376     0.759359217f, 0.758633488f, 0.757907760f, 0.757182032f, 0.756456304f, 0.755730575f, 0.755004847f, 0.754279119f,
377     0.753553391f, 0.752827662f, 0.752101934f, 0.751376206f, 0.750650477f, 0.749924749f, 0.749199021f, 0.748473293f,
378     0.747747564f, 0.747021836f, 0.746296108f, 0.745570379f, 0.744844651f, 0.744118923f, 0.743393195f, 0.742667466f,
379     0.741941738f, 0.741216010f, 0.740490282f, 0.739764553f, 0.739038825f, 0.738313097f, 0.737587368f, 0.736861640f,
380     0.736135912f, 0.735410184f, 0.734684455f, 0.733958727f, 0.733232999f, 0.732507271f, 0.731781542f, 0.731055814f,
381     0.730330086f, 0.729604357f, 0.728878629f, 0.728152901f, 0.727427173f, 0.726701444f, 0.725975716f, 0.725249988f,
382     0.724524260f, 0.723798531f, 0.723072803f, 0.722347075f, 0.721621346f, 0.720895618f, 0.720169890f, 0.719444162f,
383     0.718718433f, 0.717992705f, 0.717266977f, 0.716541249f, 0.715815520f, 0.715089792f, 0.714364064f, 0.713638335f,
384     0.712912607f, 0.712186879f, 0.711461151f, 0.710735422f, 0.710009694f, 0.709283966f, 0.708558238f, 0.707832509f,
385     0.707106781f, 0.704339229f, 0.701560760f, 0.698771243f, 0.695970545f, 0.693158532f, 0.690335064f, 0.687500000f, // center(-3dB)
386     0.684653197f, 0.681794507f, 0.678923781f, 0.676040864f, 0.673145601f, 0.670237831f, 0.667317391f, 0.664384113f,
387     0.661437828f, 0.658478360f, 0.655505530f, 0.652519157f, 0.649519053f, 0.646505027f, 0.643476884f, 0.640434423f,
388     0.637377439f, 0.634305723f, 0.631219059f, 0.628117226f, 0.625000000f, 0.621867148f, 0.618718434f, 0.615553613f,
389     0.612372436f, 0.609174647f, 0.605959982f, 0.602728173f, 0.599478940f, 0.596212001f, 0.592927061f, 0.589623821f,
390     0.586301970f, 0.582961191f, 0.579601156f, 0.576221529f, 0.572821962f, 0.569402099f, 0.565961571f, 0.562500000f,
391     0.559016994f, 0.555512151f, 0.551985054f, 0.548435274f, 0.544862368f, 0.541265877f, 0.537645329f, 0.534000234f,
392     0.530330086f, 0.526634361f, 0.522912517f, 0.519163991f, 0.515388203f, 0.511584548f, 0.507752400f, 0.503891109f,
393     0.500000000f, 0.496078371f, 0.492125492f, 0.488140605f, 0.484122918f, 0.480071609f, 0.475985819f, 0.471864652f,
394     0.467707173f, 0.463512405f, 0.459279327f, 0.455006868f, 0.450693909f, 0.446339277f, 0.441941738f, 0.437500000f,
395     0.433012702f, 0.428478413f, 0.423895624f, 0.419262746f, 0.414578099f, 0.409839908f, 0.405046294f, 0.400195265f,
396     0.395284708f, 0.390312375f, 0.385275875f, 0.380172658f, 0.375000000f, 0.369754986f, 0.364434493f, 0.359035165f,
397     0.353553391f, 0.347985273f, 0.342326598f, 0.336572800f, 0.330718914f, 0.324759526f, 0.318688720f, 0.312500000f,
398     0.306186218f, 0.299739470f, 0.293150985f, 0.286410981f, 0.279508497f, 0.272431184f, 0.265165043f, 0.257694102f,
399     0.250000000f, 0.242061459f, 0.233853587f, 0.225346955f, 0.216506351f, 0.207289049f, 0.197642354f, 0.187500000f,
400     0.176776695f, 0.165359457f, 0.153093109f, 0.139754249f, 0.125000000f, 0.108253175f, 0.088388348f, 0.062500000f,
401     0.000000000f
402 };
403 
404 const f32 Pan2RatioTableSinCos[ PAN_TABLE_SIZE ] =
405 {
406     1.000000000f, 0.999981175f, 0.999924702f, 0.999830582f, 0.999698819f, 0.999529418f, 0.999322385f, 0.999077728f,
407     0.998795456f, 0.998475581f, 0.998118113f, 0.997723067f, 0.997290457f, 0.996820299f, 0.996312612f, 0.995767414f,
408     0.995184727f, 0.994564571f, 0.993906970f, 0.993211949f, 0.992479535f, 0.991709754f, 0.990902635f, 0.990058210f,
409     0.989176510f, 0.988257568f, 0.987301418f, 0.986308097f, 0.985277642f, 0.984210092f, 0.983105487f, 0.981963869f,
410     0.980785280f, 0.979569766f, 0.978317371f, 0.977028143f, 0.975702130f, 0.974339383f, 0.972939952f, 0.971503891f,
411     0.970031253f, 0.968522094f, 0.966976471f, 0.965394442f, 0.963776066f, 0.962121404f, 0.960430519f, 0.958703475f,
412     0.956940336f, 0.955141168f, 0.953306040f, 0.951435021f, 0.949528181f, 0.947585591f, 0.945607325f, 0.943593458f,
413     0.941544065f, 0.939459224f, 0.937339012f, 0.935183510f, 0.932992799f, 0.930766961f, 0.928506080f, 0.926210242f,
414     0.923879533f, 0.921514039f, 0.919113852f, 0.916679060f, 0.914209756f, 0.911706032f, 0.909167983f, 0.906595705f,
415     0.903989293f, 0.901348847f, 0.898674466f, 0.895966250f, 0.893224301f, 0.890448723f, 0.887639620f, 0.884797098f,
416     0.881921264f, 0.879012226f, 0.876070094f, 0.873094978f, 0.870086991f, 0.867046246f, 0.863972856f, 0.860866939f,
417     0.857728610f, 0.854557988f, 0.851355193f, 0.848120345f, 0.844853565f, 0.841554977f, 0.838224706f, 0.834862875f,
418     0.831469612f, 0.828045045f, 0.824589303f, 0.821102515f, 0.817584813f, 0.814036330f, 0.810457198f, 0.806847554f,
419     0.803207531f, 0.799537269f, 0.795836905f, 0.792106577f, 0.788346428f, 0.784556597f, 0.780737229f, 0.776888466f,
420     0.773010453f, 0.769103338f, 0.765167266f, 0.761202385f, 0.757208847f, 0.753186799f, 0.749136395f, 0.745057785f,
421     0.740951125f, 0.736816569f, 0.732654272f, 0.728464390f, 0.724247083f, 0.720002508f, 0.715730825f, 0.711432196f,
422     0.707106781f, 0.702754744f, 0.698376249f, 0.693971461f, 0.689540545f, 0.685083668f, 0.680600998f, 0.676092704f, // center(-3dB)
423     0.671558955f, 0.666999922f, 0.662415778f, 0.657806693f, 0.653172843f, 0.648514401f, 0.643831543f, 0.639124445f,
424     0.634393284f, 0.629638239f, 0.624859488f, 0.620057212f, 0.615231591f, 0.610382806f, 0.605511041f, 0.600616479f,
425     0.595699304f, 0.590759702f, 0.585797857f, 0.580813958f, 0.575808191f, 0.570780746f, 0.565731811f, 0.560661576f,
426     0.555570233f, 0.550457973f, 0.545324988f, 0.540171473f, 0.534997620f, 0.529803625f, 0.524589683f, 0.519355990f,
427     0.514102744f, 0.508830143f, 0.503538384f, 0.498227667f, 0.492898192f, 0.487550160f, 0.482183772f, 0.476799230f,
428     0.471396737f, 0.465976496f, 0.460538711f, 0.455083587f, 0.449611330f, 0.444122145f, 0.438616239f, 0.433093819f,
429     0.427555093f, 0.422000271f, 0.416429560f, 0.410843171f, 0.405241314f, 0.399624200f, 0.393992040f, 0.388345047f,
430     0.382683432f, 0.377007410f, 0.371317194f, 0.365612998f, 0.359895037f, 0.354163525f, 0.348418680f, 0.342660717f,
431     0.336889853f, 0.331106306f, 0.325310292f, 0.319502031f, 0.313681740f, 0.307849640f, 0.302005949f, 0.296150888f,
432     0.290284677f, 0.284407537f, 0.278519689f, 0.272621355f, 0.266712757f, 0.260794118f, 0.254865660f, 0.248927606f,
433     0.242980180f, 0.237023606f, 0.231058108f, 0.225083911f, 0.219101240f, 0.213110320f, 0.207111376f, 0.201104635f,
434     0.195090322f, 0.189068664f, 0.183039888f, 0.177004220f, 0.170961889f, 0.164913120f, 0.158858143f, 0.152797185f,
435     0.146730474f, 0.140658239f, 0.134580709f, 0.128498111f, 0.122410675f, 0.116318631f, 0.110222207f, 0.104121634f,
436     0.098017140f, 0.091908956f, 0.085797312f, 0.079682438f, 0.073564564f, 0.067443920f, 0.061320736f, 0.055195244f,
437     0.049067674f, 0.042938257f, 0.036807223f, 0.030674803f, 0.024541229f, 0.018406730f, 0.012271538f, 0.006135885f,
438     0.000000000f
439 };
440 const f32 Pan2RatioTableSinCosSurround[ PAN_TABLE_SIZE ] =
441 {
442     0.800000000f, 0.799274272f, 0.798548543f, 0.797822815f, 0.797097087f, 0.796371359f, 0.795645630f, 0.794919902f,
443     0.794194174f, 0.793468446f, 0.792742717f, 0.792016989f, 0.791291261f, 0.790565532f, 0.789839804f, 0.789114076f,
444     0.788388348f, 0.787662619f, 0.786936891f, 0.786211163f, 0.785485435f, 0.784759706f, 0.784033978f, 0.783308250f,
445     0.782582521f, 0.781856793f, 0.781131065f, 0.780405337f, 0.779679608f, 0.778953880f, 0.778228152f, 0.777502424f,
446     0.776776695f, 0.776050967f, 0.775325239f, 0.774599510f, 0.773873782f, 0.773148054f, 0.772422326f, 0.771696597f,
447     0.770970869f, 0.770245141f, 0.769519413f, 0.768793684f, 0.768067956f, 0.767342228f, 0.766616499f, 0.765890771f,
448     0.765165043f, 0.764439315f, 0.763713586f, 0.762987858f, 0.762262130f, 0.761536402f, 0.760810673f, 0.760084945f,
449     0.759359217f, 0.758633488f, 0.757907760f, 0.757182032f, 0.756456304f, 0.755730575f, 0.755004847f, 0.754279119f,
450     0.753553391f, 0.752827662f, 0.752101934f, 0.751376206f, 0.750650477f, 0.749924749f, 0.749199021f, 0.748473293f,
451     0.747747564f, 0.747021836f, 0.746296108f, 0.745570379f, 0.744844651f, 0.744118923f, 0.743393195f, 0.742667466f,
452     0.741941738f, 0.741216010f, 0.740490282f, 0.739764553f, 0.739038825f, 0.738313097f, 0.737587368f, 0.736861640f,
453     0.736135912f, 0.735410184f, 0.734684455f, 0.733958727f, 0.733232999f, 0.732507271f, 0.731781542f, 0.731055814f,
454     0.730330086f, 0.729604357f, 0.728878629f, 0.728152901f, 0.727427173f, 0.726701444f, 0.725975716f, 0.725249988f,
455     0.724524260f, 0.723798531f, 0.723072803f, 0.722347075f, 0.721621346f, 0.720895618f, 0.720169890f, 0.719444162f,
456     0.718718433f, 0.717992705f, 0.717266977f, 0.716541249f, 0.715815520f, 0.715089792f, 0.714364064f, 0.713638335f,
457     0.712912607f, 0.712186879f, 0.711461151f, 0.710735422f, 0.710009694f, 0.709283966f, 0.708558238f, 0.707832509f,
458     0.707106781f, 0.702754744f, 0.698376249f, 0.693971461f, 0.689540545f, 0.685083668f, 0.680600998f, 0.676092704f, // center(-3dB)
459     0.671558955f, 0.666999922f, 0.662415778f, 0.657806693f, 0.653172843f, 0.648514401f, 0.643831543f, 0.639124445f,
460     0.634393284f, 0.629638239f, 0.624859488f, 0.620057212f, 0.615231591f, 0.610382806f, 0.605511041f, 0.600616479f,
461     0.595699304f, 0.590759702f, 0.585797857f, 0.580813958f, 0.575808191f, 0.570780746f, 0.565731811f, 0.560661576f,
462     0.555570233f, 0.550457973f, 0.545324988f, 0.540171473f, 0.534997620f, 0.529803625f, 0.524589683f, 0.519355990f,
463     0.514102744f, 0.508830143f, 0.503538384f, 0.498227667f, 0.492898192f, 0.487550160f, 0.482183772f, 0.476799230f,
464     0.471396737f, 0.465976496f, 0.460538711f, 0.455083587f, 0.449611330f, 0.444122145f, 0.438616239f, 0.433093819f,
465     0.427555093f, 0.422000271f, 0.416429560f, 0.410843171f, 0.405241314f, 0.399624200f, 0.393992040f, 0.388345047f,
466     0.382683432f, 0.377007410f, 0.371317194f, 0.365612998f, 0.359895037f, 0.354163525f, 0.348418680f, 0.342660717f,
467     0.336889853f, 0.331106306f, 0.325310292f, 0.319502031f, 0.313681740f, 0.307849640f, 0.302005949f, 0.296150888f,
468     0.290284677f, 0.284407537f, 0.278519689f, 0.272621355f, 0.266712757f, 0.260794118f, 0.254865660f, 0.248927606f,
469     0.242980180f, 0.237023606f, 0.231058108f, 0.225083911f, 0.219101240f, 0.213110320f, 0.207111376f, 0.201104635f,
470     0.195090322f, 0.189068664f, 0.183039888f, 0.177004220f, 0.170961889f, 0.164913120f, 0.158858143f, 0.152797185f,
471     0.146730474f, 0.140658239f, 0.134580709f, 0.128498111f, 0.122410675f, 0.116318631f, 0.110222207f, 0.104121634f,
472     0.098017140f, 0.091908956f, 0.085797312f, 0.079682438f, 0.073564564f, 0.067443920f, 0.061320736f, 0.055195244f,
473     0.049067674f, 0.042938257f, 0.036807223f, 0.030674803f, 0.024541229f, 0.018406730f, 0.012271538f, 0.006135885f,
474     0.000000000f
475 };
476 
477 const f32 Pan2RatioTableLinear[ PAN_TABLE_SIZE ] =
478 {
479     1.000000000f, 0.996093750f, 0.992187500f, 0.988281250f, 0.984375000f, 0.980468750f, 0.976562500f, 0.972656250f,
480     0.968750000f, 0.964843750f, 0.960937500f, 0.957031250f, 0.953125000f, 0.949218750f, 0.945312500f, 0.941406250f,
481     0.937500000f, 0.933593750f, 0.929687500f, 0.925781250f, 0.921875000f, 0.917968750f, 0.914062500f, 0.910156250f,
482     0.906250000f, 0.902343750f, 0.898437500f, 0.894531250f, 0.890625000f, 0.886718750f, 0.882812500f, 0.878906250f,
483     0.875000000f, 0.871093750f, 0.867187500f, 0.863281250f, 0.859375000f, 0.855468750f, 0.851562500f, 0.847656250f,
484     0.843750000f, 0.839843750f, 0.835937500f, 0.832031250f, 0.828125000f, 0.824218750f, 0.820312500f, 0.816406250f,
485     0.812500000f, 0.808593750f, 0.804687500f, 0.800781250f, 0.796875000f, 0.792968750f, 0.789062500f, 0.785156250f,
486     0.781250000f, 0.777343750f, 0.773437500f, 0.769531250f, 0.765625000f, 0.761718750f, 0.757812500f, 0.753906250f,
487     0.750000000f, 0.746093750f, 0.742187500f, 0.738281250f, 0.734375000f, 0.730468750f, 0.726562500f, 0.722656250f,
488     0.718750000f, 0.714843750f, 0.710937500f, 0.707031250f, 0.703125000f, 0.699218750f, 0.695312500f, 0.691406250f,
489     0.687500000f, 0.683593750f, 0.679687500f, 0.675781250f, 0.671875000f, 0.667968750f, 0.664062500f, 0.660156250f,
490     0.656250000f, 0.652343750f, 0.648437500f, 0.644531250f, 0.640625000f, 0.636718750f, 0.632812500f, 0.628906250f,
491     0.625000000f, 0.621093750f, 0.617187500f, 0.613281250f, 0.609375000f, 0.605468750f, 0.601562500f, 0.597656250f,
492     0.593750000f, 0.589843750f, 0.585937500f, 0.582031250f, 0.578125000f, 0.574218750f, 0.570312500f, 0.566406250f,
493     0.562500000f, 0.558593750f, 0.554687500f, 0.550781250f, 0.546875000f, 0.542968750f, 0.539062500f, 0.535156250f,
494     0.531250000f, 0.527343750f, 0.523437500f, 0.519531250f, 0.515625000f, 0.511718750f, 0.507812500f, 0.503906250f,
495     0.500000000f, 0.496093750f, 0.492187500f, 0.488281250f, 0.484375000f, 0.480468750f, 0.476562500f, 0.472656250f, // center(-6dB)
496     0.468750000f, 0.464843750f, 0.460937500f, 0.457031250f, 0.453125000f, 0.449218750f, 0.445312500f, 0.441406250f,
497     0.437500000f, 0.433593750f, 0.429687500f, 0.425781250f, 0.421875000f, 0.417968750f, 0.414062500f, 0.410156250f,
498     0.406250000f, 0.402343750f, 0.398437500f, 0.394531250f, 0.390625000f, 0.386718750f, 0.382812500f, 0.378906250f,
499     0.375000000f, 0.371093750f, 0.367187500f, 0.363281250f, 0.359375000f, 0.355468750f, 0.351562500f, 0.347656250f,
500     0.343750000f, 0.339843750f, 0.335937500f, 0.332031250f, 0.328125000f, 0.324218750f, 0.320312500f, 0.316406250f,
501     0.312500000f, 0.308593750f, 0.304687500f, 0.300781250f, 0.296875000f, 0.292968750f, 0.289062500f, 0.285156250f,
502     0.281250000f, 0.277343750f, 0.273437500f, 0.269531250f, 0.265625000f, 0.261718750f, 0.257812500f, 0.253906250f,
503     0.250000000f, 0.246093750f, 0.242187500f, 0.238281250f, 0.234375000f, 0.230468750f, 0.226562500f, 0.222656250f,
504     0.218750000f, 0.214843750f, 0.210937500f, 0.207031250f, 0.203125000f, 0.199218750f, 0.195312500f, 0.191406250f,
505     0.187500000f, 0.183593750f, 0.179687500f, 0.175781250f, 0.171875000f, 0.167968750f, 0.164062500f, 0.160156250f,
506     0.156250000f, 0.152343750f, 0.148437500f, 0.144531250f, 0.140625000f, 0.136718750f, 0.132812500f, 0.128906250f,
507     0.125000000f, 0.121093750f, 0.117187500f, 0.113281250f, 0.109375000f, 0.105468750f, 0.101562500f, 0.097656250f,
508     0.093750000f, 0.089843750f, 0.085937500f, 0.082031250f, 0.078125000f, 0.074218750f, 0.070312500f, 0.066406250f,
509     0.062500000f, 0.058593750f, 0.054687500f, 0.050781250f, 0.046875000f, 0.042968750f, 0.039062500f, 0.035156250f,
510     0.031250000f, 0.027343750f, 0.023437500f, 0.019531250f, 0.015625000f, 0.011718750f, 0.007812500f, 0.003906250f,
511     0.000000000f
512 };
513 const f32 Pan2RatioTableLinearSurround[ PAN_TABLE_SIZE ] =
514 {
515     0.800000000f, 0.797656250f, 0.795312500f, 0.792968750f, 0.790625000f, 0.788281250f, 0.785937500f, 0.783593750f,
516     0.781250000f, 0.778906250f, 0.776562500f, 0.774218750f, 0.771875000f, 0.769531250f, 0.767187500f, 0.764843750f,
517     0.762500000f, 0.760156250f, 0.757812500f, 0.755468750f, 0.753125000f, 0.750781250f, 0.748437500f, 0.746093750f,
518     0.743750000f, 0.741406250f, 0.739062500f, 0.736718750f, 0.734375000f, 0.732031250f, 0.729687500f, 0.727343750f,
519     0.725000000f, 0.722656250f, 0.720312500f, 0.717968750f, 0.715625000f, 0.713281250f, 0.710937500f, 0.708593750f,
520     0.706250000f, 0.703906250f, 0.701562500f, 0.699218750f, 0.696875000f, 0.694531250f, 0.692187500f, 0.689843750f,
521     0.687500000f, 0.685156250f, 0.682812500f, 0.680468750f, 0.678125000f, 0.675781250f, 0.673437500f, 0.671093750f,
522     0.668750000f, 0.666406250f, 0.664062500f, 0.661718750f, 0.659375000f, 0.657031250f, 0.654687500f, 0.652343750f,
523     0.650000000f, 0.647656250f, 0.645312500f, 0.642968750f, 0.640625000f, 0.638281250f, 0.635937500f, 0.633593750f,
524     0.631250000f, 0.628906250f, 0.626562500f, 0.624218750f, 0.621875000f, 0.619531250f, 0.617187500f, 0.614843750f,
525     0.612500000f, 0.610156250f, 0.607812500f, 0.605468750f, 0.603125000f, 0.600781250f, 0.598437500f, 0.596093750f,
526     0.593750000f, 0.591406250f, 0.589062500f, 0.586718750f, 0.584375000f, 0.582031250f, 0.579687500f, 0.577343750f,
527     0.575000000f, 0.572656250f, 0.570312500f, 0.567968750f, 0.565625000f, 0.563281250f, 0.560937500f, 0.558593750f,
528     0.556250000f, 0.553906250f, 0.551562500f, 0.549218750f, 0.546875000f, 0.544531250f, 0.542187500f, 0.539843750f,
529     0.537500000f, 0.535156250f, 0.532812500f, 0.530468750f, 0.528125000f, 0.525781250f, 0.523437500f, 0.521093750f,
530     0.518750000f, 0.516406250f, 0.514062500f, 0.511718750f, 0.509375000f, 0.507031250f, 0.504687500f, 0.502343750f,
531     0.500000000f, 0.496093750f, 0.492187500f, 0.488281250f, 0.484375000f, 0.480468750f, 0.476562500f, 0.472656250f, // center(-6dB)
532     0.468750000f, 0.464843750f, 0.460937500f, 0.457031250f, 0.453125000f, 0.449218750f, 0.445312500f, 0.441406250f,
533     0.437500000f, 0.433593750f, 0.429687500f, 0.425781250f, 0.421875000f, 0.417968750f, 0.414062500f, 0.410156250f,
534     0.406250000f, 0.402343750f, 0.398437500f, 0.394531250f, 0.390625000f, 0.386718750f, 0.382812500f, 0.378906250f,
535     0.375000000f, 0.371093750f, 0.367187500f, 0.363281250f, 0.359375000f, 0.355468750f, 0.351562500f, 0.347656250f,
536     0.343750000f, 0.339843750f, 0.335937500f, 0.332031250f, 0.328125000f, 0.324218750f, 0.320312500f, 0.316406250f,
537     0.312500000f, 0.308593750f, 0.304687500f, 0.300781250f, 0.296875000f, 0.292968750f, 0.289062500f, 0.285156250f,
538     0.281250000f, 0.277343750f, 0.273437500f, 0.269531250f, 0.265625000f, 0.261718750f, 0.257812500f, 0.253906250f,
539     0.250000000f, 0.246093750f, 0.242187500f, 0.238281250f, 0.234375000f, 0.230468750f, 0.226562500f, 0.222656250f,
540     0.218750000f, 0.214843750f, 0.210937500f, 0.207031250f, 0.203125000f, 0.199218750f, 0.195312500f, 0.191406250f,
541     0.187500000f, 0.183593750f, 0.179687500f, 0.175781250f, 0.171875000f, 0.167968750f, 0.164062500f, 0.160156250f,
542     0.156250000f, 0.152343750f, 0.148437500f, 0.144531250f, 0.140625000f, 0.136718750f, 0.132812500f, 0.128906250f,
543     0.125000000f, 0.121093750f, 0.117187500f, 0.113281250f, 0.109375000f, 0.105468750f, 0.101562500f, 0.097656250f,
544     0.093750000f, 0.089843750f, 0.085937500f, 0.082031250f, 0.078125000f, 0.074218750f, 0.070312500f, 0.066406250f,
545     0.062500000f, 0.058593750f, 0.054687500f, 0.050781250f, 0.046875000f, 0.042968750f, 0.039062500f, 0.035156250f,
546     0.031250000f, 0.027343750f, 0.023437500f, 0.019531250f, 0.015625000f, 0.011718750f, 0.007812500f, 0.003906250f,
547     0.000000000f
548 };
549 
550 const int PAN_CURVE_NUM = 3;
551 const f32* PanTableTable[ PAN_CURVE_NUM ] =
552 {
553     Pan2RatioTableSqrt,
554     Pan2RatioTableSinCos,
555     Pan2RatioTableLinear
556 };
557 const f32* PanTableTableForSurround[ PAN_CURVE_NUM ] =
558 {
559     Pan2RatioTableSqrtSurround,
560     Pan2RatioTableSinCosSurround,
561     Pan2RatioTableLinearSurround
562 };
563 
564 // CalcTick 用
565 #ifdef NW_PLATFORM_CTR
566 class TickCalculator
567 {
568 private:
569     static const int LOG_BUF_SIZE = 20;
570 
571     nn::os::Tick m_Ticks[ LOG_BUF_SIZE ];
572     nn::os::Tick m_TmpTick;
573     int m_Counter;
574 
575 public:
TickCalculator()576     TickCalculator() : m_Counter( 0 ) {}
577 
Calc()578     void Calc()
579     {
580         nn::os::Tick tick2 = nn::os::Tick::GetSystemCurrent();
581         m_Ticks[ m_Counter ] = ( tick2 - m_TmpTick );
582         m_TmpTick = tick2;
583 
584         m_Counter += 1;
585         if ( m_Counter == LOG_BUF_SIZE )
586         {
587             char str[300]; str[0] = '\0';
588             for ( int i = 0; i < LOG_BUF_SIZE; i++ )
589             {
590                 std::snprintf( str, 300, "%s [%2lld]",
591                         str, m_Ticks[i].ToTimeSpan().GetMilliSeconds() );
592             }
593             NN_LOG("%s\n", str );
594             m_Counter = 0;
595         }
596     }
597 };
598 TickCalculator s_TickCalculator;
599 #endif
600 
601 } // anonymous namespace
602 
603 
604 
605 // CalcLpfFreq Table 80Hz - 16000Hz
606 //      - scale 値は scale = (0.1/3) * idx + 0.135614381 と見なす
607 //      - freq 値は RVL_SDK の axvpb.pb.lpf のカットオフ周波数を参考にした
608 const f32 Util::CALC_LPF_FREQ_INTERCEPT = 0.135614381f;
609 const u16 Util::CalcLpfFreqTable[ CALC_LPF_FREQ_TABLE_SIZE ] =
610 {
611     // freq(Hz),   scale
612        80,      // 0.135614381 == CALC_LPF_FREQ_INTERCEPT
613       100,      // 0.167807191
614       128,      // 0.203421572
615       160,      // 0.235614381
616       200,      // 0.267807191
617       256,      // 0.303421572
618       320,      // 0.335614381
619       400,      // 0.367807191
620       500,      // 0.400000000
621       640,      // 0.435614381
622       800,      // 0.467807191
623      1000,      // 0.500000000
624      1280,      // 0.535614381
625      1600,      // 0.567807191
626      2000,      // 0.600000000
627      2560,      // 0.635614381
628      3200,      // 0.667807191
629      4000,      // 0.700000000
630      5120,      // 0.735614381
631      6400,      // 0.767807191
632      8000,      // 0.800000000
633     10240,      // 0.835614381
634     12800,      // 0.867807191
635     16000       // 0.900000000
636 };
637 
CalcLpfFreq(f32 scale)638 u16 Util::CalcLpfFreq( f32 scale )
639 {
640     scale = ut::Clamp( scale, 0.0f, 1.0f );
641 
642     u16 freq = 0;
643 
644     // freq = static_cast<u16>( std::pow( 2.0, ( scale-1.0 ) * 10.0 ) * 32000.0 );
645     // のかわりにテーブルを使用する
646     if ( scale < CALC_LPF_FREQ_INTERCEPT )
647     {
648         freq = CalcLpfFreqTable[0];
649     }
650     else if ( scale >= 0.9f )
651     {
652         freq = CalcLpfFreqTable[CALC_LPF_FREQ_TABLE_SIZE-1];
653     }
654     else
655     {
656         int idx = static_cast<int>( (scale-CALC_LPF_FREQ_INTERCEPT) / (0.1f/3) );
657         freq = CalcLpfFreqTable[ idx ];
658     }
659 
660     return freq;
661 }
662 
663 #if 0
664 f32 Util::SetPanCurveMax( f32 max )
665 {
666     if ( max > PAN_CURVE_MIN )
667     {
668         s_PanCurveMax = max;
669     }
670     else
671     {
672         s_PanCurveMax = PAN_CURVE_MIN;
673     }
674     return s_PanCurveMax;
675 }
676 f32 Util::GetPanCurveMax()
677 {
678     return s_PanCurveMax;
679 }
680 f32 Util::GetPanCurveMin()
681 {
682     return PAN_CURVE_MIN;
683 }
684 #endif
685 
686 
CalcPanRatio(f32 pan,const PanInfo & info)687 f32 Util::CalcPanRatio( f32 pan, const PanInfo& info )
688 {
689     pan = ( ut::Clamp( pan, -1.0f, 1.0f ) + 1.0f ) / 2.0f; // 0.0 - 1.0 のスケールに
690 
691     const f32* table = NULL;
692     if ( nw::snd::SoundSystem::GetOutputMode() == nw::snd::OUTPUT_MODE_SURROUND )
693     {
694         table = PanTableTableForSurround[ info.curve ];
695     }
696     else
697     {
698         table = PanTableTable[ info.curve ];
699     }
700 
701     register f32 ratio = 0.0f;
702     ratio = table[ static_cast<int>( pan * PAN_TABLE_MAX + 0.5f ) ];
703 
704     if ( info.centerZeroFlag )
705     {
706         ratio /= table[ PAN_TABLE_CENTER ]; // 中央で1.0倍になるようにする
707     }
708 
709     if ( info.zeroClampFlag )
710     {
711         ratio = ut::Clamp( ratio, 0.0f, 1.0f );
712     }
713     else
714     {
715         ratio = ut::Clamp( ratio, 0.0f, 2.0f );
716     }
717 
718     return ratio;
719 }
720 
CalcSurroundPanRatio(f32 surroundPan,const PanInfo & info)721 f32 Util::CalcSurroundPanRatio( f32 surroundPan, const PanInfo& info )
722 {
723     surroundPan = ut::Clamp( surroundPan, 0.0f, 2.0f ) / 2.0f; // 0.0 - 1.0 のスケールに
724 
725     const f32* table = PanTableTable[ info.curve ];
726 
727     f32 ratio = table[ static_cast<int>( surroundPan * PAN_TABLE_MAX + 0.5f ) ];
728 
729     ratio = ut::Clamp( ratio, 0.0f, 2.0f );
730 
731     return ratio;
732 }
733 /*---------------------------------------------------------------------------*
734   Name:         CalcPitchRatio
735 
736   Description:  セント単位系から倍率を求める
737 
738   Arguments:    pitch : original key からのピッチのずれ(分解能:半音の1/256)
739 
740   Returns:      ピッチ倍率
741  *---------------------------------------------------------------------------*/
CalcPitchRatio(int pitch_)742 f32 Util::CalcPitchRatio( int pitch_ )
743 {
744     static const int RANGE = PITCH_DIVISION_RANGE * OCTAVE_DIVISION;
745 
746     register int pitch = pitch_;
747 
748     register int octave = 0;
749     while ( pitch < 0 )
750     {
751         octave--;
752         pitch += RANGE;
753     }
754     while ( pitch >= RANGE )
755     {
756         octave++;
757         pitch -= RANGE;
758     }
759 
760     register int note = pitch / PITCH_DIVISION_RANGE;
761     pitch -= note * PITCH_DIVISION_RANGE;
762 
763     register f32 ratio = 1.0f;
764     while ( octave > 0 )
765     {
766         ratio *= 2.0f;
767         octave--;
768     }
769     while ( octave < 0 )
770     {
771         ratio /= 2.0f;
772         octave++;
773     }
774 
775     if ( note  != 0 )
776     {
777         ratio *= NoteTable[note];
778     }
779     if ( pitch != 0 )
780     {
781         ratio *= PitchTable[pitch];
782     }
783 
784     return ratio;
785 }
786 
CalcVolumeRatio(f32 dB)787 f32 Util::CalcVolumeRatio( f32 dB )
788 {
789     dB = ut::Clamp( dB, -90.4f, 6.0f );
790     int index = static_cast<int>( dB * 10 ) - VOLUME_DB_MIN;
791     return Decibel2RatioTable[ index ];
792 }
793 
CalcRandom()794 u16 Util::CalcRandom()
795 {
796     static u32 u = 0x12345678;
797     u = u * 1664525 + 1013904223;
798     return static_cast<u16>( u >> 16 );
799 }
800 
801 // ID が waveArchiveId の波形アーカイブの waveIndex 番目の波形アドレスを返します。
802 // 未ロードの場合、NULL が返ります。
GetWaveFile(u32 waveArchiveId,u32 waveIndex,const SoundArchive & arc,const SoundArchivePlayer & player)803 const void* Util::GetWaveFile(
804     u32 waveArchiveId,
805     u32 waveIndex,
806     const SoundArchive& arc,
807     const SoundArchivePlayer& player )
808 {
809     // 波形アーカイブを取得
810     SoundArchive::WaveArchiveInfo info;
811     if ( ! arc.ReadWaveArchiveInfo( waveArchiveId, &info ) )
812     {
813         return NULL;    // ID == warcId の波形アーカイブ情報が見つからない
814     }
815 
816     const void* warcFile = player.detail_GetFileAddress( info.fileId );
817     // NW_WARNING( warcFile, "warc(0x%08x) is not loaded.", waveArchiveId );
818     // ↑プレイヤーヒープ利用時に必ず出力されるのでコメントアウト
819     if ( warcFile == NULL )
820     {
821         return NULL;    // 波形アーカイブが未ロードだった
822     }
823 
824     // 波形ファイルを取得
825     WaveArchiveFileReader reader( warcFile, info.isLoadIndividual );
826     const void* waveFile = reader.GetWaveFile( waveIndex );
827     // NOTE: この waveFile を差し替えることができれば、任意の波形で
828     //       ノートオンすることができる。
829     NW_WARNING( waveFile, "index(%d) in warc(0x%08x) is not loaded.", waveIndex, waveArchiveId );
830     if ( waveFile == NULL )
831     {
832         return NULL;
833     }
834     return waveFile;
835 }
836 
GetWaveFile(u32 waveArchiveId,u32 waveIndex,const SoundArchive & arc,const PlayerHeapDataManager * mgr)837 const void* Util::GetWaveFile(
838     u32 waveArchiveId,
839     u32 waveIndex,
840     const SoundArchive& arc,
841     const PlayerHeapDataManager* mgr )
842 {
843     // 波形アーカイブを取得
844     SoundArchive::WaveArchiveInfo info;
845     if ( ! arc.ReadWaveArchiveInfo( waveArchiveId, &info ) )
846     {
847         return NULL;    // ID == warcId の波形アーカイブ情報が見つからない
848     }
849 
850     const void* warcFile = mgr->GetFileAddress( info.fileId );
851     NW_WARNING( warcFile, "warc(0x%08x) is not loaded.", waveArchiveId );
852     if ( warcFile == NULL )
853     {
854         return NULL;
855     }
856 
857     // 波形ファイルを取得
858     WaveArchiveFileReader reader( warcFile, info.isLoadIndividual );
859     const void* waveFile = reader.GetWaveFile( waveIndex );
860     NW_WARNING( waveFile, "index(%d) in warc(0x%08x) is not loaded.", waveIndex, waveArchiveId );
861     if ( waveFile == NULL )
862     {
863         return NULL;
864     }
865     return waveFile;
866 }
867 
IsLoadedWaveArchive(const void * bankFile,const SoundArchive & arc,const SoundArchiveLoader & mgr)868 bool Util::IsLoadedWaveArchive(
869         const void* bankFile,
870         const SoundArchive& arc,
871         const SoundArchiveLoader& mgr )
872 {
873     BankFileReader bankFileReader( bankFile );
874     const Util::WaveIdTable& table = bankFileReader.GetWaveIdTable();
875 
876     // 1 バンク = 1 波形アーカイブなので、テーブルの 0 番目だけ見れば、
877     // どの波形アーカイブと関連付けられているかがわかる
878     Util::WaveId waveId = table.GetWaveId( 0 );
879     const void* waveArchiveFile = mgr.detail_GetFileAddressByItemId( waveId.waveArchiveId );
880     if ( waveArchiveFile == NULL )
881     {
882         return false;
883     }
884 
885     // 個別ロード波形のうち、ひとつでもロードされていない場合は、false を返す
886     SoundArchive::WaveArchiveInfo warcInfo;
887     bool isReadWarcInfo = arc.ReadWaveArchiveInfo( waveId.waveArchiveId, &warcInfo );
888     NW_ASSERTMSG( isReadWarcInfo, "WARC(%08x) is invalid.", waveId.waveArchiveId );
889 
890     if ( warcInfo.isLoadIndividual )
891     {
892         WaveArchiveFileReader reader( waveArchiveFile, true );
893         for ( int i = 0; i < table.GetCount(); i++ )
894         {
895             if ( ! reader.IsLoaded( waveId.waveIndex ) )
896             {
897                 return false;
898             }
899         }
900     }
901     return true;
902 }
903 
IsLoadedWaveArchive(const void * wsdFile,u32 index,const SoundArchive & arc,const SoundArchiveLoader & mgr)904 bool Util::IsLoadedWaveArchive(
905         const void* wsdFile,
906         u32 index,
907         const SoundArchive& arc,
908         const SoundArchiveLoader& mgr )
909 {
910     WaveSoundFileReader reader( wsdFile );
911     WaveSoundNoteInfo noteInfo;
912     bool isReadNoteInfo = reader.ReadNoteInfo( &noteInfo, index, 0 );
913     NW_ASSERT( isReadNoteInfo );
914 
915     // 波形アーカイブファイル取得
916     const void* waveArchiveFile =
917         mgr.detail_GetFileAddressByItemId( noteInfo.waveArchiveId );
918     if ( waveArchiveFile == NULL )
919     {
920         return false;
921     }
922 
923     // 個別ロード波形のうち、このウェーブサウンドに必要な波形がロードされているかチェック
924     SoundArchive::WaveArchiveInfo warcInfo;
925     bool isReadWarcInfo = arc.ReadWaveArchiveInfo( noteInfo.waveArchiveId, &warcInfo );
926     NW_ASSERTMSG( isReadWarcInfo, "WARC(%08x) is invalid.", noteInfo.waveArchiveId );
927 
928     if ( warcInfo.isLoadIndividual )
929     {
930         WaveArchiveFileReader warcReader( waveArchiveFile, true );
931         if ( ! warcReader.IsLoaded( noteInfo.waveIndex ) )
932         {
933             return false;
934         }
935     }
936     return true;
937 }
938 
CalcTick()939 void Util::CalcTick()
940 {
941 #ifdef NW_PLATFORM_CTR
942     s_TickCalculator.Calc();
943 #endif /* NW_PLATFORM_CTR */
944 }
945 
GetSampleByByte(unsigned long byte,SampleFormat format)946 unsigned long Util::GetSampleByByte( unsigned long byte, SampleFormat format )
947 {
948     unsigned long samples = 0;
949     unsigned long frac;
950 
951     switch ( format )
952     {
953     case SAMPLE_FORMAT_DSP_ADPCM:
954         samples = ( byte / 8 ) * 14;
955         frac = ( byte % 8 );
956         if ( frac != 0 )
957         {
958             samples += ( frac - 1 ) * 2 ;
959         }
960         break;
961 
962     case SAMPLE_FORMAT_PCM_S8:
963         samples = byte;
964         break;
965 
966     /*
967     case SAMPLE_FORMAT_PCM_S16_BE:
968     case SAMPLE_FORMAT_PCM_S16_LE:
969     */
970     case SAMPLE_FORMAT_PCM_S16:
971         samples = ( byte >> 1 );
972         break;
973 
974     default:
975         NW_ASSERTMSG( false, "Invalid format\n" );
976         break;
977     }
978 
979     return samples;
980 }
981 
GetByteBySample(unsigned long samples,SampleFormat format)982 unsigned long Util::GetByteBySample( unsigned long samples, SampleFormat format )
983 {
984     unsigned long byte = 0;
985     unsigned long frac;
986 
987     switch ( format )
988     {
989     case SAMPLE_FORMAT_DSP_ADPCM:
990         byte = ( samples / 14 ) * 8;
991         frac = ( samples % 14 );
992         if ( frac != 0 )
993         {
994             byte += ( ( frac + 1 ) >> 1 ) + 1;
995         }
996         break;
997 
998     case SAMPLE_FORMAT_PCM_S8:
999         byte = samples;
1000         break;
1001 
1002     /*
1003     case SAMPLE_FORMAT_PCM_S16_BE:
1004     case SAMPLE_FORMAT_PCM_S16_LE:
1005     */
1006     case SAMPLE_FORMAT_PCM_S16:
1007         byte = ( samples << 1 );
1008         break;
1009 
1010     default:
1011         NW_ASSERTMSG( false, "Invalid format\n" );
1012         break;
1013     }
1014 
1015     return byte;
1016 }
1017 
1018 } // namespace nw::snd::internal
1019 } // namespace nw::snd
1020 } // namespace nw
1021 
1022