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