AkaoParser.cpp 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
  1. #include "AkaoParser.h"
  2. #include "engine/SoundManager.h"
  3. #include "common/File.h"
  4. #include "common/Logger.h"
  5. #include "common/TypeDefine.h"
  6. const u16 akao_pause_table[ 11 ] =
  7. {
  8. 0xc0c0, 0x6060, 0x3030, 0x1818, 0x0c0c, 0x0606, 0x0303, 0x2020, 0x1010, 0x0808, 0x0404
  9. };
  10. s16 akao_left_volume_table[ 256 ] =
  11. {
  12. 32640, 32384, 32128, 31872, 31616, 31360, 31104, 30848, 30592, 30336, 30080, 29824, 29568, 29312, 29056, 28800,
  13. 28544, 28288, 28032, 27776, 27520, 27264, 27008, 26752, 26496, 26240, 25984, 25728, 25472, 25216, 24960, 24704,
  14. 24448, 24192, 23936, 23680, 23424, 23168, 22912, 22656, 22400, 22144, 21888, 21632, 21376, 21120, 20864, 20608,
  15. 20352, 20096, 19840, 19584, 19328, 19072, 18816, 18560, 18304, 18048, 17792, 17536, 17280, 17024, 16768, 16512,
  16. 16256, 16000, 15744, 15488, 15232, 14976, 14720, 14464, 14208, 13952, 13696, 13440, 13184, 12928, 12672, 12416,
  17. 12160, 11904, 11648, 11392, 11136, 10880, 10624, 10368, 10112, 9856, 9600, 9344, 9088, 8832, 8576, 8320,
  18. 8064, 7808, 7552, 7296, 7040, 6784, 6528, 6272, 6016, 5760, 5504, 5248, 4992, 4736, 4480, 4224,
  19. 3968, 3712, 3456, 3200, 2944, 2688, 2432, 2176, 1920, 1664, 1408, 1152, 896, 640, 384, 128,
  20. 0, -1, -4, -9, -16, -25, -36, -49, -64, -81, -100, -121, -144, -169, -196, -225,
  21. -256, -289, -324, -361, -400, -441, -484, -529, -576, -625, -676, -729, -784, -841, -900, -961,
  22. -1024, -1089, -1156, -1225, -1296, -1369, -1444, -1521, -1600, -1681, -1764, -1849, -1936, -2025, -2116, -2209,
  23. -2304, -2401, -2500, -2601, -2704, -2809, -2916, -3025, -3136, -3249, -3364, -3481, -3600, -3721, -3844, -3969,
  24. 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241,
  25. 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025,
  26. 9216, 9409, 9604, 9801, 10000, 10201, 10404, 10609, 10816, 11025, 11236, 11449, 11664, 11881, 12100, 12321,
  27. 12544, 12769, 12996, 13225, 13456, 13689, 13924, 14161, 14400, 14641, 14884, 15129, 15376, 15625, 15876, 16129
  28. };
  29. s16 akao_right_volume_table[ 256 ] =
  30. {
  31. 128, 384, 640, 896, 1152, 1408, 1664, 1920, 2176, 2432, 2688, 2944, 3200, 3456, 3712, 3968,
  32. 4224, 4480, 4736, 4992, 5248, 5504, 5760, 6016, 6272, 6528, 6784, 7040, 7296, 7552, 7808, 8064,
  33. 8320, 8576, 8832, 9088, 9344, 9600, 9856, 10112, 10368, 10624, 10880, 11136, 11392, 11648, 11904, 12160,
  34. 12416, 12672, 12928, 13184, 13440, 13696, 13952, 14208, 14464, 14720, 14976, 15232, 15488, 15744, 16000, 16256,
  35. 16512, 16768, 17024, 17280, 17536, 17792, 18048, 18304, 18560, 18816, 19072, 19328, 19584, 19840, 20096, 20352,
  36. 20608, 20864, 21120, 21376, 21632, 21888, 22144, 22400, 22656, 22912, 23168, 23424, 23680, 23936, 24192, 24448,
  37. 24704, 24960, 25216, 25472, 25728, 25984, 26240, 26496, 26752, 27008, 27264, 27520, 27776, 28032, 28288, 28544,
  38. 28800, 29056, 29312, 29568, 29824, 30080, 30336, 30592, 30848, 31104, 31360, 31616, 31872, 32128, 32384, 32640,
  39. 16129, 15876, 15625, 15376, 15129, 14884, 14641, 14400, 14161, 13924, 13689, 13456, 13225, 12996, 12769, 12544,
  40. 12321, 12100, 11881, 11664, 11449, 11236, 11025, 10816, 10609, 10404, 10201, 10000, 9801, 9604, 9409, 9216,
  41. 9025, 8836, 8649, 8464, 8281, 8100, 7921, 7744, 7569, 7396, 7225, 7056, 6889, 6724, 6561, 6400,
  42. 6241, 6084, 5929, 5776, 5625, 5476, 5329, 5184, 5084, 4900, 4761, 4624, 4489, 4356, 4225, 4096,
  43. -3969, -3844, -3721, -3600, -3481, -3364, -3249, -3136, -3025, -2916, -2809, -2704, -2601, -2500, -2401, -2304,
  44. -2209, -2116, -2025, -1936, -1849, -1764, -1981, -1600, -1521, -1444, -1369, -1296, -1225, -1156, -1089, -1024,
  45. -961, -900, -841, -784, -729, -676, -625, -576, -529, -484, -441, -400, -361, -324, -289, -256,
  46. -225, -196, -169, -144, -121, -100, -81, -64, -49, -36, -25, -16, -9, -4, -1, 0
  47. };
  48. s16 akao_wave_table[ 708 ] =
  49. {
  50. 8191, -8191, 16383, -16383, 24575, -24575, 32767, -32767, 0, 0, -2, 0, 32767, -32767, 0, 0,
  51. -2, 0, 8191, 0, 16383, 0, 24575, 0, 32767, 0, 0, -2, 32767, 0, 32767, 0,
  52. 0, -2, -8191, 0, -16383, 0, -24575, 0,-32767, 0, 0, -2, -32767, 0, -32767, 0,
  53. 0, -2, 0, 1280, 2530, 4813, 5790, 6625, 7297, 7789, 8090, 8191, 8092, 7793, 7302, 6632,
  54. 5799, 4823, 3728, 2542, 1293, 0, -1268, -2518, -3706, -4803, -5782, -6618, -7292, -7786, -8089, -8192,
  55. -8095, -7798, -7309, -6641, -5809, -4835, -3741, -2556, -1307, 0, 2561, 5060, 9626, 11580, 13250, 14594,
  56. 15578, 16180, 16383, 16184, 15586, 14605, 13265, 11599, 9647, 7457, 5085, 2587, 0, -2536, -5036, -7412,
  57. -9605, -11563, -13235, -14583, -15571, -16177, -16384, -16189,-15595, -14618, -13281, -11618, -9669, -7482, -5111, -2614,
  58. 0, 3842, 7590, 14439, 17370, 19875, 21891, 23367, 24270, 24575, 24276, 23379, 21908, 19898, 17398, 14470,
  59. 11186, 7627, 3881, 0, -3804, -7554, -11118, -14408,-17344, -19853, -21874, -23357, -24265, -24576, -24284, -23393,
  60. -21927, -19922, -17427, -14503, -11223, -7666, -3921, 0, 5123, 10120, 19252, 23161, 26500, 29188, 31157, 32360,
  61. 32767, 32369, 31173, 29211, 26531, 23198, 19294, 14915, 10170, 5175, 0, -5072, -10072, -14823, -19210, -23125,
  62. -26470, -29165, -31142, -32353, -32768, -32378, -31190, -29236,-26562, -23235, -19337, -14963, -10221, -5227, 0, 0,
  63. -39, 0, 0, 5123, 10120, 19252, 23161, 26500, 29188, 31157, 32360, 32767, 32369, 31173, 29211, 26531,
  64. 23198, 19294, 14915, 10170, 5175, 0, -5072, -10072,-14823, -19210, -23125, -26470, -29165, -31142, -32353, -32768,
  65. -32378, -31190, -29236, -26562, -23235, -19337, -14963, -10221, -5227, 0, 0, -39, 0, 2530, 4813, 6625,
  66. 7789, 8191, 7793, 6632, 4823, 2542, 13, -2518, -4803, -6618, -7786, -8192, -7798, -6641, -4835, -2556,
  67. 0, 5060, 9626, 13250, 15578, 16383, 15586, 13265, 9647, 5085, 26, -5036, -9605, -13235, -15571, -16384,
  68. -15595, -13281, -9669, -5111, 0, 7590, 14439, 19875, 23367, 24575, 23379, 19898, 14470, 7627, 39, -7554,
  69. -14408, -19853, -23357, -24576, -23393, -19922, -14503, -7666, 0, 10120, 19252, 26500, 31157, 32767, 31173, 26531,
  70. 19294, 10170, 52, -10072, -19210, -26470, -31142, -32768,-31190, -26562, -19337, -10221, 0, 0, -20, 0,
  71. 0, 10120, 19252, 26500, 31157, 32767, 31173, 26531, 19294, 10170, 52, -10072, -19210, -26470, -31142, -32768,
  72. -31190, -26562, -19337, -10221, 0, 0, -20, 0, 0, 2047, 4095, 6143, 8191, 6143, 4095, 2047,
  73. 0, -2047, -4095, -6143, -8191, -6143, -4095, -2047, 0, 4095, 8191, 12287, 16383, 12287, 8191, 4095,
  74. 0, -4095, -8191, -12287, -16383, -12287, -8191, -4095, 0, 6143, 12287, 18431, 24575, 18431, 12287, 6143,
  75. 0, -6143, -12287, -18431, -24575, -18431, -12287, -6143, 0, 8191, 16383, 24575, 32767, 24575, 16383, 8191,
  76. 0, -8191, -16383, -24575, -32767, -24575, -16383, -8191, 0, 0, -16, 0, 0, 8191, 16383, 24575,
  77. 32767, 24575, 16383, 8191, 0, -8191, -16383, -24575,-32767, -24575, -16383, -8191, 0, 0, -16, 0,
  78. 0, 12797, 32005, -2563, -4882, 31036, 30160, 2044, -3055, -15627, 26127, 13070, 16362, -16671, -29678, 6177,
  79. -20485, 18944, -11289, -2827, -7881, -6189, 21005, 4355,-20769, 19192, 1862, 28916, -28991, -26855, 13586, -2560,
  80. 6912, -19223, 15134, -20971, -25400, 26105, -15581, 29176, 11505, -23036, -27908, -14066, -20471, 4325, 2052, -32767,
  81. 4858, 4376, -6391, 18424, -27175, -8932, 6921, 3060, 31740, 8447, -27644, 32252, -29963, -18665, 29945, 11004,
  82. -8954, -10253, -2819, 1544, -3560, 27103, -17401, 19191,-30229, -17625, 4361, 32751, 13845, -4915, 30241, -26603,
  83. 22223, -11258, 13090, -8218, -20726, -17931, -12792, 23813,-16402, -4070, 8424, -24810, -29454, -15641, -11730, -14847,
  84. -17968, -32500, 17187, 10461, -26889, 23612, -24610, -20760,-18917, 16115, 5128, -9495, 11275, -20173, -22303, 1498,
  85. 2324, 20002, -24, -30735, 8688, -29403, 32252, 7408, 24081, 15848, -14582, -28905, -16, 27149, -29, 4851,
  86. 1055, 30732, -15121, 23298, 15618, 754, 5401, -9515,-17143, -28135, -2813, 25309, 14342, 3878, -22277, -7938,
  87. -2333, 3586, 528, 17414, -27436, -12022, -22458, 4337, 6860, -16899, 6704, -24341, 24554, -16624, -17425, -8421,
  88. -15860, 10976, 16114, -20953, 20481, -1571, 13841, -21222, 2015, 27909, 6669, -18725, 27947, 13831, -1076, 16904,
  89. 3873, 14070, -14330, 1539, -553, 30743, 1541, -20725,-27140, 4332, -22770, -21005, 26127, -16910, -8456, -7135,
  90. -19993, -787, 23324, -24311, -13070, -2573, -25861, -19433,-27928, 32520, 19450, -30211, 15388, -785, -3365, 18973,
  91. 26397, -10497, 26074, -3588, 28170, 2572, 4600, 18946, 23548, -5370, -23059, 12518, -32751, -11724, 2296, 17372,
  92. -2551, -22798, -26099, 28678, -2582, -25348, -32482, -21018, -6642, -27145, -19708, -25345, -4118, -2791, -1536, 15094,
  93. -14379, 10018, -17608, 17361, 30701, 18696, -12798, -21745, 15851, -9462, 25601, 16377, 30450, -27895, -11761, 29925,
  94. 0, 0, -256, 0
  95. };
  96. u16 akao_wave_table_key_nodes[ 16 ] =
  97. {
  98. 0, 12, 18, 28, 34, 44, 50, 210, 360, 428, 252, 336, 448, 428, 360, 428
  99. };
  100. u8 opcode_size[ 96 ] =
  101. {
  102. 00, 02, 02, 02, 03, 02, 01, 01, 02, 03, 02, 03, 02, 02, 02, 02, // a0-af
  103. 03, 02, 02, 01, 04, 02, 01, 02, 04, 02, 01, 02, 03, 02, 01, 02, // b0-bf
  104. 02, 02, 01, 01, 01, 01, 01, 01, 01, 00, 00, 00, 01, 00, 02, 02, // c0-cf
  105. 01, 00, 02, 02, 01, 01, 01, 01, 02, 02, 02, 00, 02, 03, 03, 03, // d0-df
  106. 00, 00, 00, 00, 00, 00, 00, 00, 03, 04, 03, 04, 03, 01, 00, 00, // e0-ef
  107. 00, 00, 02, 01, 03, 01, 02, 03, 02, 01, 00, 00, 00, 03, 03, 00, // f0-ff
  108. };
  109. AkaoParser *AKAOPARSER = NULL;
  110. AkaoParser::AkaoParser():
  111. m_Music( NULL )
  112. {
  113. memset( ( u8* )m_MusicChannelData, 0x00, sizeof( ChannelData ) * 24 );
  114. }
  115. AkaoParser::~AkaoParser()
  116. {
  117. }
  118. void
  119. AkaoParser::Update()
  120. {
  121. UpdateDynamicSpuParameters();
  122. if ( m_MusicChannelConfig.active_channel_mask != 0 )
  123. {
  124. //V1 = w[80062fea];
  125. u32 tempo = m_MusicChannelConfig.tempo >> 0x10;
  126. /*
  127. if (V1 != 0)
  128. {
  129. if (V1 < 80)
  130. {
  131. tempo += (tempo * V1) >> 0x7;
  132. }
  133. else
  134. {
  135. tempo = (tempo * V1) >> 0x8;
  136. }
  137. }
  138. */
  139. m_MusicChannelConfig.tempo_counter += tempo;
  140. if ( ( m_MusicChannelConfig.tempo_counter & 0xffff0000 ) /*|| ( w[80062ff8] & 00000004 )*/ )
  141. {
  142. m_MusicChannelConfig.tempo_counter &= 0x0000ffff;
  143. //[80062f04] = w(0);
  144. u32 channel_mask = m_MusicChannelConfig.active_channel_mask;
  145. int channel_id = 0;
  146. for ( u32 bit = 1; channel_mask != 0; bit <<= 1, channel_id += 1 )
  147. {
  148. if ( channel_mask & bit )
  149. {
  150. channel_mask ^= bit;
  151. m_MusicChannelData[ channel_id ].pause -= 0x0101;
  152. if ( ( m_MusicChannelData[ channel_id ].pause & 0x00ff ) == 0 )
  153. {
  154. UpdateSequence( m_MusicChannelData, channel_id, m_MusicChannelConfig );
  155. }
  156. else if ( ( m_MusicChannelData[ channel_id ].pause & 0xff00 ) == 0 )
  157. {
  158. m_MusicChannelData[ channel_id ].pause |= 0x100;
  159. m_MusicChannelConfig.unknown_0c &= ~bit;
  160. m_MusicChannelConfig.unknown_10 |= bit;
  161. }
  162. UpdateCounters( m_MusicChannelData, channel_id, m_MusicChannelConfig );
  163. }
  164. }
  165. if ( m_MusicChannelConfig.tempo_increment_counter != 0 )
  166. {
  167. m_MusicChannelConfig.tempo_increment_counter -= 1;
  168. m_MusicChannelConfig.tempo += m_MusicChannelConfig.tempo_increment;
  169. }
  170. if( m_MusicChannelConfig.reverb_depth_increment_counter != 0 )
  171. {
  172. m_MusicChannelConfig.reverb_depth_increment_counter -= 1;
  173. m_MusicChannelConfig.reverb_depth += m_MusicChannelConfig.tempo_increment_counter;
  174. m_MusicChannelConfig.spu_update_flags |= SPU_REVERB;
  175. }
  176. if( m_MusicChannelConfig.lower_timer_top != 0 )
  177. {
  178. m_MusicChannelConfig.lower_timer += 1;
  179. if( m_MusicChannelConfig.lower_timer == m_MusicChannelConfig.lower_timer_top )
  180. {
  181. m_MusicChannelConfig.lower_timer = 0;
  182. m_MusicChannelConfig.upper_timer += 1;
  183. if( m_MusicChannelConfig.upper_timer == m_MusicChannelConfig.upper_timer_top )
  184. {
  185. m_MusicChannelConfig.upper_timer = 0;
  186. m_MusicChannelConfig.top_timer += 1;
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. void
  194. AkaoParser::LoadInstruments( const Ogre::String& all_file, const Ogre::String& dat_file )
  195. {
  196. // load instruments adpsm
  197. {
  198. File* file = new File( all_file );
  199. u32 address = file->GetU32LE( 0x0 ) / 8;
  200. u32 datasize = file->GetU32LE( 0x4 );
  201. u8* buffer = new u8[ datasize ];
  202. file->GetFileBuffer( buffer, 0x10, datasize );
  203. if ( !SOUNDMAN->PsxWriteDMA( address, buffer, datasize ) )
  204. {
  205. LOGGER->Log( "[AkaoParser::LoadVoiceData] error: failed to DMA write sample data.\n" );
  206. }
  207. delete[] buffer;
  208. delete file;
  209. }
  210. {
  211. File* file = new File( dat_file );
  212. int file_size = file->GetFileSize();
  213. // load index records
  214. InstrumentData data;
  215. for ( int i = 0; i < file_size; i += 0x40 )
  216. {
  217. data.start_offset = file->GetU32LE( i + 0x00 );
  218. data.loop_offset = file->GetU32LE( i + 0x04 );
  219. data.attack_rate = file->GetU8( i + 0x08 );
  220. data.decay_rate = file->GetU8( i + 0x09 );
  221. data.sustain_level = file->GetU8( i + 0x0a );
  222. data.sustain_rate = file->GetU8( i + 0x0b );
  223. data.release_rate = file->GetU8( i + 0x0c );
  224. data.attack_mode = file->GetU8( i + 0x0d );
  225. data.sustain_mode = file->GetU8( i + 0x0e );
  226. data.release_mode = file->GetU8( i + 0x0f );
  227. data.pitch[ 0 ] = file->GetU32LE( i + 0x10 );
  228. data.pitch[ 1 ] = file->GetU32LE( i + 0x14 );
  229. data.pitch[ 2 ] = file->GetU32LE( i + 0x18 );
  230. data.pitch[ 3 ] = file->GetU32LE( i + 0x1c );
  231. data.pitch[ 4 ] = file->GetU32LE( i + 0x20 );
  232. data.pitch[ 5 ] = file->GetU32LE( i + 0x24 );
  233. data.pitch[ 6 ] = file->GetU32LE( i + 0x28 );
  234. data.pitch[ 7 ] = file->GetU32LE( i + 0x2c );
  235. data.pitch[ 8 ] = file->GetU32LE( i + 0x30 );
  236. data.pitch[ 9 ] = file->GetU32LE( i + 0x34 );
  237. data.pitch[ 10 ] = file->GetU32LE( i + 0x38 );
  238. data.pitch[ 11 ] = file->GetU32LE( i + 0x3c );
  239. m_InstrumentData.push_back( data );
  240. }
  241. delete file;
  242. }
  243. }
  244. void
  245. AkaoParser::UnloadInstruments()
  246. {
  247. m_InstrumentData.clear();
  248. }
  249. void
  250. AkaoParser::PlayMusic( const Ogre::String& file )
  251. {
  252. if ( m_Music != NULL )
  253. {
  254. delete m_Music;
  255. }
  256. m_Music = new File( file );
  257. if ( m_Music->GetU8( 0 ) == 0x41 && m_Music->GetU8( 1 ) == 0x4b && m_Music->GetU8( 2 ) == 0x41 && m_Music->GetU8( 3 ) == 0x4f) // AKAO
  258. {
  259. int music_id = m_Music->GetU16LE( 4 );
  260. int length = m_Music->GetU16LE( 6 );
  261. int reverb_mode = m_Music->GetU16LE( 8 );
  262. //A0 = reverb_mode;
  263. //func29af0;
  264. //[V0 + 0] = w(w[8009a000]);
  265. //[V0 + 4] = w(akao_offset + 16);
  266. //[V0 + 8] = w(frame_length);
  267. //[V0 + c] = w(frame_id);
  268. //[V0 + 10] = w(w[8009a008]);
  269. /*
  270. if (m_MusicChannelConfig.active_channel_mask != 0)
  271. {
  272. A2 = 80096608;
  273. V0 = w[8009a128];
  274. V1 = w[8009a12c];
  275. [8009a12c] = w(0);
  276. [8009a128] = w(0);
  277. [8009a110] = w(0);
  278. m_MusicChannelConfig.for_play_channel_mask = 0;
  279. A0 = m_MusicChannelConfig.active_channel_mask | V0 | V1;
  280. m_MusicChannelConfig.active_channel_mask = A0;
  281. [8009a114] = w(A0 | w[8009a114]);
  282. A1 = 1;
  283. loop29f18: ; 80029F18
  284. if (A0 XOR A1)
  285. {
  286. A0 = A0 XOR A1;
  287. [A2 + 56] = h(204);
  288. [A2 + 0] = w(80049c40);
  289. }
  290. A1 = A1 << 1;
  291. A2 = A2 + 108;
  292. 80029F34 bne a0, zero, loop29f18 [$80029f18]
  293. }
  294. */
  295. //[8009a114] = w(w[8009a114] | 00ffffff);
  296. u16 offset_to_akao = 0;
  297. m_MusicChannelConfig.active_channel_mask = m_Music->GetU32LE( 0x10 ) & 0x00ffffff;
  298. u32 channel_mask = m_MusicChannelConfig.active_channel_mask;
  299. int channel_id = 0;
  300. for ( u32 bit = 1; channel_mask != 0; bit <<= 1, channel_id += 1 )
  301. {
  302. if ( channel_mask & bit )
  303. {
  304. channel_mask ^= bit;
  305. m_MusicChannelData[ channel_id ].akao_sequence_pointer = 20 + offset_to_akao + 2 + m_Music->GetU16LE( 20 + offset_to_akao );
  306. offset_to_akao += 2;
  307. //LOGGER->Log( "Init channel " + ToIntString( channel_id ) + " with offset to AKAO " + ToHexString( m_MusicChannelData[ channel_id ].akao_sequence_pointer, 4, '0' ) + "\n" );
  308. InitChannelInstrument( m_MusicChannelData, channel_id, 0x14 );
  309. //[S3 + 14] = w(80083580);
  310. m_MusicChannelData[ channel_id ].volume_multiplier = 0x7f;
  311. m_MusicChannelData[ channel_id ].pitch_addition = 0;
  312. m_MusicChannelData[ channel_id ].mirror_update_flags = 0;
  313. m_MusicChannelData[ channel_id ].volume_level = 0x3fff0000;
  314. m_MusicChannelData[ channel_id ].pause = 0x103;
  315. m_MusicChannelData[ channel_id ].volume_level_change_ticks = 0;
  316. //[S3 + 5e] = h(0);
  317. m_MusicChannelData[ channel_id ].volume_index = 0x4000;
  318. m_MusicChannelData[ channel_id ].unknown_62 = 0;
  319. m_MusicChannelData[ channel_id ].unknown_64 = 0;
  320. m_MusicChannelData[ channel_id ].unknown_6c = 0;
  321. m_MusicChannelData[ channel_id ].unknown_6e = 0;
  322. m_MusicChannelData[ channel_id ].wave1_modifier = 0;
  323. //[S3 + 80] = h(0);
  324. //[S3 + 90] = h(0);
  325. //[S3 + 92] = h(0);
  326. //[S3 + 9e] = h(0);
  327. //[S3 + a0] = h(0);
  328. //[S3 + a4] = h(0);
  329. //[S3 + a6] = h(0);
  330. m_MusicChannelData[ channel_id ].loop_index = 0;
  331. m_MusicChannelData[ channel_id ].saved_pause = 0;
  332. m_MusicChannelData[ channel_id ].pause_multiplier = 0;
  333. //[S3 + c6] = h(4000);
  334. m_MusicChannelData[ channel_id ].pitch_selector = 0;
  335. m_MusicChannelData[ channel_id ].pitch_modifier = 0;
  336. m_MusicChannelData[ channel_id ].unknown_d2 = 0;
  337. //[S3 + da] = h(0);
  338. }
  339. }
  340. m_MusicChannelConfig.for_play_channel_mask = 0;
  341. /*
  342. [8009a110] = w(0);
  343. */
  344. m_MusicChannelConfig.tempo = 0xffff0000;
  345. m_MusicChannelConfig.tempo_counter = 1; // this way we update sequence on next update
  346. /*
  347. [8009a128] = w(0);
  348. [8009a12c] = w(0);
  349. [8009a130] = w(0);
  350. [8009a134] = w(0);
  351. [8009a138] = w(0);
  352. */
  353. m_MusicChannelConfig.spu_update_flags = 0;
  354. m_MusicChannelConfig.reverb_depth = 0;
  355. //[8009a148] = w(0);
  356. m_MusicChannelConfig.tempo_increment_counter = 0;
  357. //[8009a150] = h(0);
  358. //[8009a152] = h(0);
  359. m_MusicChannelConfig.reverb_depth_increment_counter = 0;
  360. //[8009a158] = h(0);
  361. m_MusicChannelConfig.upper_timer_top = 0;
  362. m_MusicChannelConfig.upper_timer = 0;
  363. m_MusicChannelConfig.lower_timer_top = 0;
  364. m_MusicChannelConfig.lower_timer = 0;
  365. m_MusicChannelConfig.top_timer = 0;
  366. /*
  367. [8009a15e] = h(0);
  368. [8009a160] = h(0);
  369. [8009a162] = h(0);
  370. if (w[80062ff8] & 1)
  371. {
  372. [8009a108] = w(0);
  373. [8009a118] = w(w[8009a108]);
  374. }
  375. func2ff4c
  376. func30038
  377. func30148
  378. */
  379. }
  380. }
  381. void
  382. AkaoParser::UpdateDynamicSpuParameters()
  383. {
  384. u32 for_play_channel_mask = 0;
  385. if( m_MusicChannelConfig.spu_update_flags & SPU_REVERB )
  386. {
  387. s16 reverb_depth = m_MusicChannelConfig.reverb_depth >> 0x10;
  388. /* looks like update of total reverb volume if this is ever used
  389. V1 = hu[80062fb8];
  390. if (V1 < 80)
  391. {
  392. reverb_depth = reverb_depth + ((reverb_depth * V1) >> 7);
  393. }
  394. else
  395. {
  396. reverb_depth = (reverb_depth * V1) >> 8;
  397. }
  398. */
  399. u8 pan = 0x40 /*hu[80062f70]*/;
  400. s16 left = reverb_depth;
  401. s16 right = reverb_depth;
  402. if( pan < 0x40 )
  403. {
  404. right = reverb_depth - ( ( reverb_depth * ( pan ^ 0x3f ) ) >> 6 );
  405. }
  406. else
  407. {
  408. left = reverb_depth - ( ( reverb_depth * ( pan & 0x3f ) ) >> 6 );
  409. }
  410. SOUNDMAN->PsxSetReverbDepth( left, right );
  411. m_MusicChannelConfig.spu_update_flags ^= SPU_REVERB;
  412. }
  413. if ( m_MusicChannelConfig.active_channel_mask != 0 )
  414. {
  415. for_play_channel_mask |= m_MusicChannelConfig.for_play_channel_mask;
  416. u32 channel_mask = m_MusicChannelConfig.active_channel_mask;
  417. int channel_id = 0;
  418. for ( u32 bit = 1; channel_mask != 0; bit <<= 1, channel_id += 1 )
  419. {
  420. if ( channel_mask & bit )
  421. {
  422. channel_mask ^= bit;
  423. UpdatePitchAndVolume( m_MusicChannelData, channel_id );
  424. if ( m_MusicChannelData[ channel_id ].spu_update_flags )
  425. {
  426. UpdateSpu( m_MusicChannelData, channel_id );
  427. }
  428. }
  429. }
  430. m_MusicChannelConfig.for_play_channel_mask = 0;
  431. }
  432. if ( for_play_channel_mask != 0 )
  433. {
  434. UpdatePlayChannel( true, for_play_channel_mask );
  435. }
  436. }
  437. void
  438. AkaoParser::UpdatePitchAndVolume( ChannelData* channel_data, int channel_id )
  439. {
  440. int temp = ( ( channel_data[ channel_id ].volume_level >> 16) * channel_data[ channel_id ].volume_multiplier ) >> 7;
  441. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME ) )
  442. {
  443. //temp = ( ( temp + h[T0 + d8] ) * ( hu[80062f5e] & 0x7f ) ) >> 7;
  444. temp = ( temp * 0x7f ) >> 7;
  445. /*
  446. if (hu[8009c5a8] != 0)
  447. {
  448. temp = (temp * h[8009c5a2 + channel_id * c]) >> 7;
  449. }
  450. */
  451. int volume_index = ( /*h[T0 + da] + */channel_data[ channel_id ].volume_index >> 8) & 0xff;
  452. /*
  453. V1 = w[8009a104];
  454. if (V1 == 1) // stereo
  455. */
  456. {
  457. channel_data[ channel_id ].left_volume = ( temp * akao_left_volume_table[ volume_index ] ) >> 0xf;
  458. channel_data[ channel_id ].right_volume = ( temp * akao_right_volume_table[ volume_index ] ) >> 0xf;
  459. }
  460. /*
  461. else if (V1 == 4)
  462. {
  463. channel_data[ channel_id ].left_volume = (temp * akao_left_volume_table[ volume_index ] ) >> 0xf;
  464. channel_data[ channel_id ].right_volume = (temp * akao_right_volume_table[ volume_index ] ) >> 0xf;
  465. if (A1 & 00aaaaaa == 0)
  466. {
  467. channel_data[ channel_id ].left_volume = 0 NOR channel_data[ channel_id ].left_volume;
  468. }
  469. else
  470. {
  471. channel_data[ channel_id ].right_volume = 0 NOR channel_data[ channel_id ].right_volume;
  472. }
  473. }
  474. else
  475. {
  476. channel_data[ channel_id ].left_volume = ( temp * h[80049cc4]) >> 0xf;
  477. channel_data[ channel_id ].right_volume = ( temp * h[80049cc4]) >> 0xf;
  478. }
  479. */
  480. }
  481. u16 new_pitch = 0;
  482. /*
  483. if (w[T0 + 38] & 00000010)
  484. {
  485. V1 = h[T0 + d6] + h[T0 + 36] + w[T0 - 10]; // uses pitch from previous channel
  486. }
  487. else*/
  488. if ( channel_data[ channel_id ].spu_update_flags & SPU_PITCH )
  489. {
  490. new_pitch = channel_data[ channel_id ].pitch_base + ( channel_data[ channel_id ].pitch_addition >> 0x10 ) + channel_data[ channel_id ].pitch_addition2;
  491. }
  492. if (/*(w[T0 + 38] & 00000010) ||*/ ( channel_data[ channel_id ].spu_update_flags & SPU_PITCH ) )
  493. {
  494. channel_data[ channel_id ].spu_update_flags |= SPU_PITCH;
  495. channel_data[ channel_id ].pitch = new_pitch & 0x3fff;
  496. }
  497. }
  498. void
  499. AkaoParser::UpdateSpu( ChannelData* channel_data, int channel_id )
  500. {
  501. //S1 = A0;
  502. //S0 = A1;
  503. if ( channel_data[ channel_id ].spu_update_flags & SPU_PITCH )
  504. {
  505. /*
  506. A0 = S1;
  507. A1 = hu[S0 + 1c]; // f8
  508. func395c8;
  509. */
  510. //LOGGER->Log( "UpdateSpu::SPU_PITCH channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].pitch ) + ".\n" );
  511. SOUNDMAN->SetVoicePitch( channel_id, channel_data[ channel_id ].pitch );
  512. channel_data[ channel_id ].spu_update_flags &= ~SPU_PITCH;
  513. }
  514. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME ) )
  515. {
  516. /*
  517. A0 = S1;
  518. A1 = h[S0 + 28]; // 104
  519. A2 = h[S0 + 2a]; // 106
  520. func393c8;
  521. */
  522. //LOGGER->Log( "UpdateSpu::SPU_LEFT_VOLUME|SPU_RIGHT_VOLUME channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].left_volume ) + " " + Ogre::StringConverter::toString( channel_data[ channel_id ].right_volume ) + ".\n" );
  523. SOUNDMAN->SetVoiceVolume( channel_id, channel_data[ channel_id ].left_volume, channel_data[ channel_id ].right_volume );
  524. channel_data[ channel_id ].spu_update_flags &= ~( SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME );
  525. }
  526. if ( channel_data[ channel_id ].spu_update_flags & SPU_START_OFFSET )
  527. {
  528. /*
  529. A0 = S1;
  530. A1 = w[S0 + 8];
  531. func39644; // we set start address here
  532. */
  533. //LOGGER->Log( "UpdateSpu::SPU_START_OFFSET channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].start_offset ) + ".\n" );
  534. SOUNDMAN->SetVoiceStartAddress( channel_id, channel_data[ channel_id ].start_offset );
  535. channel_data[ channel_id ].spu_update_flags &= ~SPU_START_OFFSET;
  536. }
  537. if ( channel_data[ channel_id ].spu_update_flags & SPU_LOOP_OFFSET )
  538. {
  539. /*
  540. A0 = S1;
  541. A1 = w[S0 + c];
  542. func396c0;
  543. */
  544. //LOGGER->Log( "UpdateSpu::SPU_LOOP_OFFSET channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].loop_offset ) + ".\n" );
  545. SOUNDMAN->SetVoiceLoopAddress( channel_id, channel_data[ channel_id ].loop_offset );
  546. channel_data[ channel_id ].spu_update_flags &= ~SPU_LOOP_OFFSET;
  547. }
  548. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_SUSTAIN_RATE | SPU_SUSTAIN_MODE ) )
  549. {
  550. /*
  551. A0 = S1;
  552. A1 = h[S0 + 24]; // 100
  553. A2 = h[S0 + 14]; // f0
  554. func398ec;
  555. */
  556. //LOGGER->Log( "UpdateSpu::SPU_SUSTAIN_RATE|SPU_SUSTAIN_MODE channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].sustain_rate ) + " " + Ogre::StringConverter::toString( channel_data[ channel_id ].sustain_mode ) + ".\n" );
  557. SOUNDMAN->SetVoiceSustainRate( channel_id, channel_data[ channel_id ].sustain_rate, (SoundManager::SpuRateMode)channel_data[ channel_id ].sustain_mode );
  558. channel_data[ channel_id ].spu_update_flags &= ~( SPU_SUSTAIN_RATE | SPU_SUSTAIN_MODE );
  559. }
  560. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_ATTACK_RATE | SPU_ATTACK_MODE ) )
  561. {
  562. /*
  563. A0 = S1;
  564. A1 = h[S0 + 1e]; // fa
  565. A2 = h[S0 + 10]; // ec
  566. func39850;
  567. */
  568. //LOGGER->Log( "UpdateSpu::SPU_ATTACK_RATE|SPU_ATTACK_MODE channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].attack_rate ) + " " + Ogre::StringConverter::toString( channel_data[ channel_id ].attack_mode ) + ".\n" );
  569. SOUNDMAN->SetVoiceAttackRate( channel_id, channel_data[ channel_id ].attack_rate, ( SoundManager::SpuRateMode )channel_data[ channel_id ].attack_mode );
  570. channel_data[ channel_id ].spu_update_flags &= ~( SPU_ATTACK_RATE | SPU_ATTACK_MODE );
  571. }
  572. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_RELEASE_RATE | SPU_RELEASE_MODE ) )
  573. {
  574. /*
  575. A0 = S1;
  576. A1 = h[S0 + 26]; // 102 // release rate
  577. A2 = h[S0 + 18]; // f4 // release mode
  578. func399d0;
  579. */
  580. //LOGGER->Log( "UpdateSpu::SPU_RELEASE_RATE|SPU_RELEASE_MODE channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].release_rate ) + " " + Ogre::StringConverter::toString( channel_data[ channel_id ].release_mode ) + ".\n" );
  581. SOUNDMAN->SetVoiceReleaseRate( channel_id, channel_data[ channel_id ].release_rate, (SoundManager::SpuRateMode)channel_data[ channel_id ].release_mode );
  582. channel_data[ channel_id ].spu_update_flags &= ~( SPU_RELEASE_RATE | SPU_RELEASE_MODE );
  583. }
  584. if ( channel_data[ channel_id ].spu_update_flags & ( SPU_DECAY_RATE | SPU_SUSTAIN_LEVEL ) )
  585. {
  586. /*
  587. A0 = S1;
  588. A1 = h[S0 + 20]; // fc // decay rate.
  589. func3973c;
  590. A0 = S1;
  591. A1 = h[S0 + 22]; // fe // sustain level.
  592. func397c8;
  593. */
  594. //LOGGER->Log( "UpdateSpu::SPU_DECAY_RATE|SPU_SUSTAIN_LEVEL channel " + Ogre::StringConverter::toString( channel_id ) + " value:" + Ogre::StringConverter::toString( channel_data[ channel_id ].decay_rate ) + " " + Ogre::StringConverter::toString( channel_data[ channel_id ].sustain_level ) + ".\n" );
  595. SOUNDMAN->SetVoiceDecayRate( channel_id, channel_data[ channel_id ].decay_rate );
  596. SOUNDMAN->SetVoiceSustainLevel( channel_id, channel_data[ channel_id ].sustain_level );
  597. channel_data[ channel_id ].spu_update_flags &= ~( SPU_DECAY_RATE | SPU_SUSTAIN_LEVEL );
  598. }
  599. }
  600. void
  601. AkaoParser::UpdatePlayChannel( bool on, u32 channel_mask )
  602. {
  603. int channel_id = 0;
  604. for ( u32 bit = 1; channel_mask != 0; bit <<= 1, channel_id += 1 )
  605. {
  606. if ( channel_mask & bit )
  607. {
  608. channel_mask ^= bit;
  609. if ( on == true )
  610. {
  611. SOUNDMAN->PsxChannelPlay( channel_id );
  612. std::cout << "Play channel " << channel_id << std::endl;
  613. }
  614. else
  615. {
  616. SOUNDMAN->PsxChannelStop( channel_id );
  617. std::cout << "Stop channel " << channel_id << std::endl;
  618. }
  619. }
  620. }
  621. }
  622. void
  623. AkaoParser::UpdateSequence( ChannelData* channel_data, int channel_id, ChannelConfig& channel_config )
  624. {
  625. //LOGGER->Log( "UpdateSequence for channel " + ToIntString( channel_id ) + "\n" );
  626. u8 opcode;
  627. for( ;; )
  628. {
  629. opcode = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer );
  630. if( opcode < 0xa0 )
  631. {
  632. channel_data[ channel_id ].akao_sequence_pointer += 1;
  633. break;
  634. }
  635. else if( opcode == 0xa1 ) // load instrument
  636. {
  637. LOGGER->Log( " 0xA1 [NOT COMPLETE] " );
  638. int instrument_id = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  639. //LOGGER->Log( "Load instrument " + ToIntString( instrument_id ) + "with 0xA1.\n" );
  640. /*
  641. A0 = hu[A3 + 24];
  642. if (w[80062f04] != 0)
  643. {
  644. A0 = A0 - 18;
  645. }
  646. if (w[A3 + 38] & 00000100)
  647. {
  648. [A1 + 24] = w(w[A1 + 24] & (0 NOR (1 << A0)))
  649. [A3 + 38] = w(w[A3 + 38] & fffffeff)
  650. }
  651. if (hu[A3 + 54] != 0 || (A2 & w[A1 + c] & w[80099fcc]) == 0)
  652. {
  653. [A3 + e0] = w(w[A3 + e0] | 00000010);
  654. [A3 + 30] = w((w[A3 + 30] * w[80075f28 + instrument_id * 40 + 10]) / w[80075f28 + hu[A3 + 58] * 40 + 10]);
  655. }
  656. */
  657. // if loaded adsr release rate, load rest
  658. // note from G
  659. /*
  660. if (w[A3 + 38] & 00000200)
  661. {
  662. InstrumentData data = m_InstrumentData[ instrument_id ];
  663. channel_data[ channel_id ].instrument_id = instrument_id;
  664. channel_data[ channel_id ].start_offset = data.start_offset;
  665. channel_data[ channel_id ].loop_offset = data.loop_offset;
  666. channel_data[ channel_id ].attack_rate = data.attack_rate;
  667. channel_data[ channel_id ].decay_rate = data.decay_rate;
  668. channel_data[ channel_id ].attack_mode = data.attack_mode;
  669. channel_data[ channel_id ].sustain_mode = data.sustain_mode;
  670. channel_data[ channel_id ].sustain_level = data.sustain_level;
  671. channel_data[ channel_id ].sustain_rate = data.sustain_rate;
  672. channel_data[ channel_id ].spu_update_flags |=
  673. SPU_START_OFFSET | SPU_ATTACK_RATE | SPU_SUSTAIN_RATE |
  674. SPU_ATTACK_MODE | SPU_DECAY_RATE | SPU_SUSTAIN_MODE |
  675. SPU_SUSTAIN_LEVEL | SPU_LOOP_OFFSET; // update everything we just set
  676. }
  677. else // init all data
  678. */
  679. {
  680. InitChannelInstrument( channel_data, channel_id, instrument_id );
  681. }
  682. channel_data[ channel_id ].akao_sequence_pointer += 2;
  683. }
  684. else if( opcode == 0xa2 ) // pause
  685. {
  686. LOGGER->Log( " 0xA2 " );
  687. u8 value = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  688. channel_data[ channel_id ].pause_multiplier = 0;
  689. channel_data[ channel_id ].saved_pause = value;
  690. channel_data[ channel_id ].pause = ( value << 8 ) | value;
  691. //LOGGER->Log( "Set pause to 0x" + ToHexString( value, 2, '0' ) + ".\n" );
  692. channel_data[ channel_id ].akao_sequence_pointer += 2;
  693. }
  694. else if( opcode == 0xa3 ) // set volume multiplier
  695. {
  696. LOGGER->Log( " 0xA3 " );
  697. channel_data[ channel_id ].volume_multiplier = ( s8 )( m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 ) );
  698. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME;
  699. //LOGGER->Log( "Set volume multiplier to 0x" + ToHexString( channel_data[ channel_id ].volume_multiplier, 2, '0' ) + ".\n" );
  700. channel_data[ channel_id ].akao_sequence_pointer += 2;
  701. }
  702. else if( opcode == 0xa5 ) // set pitch correction
  703. {
  704. LOGGER->Log( " 0xA5 " );
  705. channel_data[ channel_id ].pitch_correction = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  706. //LOGGER->Log( "Set pitch correction to 0x" + ToHexString( channel_data[ channel_id ].pitch_correction, 4, '0' ) + ".\n" );
  707. channel_data[ channel_id ].akao_sequence_pointer += 2;
  708. }
  709. else if( opcode == 0xa6 ) // increment pitch correction
  710. {
  711. LOGGER->Log( " 0xA6 Increment pitch correction.\n" );
  712. channel_data[ channel_id ].pitch_correction = ( channel_data[ channel_id ].pitch_correction + 1 ) & 0xf;
  713. channel_data[ channel_id ].akao_sequence_pointer += 1;
  714. }
  715. else if( opcode == 0xa7 ) // decrement pitch correction
  716. {
  717. LOGGER->Log( " 0xA7 Decrement pitch correction.\n" );
  718. channel_data[ channel_id ].pitch_correction = ( channel_data[ channel_id ].pitch_correction - 1 ) & 0xf;
  719. channel_data[ channel_id ].akao_sequence_pointer += 1;
  720. }
  721. else if( opcode == 0xa8 ) // set volume
  722. {
  723. LOGGER->Log( " 0xA8 " );
  724. channel_data[ channel_id ].volume_multiplier = ( s8 )( m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 ) );
  725. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME;
  726. channel_data[ channel_id ].volume_level_change_ticks = 0;
  727. channel_data[ channel_id ].volume_level = ( s8 )( m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 ) ) << 0x17;
  728. //LOGGER->Log( "Set volume to 0x" + ToHexString(channel_data[ channel_id ].volume_level, 8, '0' ) + " and reset volume_level_change_ticks.\n" );
  729. channel_data[ channel_id ].akao_sequence_pointer += 2;
  730. }
  731. else if( opcode == 0xa9 ) // set volume increase/descrease
  732. {
  733. LOGGER->Log( " 0xA9 " );
  734. u16 value1 = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  735. s8 value2 = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 2 );
  736. value1 = ( value1 == 0 ) ? 0x100 : value1;
  737. channel_data[ channel_id ].volume_level_change_ticks = value1;
  738. channel_data[ channel_id ].volume_level &= 0xffff0000;
  739. channel_data[ channel_id ].volume_level_add = ( ( value2 << 0x17 ) - channel_data[ channel_id ].volume_level ) / channel_data[ channel_id ].volume_level_change_ticks;
  740. //LOGGER->Log( "Set volume tick to 0x" + ToHexString( channel_data[ channel_id ].volume_level_change_ticks, 4, '0' ) + " and " );
  741. //LOGGER->Log( "volume_level_add 0x" + ToHexString( channel_data[ channel_id ].volume_level_add, 8, '0' ) + ".\n" );
  742. channel_data[ channel_id ].akao_sequence_pointer += 3;
  743. }
  744. else if( opcode == 0xaa ) // set volume pan
  745. {
  746. LOGGER->Log( " 0xAA " );
  747. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME;
  748. channel_data[ channel_id ].volume_index = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 ) << 0x8;
  749. channel_data[ channel_id ].unknown_62 = 0;
  750. //LOGGER->Log( "Set volume pan to 0x" + ToHexString( channel_data[ channel_id ].volume_index, 4, '0' ) + ".\n" );
  751. channel_data[ channel_id ].akao_sequence_pointer += 2;
  752. }
  753. else if( opcode == 0xad ) // ???
  754. {
  755. LOGGER->Log( " 0xAD [UNIMPLEMENTED]\n" );
  756. channel_data[ channel_id ].akao_sequence_pointer += 2;
  757. }
  758. else if( opcode == 0xb1 ) // ???
  759. {
  760. LOGGER->Log( " 0xB1 [UNIMPLEMENTED]\n" );
  761. channel_data[ channel_id ].akao_sequence_pointer += 2;
  762. }
  763. else if( opcode == 0xb4 ) // set wave 1
  764. {
  765. LOGGER->Log( " 0xB4 " );
  766. channel_data[ channel_id ].mirror_update_flags &= 0x00000001;
  767. u16 value1 = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  768. u16 value2 = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 2 );
  769. u16 value3 = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 3 );
  770. if( channel_data[ channel_id ].unknown_54 != 0 )
  771. {
  772. channel_data[ channel_id ].wave1_delay = 0;
  773. if( value1 != 0 )
  774. {
  775. channel_data[ channel_id ].wave1_modifier = value1 << 0x8;
  776. }
  777. }
  778. else
  779. {
  780. channel_data[ channel_id ].wave1_delay = value1;
  781. }
  782. if( value2 == 0 )
  783. {
  784. value2 = 0x100;
  785. }
  786. channel_data[ channel_id ].wave1_refresh_interval = value2;
  787. channel_data[ channel_id ].wave1_table_node_index = value3;
  788. u16 pitch_base = channel_data[ channel_id ].pitch_base;
  789. if( ( channel_data[ channel_id ].wave1_modifier & 0x8000 ) == 0 )
  790. {
  791. pitch_base = ( pitch_base * 0xf ) >> 8;
  792. }
  793. channel_data[ channel_id ].wave1_multiplier = ( ( ( channel_data[ channel_id ].wave1_modifier & 0x7f00 ) >> 8 ) * pitch_base ) >> 7;
  794. channel_data[ channel_id ].wave1_delay_current = channel_data[ channel_id ].wave1_delay;
  795. channel_data[ channel_id ].wave1_refresh_interval_counter = channel_data[ channel_id ].wave1_table_node_index;
  796. channel_data[ channel_id ].wave1_table_index = akao_wave_table_key_nodes[ channel_data[ channel_id ].wave1_table_node_index ];
  797. //LOGGER->Log( "Set wave1 refresh interval to 0x" + ToHexString( channel_data[ channel_id ].wave1_refresh_interval, 4, '0' ) + " " );
  798. //LOGGER->Log( ", wave1 node index to 0x" + ToHexString( channel_data[ channel_id ].wave1_table_node_index, 4, '0' ) + " " );
  799. //LOGGER->Log( "and wave1 delay (or wave1 modifier) to 0x" + ToHexString( value1, 2, '0' ) + ".\n" );
  800. channel_data[ channel_id ].akao_sequence_pointer += 4;
  801. }
  802. else if( opcode == 0xb5 ) // set wave modifier
  803. {
  804. LOGGER->Log( " 0xB5 " );
  805. channel_data[ channel_id ].wave1_modifier = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 ) << 0x8;
  806. u16 pitch_base = channel_data[ channel_id ].pitch_base;
  807. if( ( channel_data[ channel_id ].wave1_modifier & 0x8000 ) == 0 )
  808. {
  809. pitch_base = ( pitch_base * 0xf ) >> 8;
  810. }
  811. channel_data[ channel_id ].wave1_multiplier = ( ( ( channel_data[ channel_id ].wave1_modifier & 0x7f00) >> 8 ) * pitch_base ) >> 7;
  812. //LOGGER->Log( "Set wave modifier to 0x" + ToHexString( channel_data[ channel_id ].wave1_modifier, 4, '0' ) + ".\n" );
  813. channel_data[ channel_id ].akao_sequence_pointer += 2;
  814. }
  815. else if( opcode == 0xc2 ) // turn reverb on
  816. {
  817. LOGGER->Log( " 0xC2 [UNIMPLEMENTED]\n" );
  818. channel_data[ channel_id ].akao_sequence_pointer += 1;
  819. }
  820. else if( opcode == 0xc8 ) // set loop point
  821. {
  822. LOGGER->Log( " 0xC8 " );
  823. channel_data[ channel_id ].loop_index = ( channel_data[ channel_id ].loop_index + 1 ) & 3;
  824. u16 index = channel_data[ channel_id ].loop_index;
  825. channel_data[ channel_id ].loop_pointer[ index ] = channel_data[ channel_id ].akao_sequence_pointer + 1;
  826. channel_data[ channel_id ].loop_count[ index ] = 0;
  827. //LOGGER->Log( "Set loop index 0x" + ToHexString( index, 4, '0' ) + ".\n" );
  828. channel_data[ channel_id ].akao_sequence_pointer += 1;
  829. }
  830. else if( opcode == 0xc9 ) // conditional jump
  831. {
  832. LOGGER->Log( " 0xC9 " );
  833. u16 value = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  834. value = ( value == 0 ) ? 0x100 : value;
  835. u16 index = channel_data[ channel_id ].loop_index;
  836. channel_data[ channel_id ].loop_count[ index ] += 1;
  837. if( channel_data[ channel_id ].loop_count[ index ] != value )
  838. {
  839. channel_data[ channel_id ].akao_sequence_pointer = channel_data[ channel_id ].loop_pointer[ index ];
  840. //LOGGER->Log( "Repeat conditional jump with index 0x" + ToHexString( index, 4, '0' ) + " and value 0x" + ToHexString( value, 4, '0' ) + ". Current loop count 0x" + ToHexString( channel_data[ channel_id ].loop_count[ index ], 4, '0' ) + "\n" );
  841. }
  842. else
  843. {
  844. channel_data[ channel_id ].loop_index = ( index - 1 ) & 3;
  845. //LOGGER->Log( "Go through conditional jump with index 0x" + ToHexString( index, 4, '0' ) + " and value 0x" + ToHexString( value, 4, '0' ) + ".\n" );
  846. }
  847. channel_data[ channel_id ].akao_sequence_pointer += 1;
  848. }
  849. else if( opcode == 0xcc )
  850. {
  851. LOGGER->Log( " 0xCC Set unknown_6e to 1.\n" );
  852. channel_data[ channel_id ].unknown_6e = 1;
  853. channel_data[ channel_id ].akao_sequence_pointer += 1;
  854. }
  855. else if( opcode == 0xcd ) // does nothing
  856. {
  857. LOGGER->Log( " 0xCD Do nothing.\n" );
  858. channel_data[ channel_id ].akao_sequence_pointer += 1;
  859. }
  860. else if( opcode == 0xd9 )
  861. {
  862. LOGGER->Log( " 0xD9 [UNIMPLEMENTED]\n" );
  863. channel_data[ channel_id ].akao_sequence_pointer += 2;
  864. }
  865. else if( opcode == 0xe0 ) // ???
  866. {
  867. LOGGER->Log( " 0xE0 [UNIMPLEMENTED]\n" );
  868. channel_data[ channel_id ].akao_sequence_pointer += 1;
  869. }
  870. else if( opcode == 0xe2 ) // ???
  871. {
  872. LOGGER->Log( " 0xE2 [UNIMPLEMENTED]\n" );
  873. channel_data[ channel_id ].akao_sequence_pointer += 1;
  874. }
  875. else if( opcode == 0xe8 ) // set tempo
  876. {
  877. LOGGER->Log( " 0xE8 " );
  878. channel_config.tempo = m_Music->GetU16LE( channel_data[ channel_id ].akao_sequence_pointer + 1 ) << 0x10;
  879. channel_config.tempo_increment_counter = 0;
  880. //LOGGER->Log( "Set tempo to 0x" + ToHexString( channel_config.tempo, 8, '0' ) + " and reset tempo increment counter to 0.\n" );
  881. channel_data[ channel_id ].akao_sequence_pointer += 3;
  882. }
  883. else if( opcode == 0xea ) // set reverb depth
  884. {
  885. LOGGER->Log( " 0xEA " );
  886. channel_config.spu_update_flags |= SPU_REVERB;
  887. channel_config.reverb_depth = m_Music->GetU16LE( channel_data[ channel_id ].akao_sequence_pointer + 1 ) << 0x10;
  888. channel_config.reverb_depth_increment_counter = 0;
  889. //LOGGER->Log( "Set reverb depth to 0x" + ToHexString( channel_config.reverb_depth, 8, '0' ) + " and reset reverb depth increment counter to 0.\n" );
  890. channel_data[ channel_id ].akao_sequence_pointer += 3;
  891. }
  892. else if( opcode == 0xec )
  893. {
  894. LOGGER->Log( " 0xEC [UNIMPLEMENTED]\n" );
  895. channel_data[ channel_id ].akao_sequence_pointer += 3;
  896. }
  897. else if( opcode == 0xee ) // ???
  898. {
  899. LOGGER->Log( " 0xEE [UNIMPLEMENTED]\n" );
  900. channel_data[ channel_id ].akao_sequence_pointer += 3;
  901. }
  902. else if( opcode == 0xf0 )
  903. {
  904. LOGGER->Log( " 0xF0 [UNIMPLEMENTED]\n" );
  905. channel_data[ channel_id ].akao_sequence_pointer += 4;
  906. }
  907. else if( opcode == 0xf1 )
  908. {
  909. LOGGER->Log( " 0xF1 [UNIMPLEMENTED]\n" );
  910. channel_data[ channel_id ].akao_sequence_pointer += 4;
  911. }
  912. else if( opcode == 0xf2 ) // load instrument
  913. {
  914. LOGGER->Log( " 0xF2 " );
  915. int instrument_id = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  916. //LOGGER->Log( "Load instrument " + ToIntString( instrument_id ) + " with 0xF2.\n" );
  917. InstrumentData data = m_InstrumentData[ instrument_id ];
  918. if( ( channel_data[ channel_id ].unknown_54 != 0 ) /*|| ( (A2 & w[A1 + c] & w[80099fcc]) == 0 )*/ )
  919. {
  920. channel_data[ channel_id ].spu_update_flags |= SPU_PITCH;
  921. channel_data[ channel_id ].pitch_base = ( channel_data[ channel_id ].pitch_base * data.pitch[ 0 ] ) / m_InstrumentData[ channel_data[ channel_id ].instrument_id ].pitch[ 0 ];
  922. }
  923. channel_data[ channel_id ].instrument_id = instrument_id;
  924. channel_data[ channel_id ].start_offset = 0x00076fe0;
  925. channel_data[ channel_id ].loop_offset = data.loop_offset;
  926. channel_data[ channel_id ].attack_rate = data.attack_rate;
  927. channel_data[ channel_id ].decay_rate = data.decay_rate;
  928. channel_data[ channel_id ].sustain_level = data.sustain_level;
  929. channel_data[ channel_id ].sustain_rate = data.sustain_rate;
  930. channel_data[ channel_id ].attack_mode = data.attack_mode;
  931. channel_data[ channel_id ].sustain_mode = data.sustain_mode;
  932. channel_data[ channel_id ].spu_update_flags |= SPU_START_OFFSET | SPU_ATTACK_RATE | SPU_SUSTAIN_RATE | SPU_ATTACK_MODE | SPU_DECAY_RATE | SPU_SUSTAIN_MODE | SPU_SUSTAIN_LEVEL | SPU_LOOP_OFFSET;
  933. if( ( channel_data[ channel_id ].mirror_update_flags & 0x00000200 ) == 0 )
  934. {
  935. channel_data[ channel_id ].release_rate = data.release_rate;
  936. channel_data[ channel_id ].release_mode = data.release_mode;
  937. channel_data[ channel_id ].spu_update_flags |= SPU_RELEASE_RATE | SPU_RELEASE_MODE;
  938. }
  939. channel_data[ channel_id ].akao_sequence_pointer += 2;
  940. }
  941. else if( opcode == 0xfd ) // reset timers lower and upper
  942. {
  943. LOGGER->Log( " 0xFD Reset upper timer to 0 with bound " );
  944. channel_config.upper_timer_top = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 2 );
  945. //LOGGER->Log( ToHexString( channel_config.upper_timer_top, 4, '0' ) + " and lower timer to 0 with bound " );
  946. channel_config.upper_timer = 0;
  947. channel_config.lower_timer_top = m_Music->GetU8( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  948. //LOGGER->Log( ToHexString( channel_config.lower_timer_top, 4, '0' ) + ".\n" );
  949. channel_config.lower_timer = 0;
  950. channel_data[ channel_id ].akao_sequence_pointer += 3;
  951. }
  952. else if( opcode == 0xfe ) // reset timer top
  953. {
  954. LOGGER->Log( " 0xFE Reset top timer to " );
  955. channel_config.top_timer = m_Music->GetU16LE( channel_data[ channel_id ].akao_sequence_pointer + 1 );
  956. //LOGGER->Log( ToHexString( channel_config.top_timer, 4, '0' ) + ".\n" );
  957. channel_data[ channel_id ].akao_sequence_pointer += 3;
  958. }
  959. else if( opcode == 0xff )
  960. {
  961. LOGGER->Log( " 0xFF [UNIMPLEMENTED]\n" );
  962. channel_data[ channel_id ].akao_sequence_pointer += 4;
  963. }
  964. else
  965. {
  966. //LOGGER->Log( ToHexString( opcode, 2, '0' ) + " [UNKNOWN]\n" );
  967. break;
  968. }
  969. }
  970. if( opcode != 0xa0 )
  971. {
  972. //LOGGER->Log( " 0x" + ToHexString( opcode, 2, '0' ) + " PLAY.\n" );
  973. u8 ret_op = NextSequenceHandle( channel_data, channel_id, channel_config );
  974. if( channel_data[ channel_id ].pause_multiplier != 0)
  975. {
  976. channel_data[ channel_id ].pause = channel_data[ channel_id ].pause_multiplier * 0x101;
  977. }
  978. if( ( channel_data[ channel_id ].pause & 0xff ) == 0 )
  979. {
  980. channel_data[ channel_id ].pause = akao_pause_table[ opcode % 11 ];
  981. }
  982. if( ( ( ret_op - 0x84 ) >= 0xb ) && ( ( channel_data[ channel_id ].unknown_6e & 5 ) == 0 ) )
  983. {
  984. channel_data[ channel_id ].pause -= 0x0200;
  985. }
  986. channel_data[ channel_id ].saved_pause = channel_data[ channel_id ].pause & 0x00ff;
  987. if( opcode >= 0x8f )
  988. {
  989. channel_data[ channel_id ].unknown_6c = 0;
  990. channel_data[ channel_id ].unknown_6e &= 0xfffd;
  991. channel_data[ channel_id ].pitch_addition2 = 0;
  992. channel_data[ channel_id ].unknown_d8 = 0;
  993. }
  994. else if( opcode < 0x84 )
  995. {
  996. u32 pitch_base = 0;
  997. if( channel_data[ channel_id ].mirror_update_flags & 0x00000008 )
  998. {
  999. /*
  1000. S2 = opcode / b;
  1001. if (hu[channel_data + 54] == 0)
  1002. {
  1003. [channels_config + 8] = w(w[channels_config + 8] | mask);
  1004. }
  1005. else
  1006. {
  1007. [80099fd0] = w(w[80099fd0] | mask);
  1008. }
  1009. V1 = (S2 & ff) / c;
  1010. A0 = (S2 & ff) % c
  1011. A2 = w[channel_data + 14];
  1012. A0 = A0 & ff;
  1013. V0 = A0 * 5;
  1014. A2 = A2 + V0;
  1015. if (bu[A2] != hu[channel_data + 58])
  1016. {
  1017. [channel_data + 58] = h(bu[A2]);
  1018. V0 = bu[A2] * 40;
  1019. [channel_data + e4] = w(w[80075f28 + V0]);
  1020. [channel_data + e8] = w(w[80075f2c + V0]);
  1021. [channel_data + fa] = h(bu[80075f30 + V0]);
  1022. [channel_data + fc] = h(bu[80075f31 + V0]);
  1023. [channel_data + fe] = h(bu[80075f32 + V0]);
  1024. [channel_data + 100] = h(bu[80075f33 + V0]);
  1025. [channel_data + ec] = w(bu[80075f35 + V0]);
  1026. [channel_data + f0] = w(bu[80075f36 + V0]);
  1027. if ((w[channel_data + 38] & 200) == 0)
  1028. {
  1029. V0 = bu[A2] * 40;
  1030. [channel_data + 102] = h(bu[80075f34 + V0]);
  1031. [channel_data + f4] = w(bu[80075f37 + V0]);
  1032. [channel_data + e0] = w(w[channel_data + e0] | 1ff80);
  1033. }
  1034. else
  1035. {
  1036. [channel_data + e0] = w(w[channel_data + e0] | 1bb80);
  1037. }
  1038. }
  1039. V1 = bu[A2 + 1];
  1040. A1 = (S2 & ff) / c;
  1041. V1 = (S2 & ff) % c;
  1042. A1 = A1 & ff;
  1043. A0 = w[80075f38 + bu[A2 + 0] * 40 + V1 * 4];
  1044. if (A1 >= 7)
  1045. {
  1046. V0 = A1 - 6;
  1047. A0 = V0 << A0;
  1048. }
  1049. else if (A1 < 6)
  1050. {
  1051. V0 = 6 - A1;
  1052. A0 = A0 >> V0;
  1053. }
  1054. [channel_data + 44] = w((bu[A2 + 2] + (bu[A2 + 3] << 8)) << 10);
  1055. [channel_data + 60] = h(bu[A2 + 4] << 8);
  1056. */
  1057. }
  1058. else
  1059. {
  1060. u8 pitch_index = opcode / 11 + channel_data[ channel_id ].pitch_correction * 12;
  1061. if( ( channel_data[ channel_id ].unknown_6c != 0 ) && ( channel_data[ channel_id ].unknown_6a != 0 ) )
  1062. {
  1063. channel_data[ channel_id ].unknown_68 = channel_data[ channel_id ].unknown_6c;
  1064. channel_data[ channel_id ].unknown_d2 = pitch_index + channel_data[ channel_id ].pitch_selector - channel_data[ channel_id ].unknown_6a - channel_data[ channel_id ].unknown_d4;
  1065. channel_data[ channel_id ].saved_pitch = channel_data[ channel_id ].unknown_6a - channel_data[ channel_id ].pitch_selector - channel_data[ channel_id ].unknown_d4;
  1066. pitch_index = channel_data[ channel_id ].unknown_6a + channel_data[ channel_id ].unknown_d4;
  1067. }
  1068. else
  1069. {
  1070. channel_data[ channel_id ].saved_pitch = pitch_index;
  1071. pitch_index += channel_data[ channel_id ].pitch_selector;
  1072. }
  1073. if( ( channel_data[ channel_id ].unknown_6e & 0x0002 ) == 0 )
  1074. {
  1075. if( channel_data[ channel_id ].unknown_54 == 0 )
  1076. {
  1077. channel_config.for_play_channel_mask |= ( 1 << channel_id );
  1078. if( channel_data[ channel_id ].mirror_update_flags & 0x00000100 )
  1079. {
  1080. u16 mirror_channel_id = channel_data[ channel_id ].mirror_channel_id;
  1081. if( mirror_channel_id >= 0x18 )
  1082. {
  1083. mirror_channel_id -= 0x18;
  1084. }
  1085. channel_config.for_play_channel_mask |= ( 1 << mirror_channel_id );
  1086. }
  1087. }
  1088. /*
  1089. else
  1090. {
  1091. [80099fd0] = w(w[80099fd0] | ( 1 << channel_id ));
  1092. }
  1093. */
  1094. channel_data[ channel_id ].unknown_64 = 0;
  1095. }
  1096. u8 mod = pitch_index / 12;
  1097. pitch_base = m_InstrumentData[ channel_data[ channel_id ].instrument_id ].pitch[ pitch_index % 12 ];
  1098. if( mod >= 7 )
  1099. {
  1100. pitch_base <<= ( mod - 6 );
  1101. }
  1102. else if( mod < 6 )
  1103. {
  1104. pitch_base >>= ( 6 - mod );
  1105. }
  1106. }
  1107. if( channel_data[ channel_id ].unknown_54 == 0 )
  1108. {
  1109. channel_config.unknown_0c |= ( 1 << channel_id );
  1110. }
  1111. /*
  1112. else
  1113. {
  1114. [80099fd4] = w(w[80099fd4] | ( 1 << channel_id ));
  1115. }
  1116. */
  1117. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME | SPU_PITCH;
  1118. s16 pitch_modifier = channel_data[ channel_id ].pitch_modifier;
  1119. if( pitch_modifier != 0 )
  1120. {
  1121. if( pitch_modifier > 0 )
  1122. {
  1123. pitch_modifier = ( pitch_base * pitch_modifier ) >> 7;
  1124. }
  1125. else
  1126. {
  1127. pitch_modifier = ( pitch_base * pitch_modifier ) >> 8;
  1128. }
  1129. pitch_base = ( pitch_base + pitch_modifier ) & 0xffff;
  1130. }
  1131. channel_data[ channel_id ].pitch_base = pitch_base;
  1132. if( channel_data[ channel_id ].mirror_update_flags & 0x00000001 )
  1133. {
  1134. u16 wave1_modifier = ( channel_data[ channel_id ].wave1_modifier & 0x7f00 ) >> 8;
  1135. if( channel_data[ channel_id ].wave1_modifier & 0x8000 )
  1136. {
  1137. pitch_base = wave1_modifier * pitch_base;
  1138. }
  1139. else
  1140. {
  1141. pitch_base = wave1_modifier * ( ( pitch_base * 0xf ) >> 8 );
  1142. }
  1143. channel_data[ channel_id ].wave1_multiplier = pitch_base >> 0x7;
  1144. channel_data[ channel_id ].wave1_delay_current = channel_data[ channel_id ].wave1_delay;
  1145. channel_data[ channel_id ].wave1_refresh_interval_counter = 1;
  1146. channel_data[ channel_id ].wave1_table_index = akao_wave_table_key_nodes[ channel_data[ channel_id ].wave1_table_node_index ];
  1147. }
  1148. if( channel_data[ channel_id ].mirror_update_flags & 0X00000002 )
  1149. {
  1150. channel_data[ channel_id ].wave2_delay_current = channel_data[ channel_id ].wave2_delay;
  1151. channel_data[ channel_id ].wave2_refresh_interval_counter = 1;
  1152. channel_data[ channel_id ].wave2_table_index = akao_wave_table_key_nodes[ channel_data[ channel_id ].wave2_table_node_index ];
  1153. }
  1154. if( channel_data[ channel_id ].mirror_update_flags & 0x00000004 )
  1155. {
  1156. channel_data[ channel_id ].wave3_refresh_interval_counter = 1;
  1157. channel_data[ channel_id ].wave3_table_index = akao_wave_table_key_nodes[ channel_data[ channel_id ].wave3_table_node_index ];
  1158. }
  1159. channel_data[ channel_id ].pitch_addition2 = 0;
  1160. channel_data[ channel_id ].unknown_d8 = 0;
  1161. channel_data[ channel_id ].pitch_addition = 0;
  1162. }
  1163. u16 unknown_d2 = channel_data[ channel_id ].unknown_d2;
  1164. channel_data[ channel_id ].unknown_6e = ( channel_data[ channel_id ].unknown_6e & 0xfffd ) | ( ( channel_data[ channel_id ].unknown_6e & 0x0001 ) << 1 );
  1165. if( unknown_d2 != 0 )
  1166. {
  1167. channel_data[ channel_id ].saved_pitch += unknown_d2;
  1168. u8 selected_pitch = channel_data[ channel_id ].saved_pitch + channel_data[ channel_id ].pitch_selector;
  1169. u32 pitch_value = 0;
  1170. if( channel_data[ channel_id ].unknown_54 == 0 )
  1171. {
  1172. pitch_value = m_InstrumentData[ channel_data[ channel_id ].instrument_id ].pitch[ selected_pitch % 12 ];
  1173. s16 pitch_modifier = channel_data[ channel_id ].pitch_modifier;
  1174. if( pitch_modifier != 0 )
  1175. {
  1176. if( pitch_modifier > 0 )
  1177. {
  1178. pitch_modifier = ( pitch_value * pitch_modifier ) >> 7;
  1179. }
  1180. else
  1181. {
  1182. pitch_modifier = ( pitch_value * pitch_modifier ) >> 8;
  1183. }
  1184. pitch_value += pitch_modifier;
  1185. }
  1186. }
  1187. else
  1188. {
  1189. pitch_value = m_InstrumentData[ channel_data[ channel_id ].instrument_id ].pitch[ selected_pitch %= 12 ];
  1190. }
  1191. pitch_value <<= 0x10;
  1192. selected_pitch /= 12;
  1193. if( selected_pitch >= 7 )
  1194. {
  1195. pitch_value <<= ( selected_pitch - 6 );
  1196. }
  1197. else if (selected_pitch < 6)
  1198. {
  1199. pitch_value >>= ( 6 - selected_pitch );
  1200. }
  1201. channel_data[ channel_id ].unknown_64 = channel_data[ channel_id ].unknown_68;
  1202. channel_data[ channel_id ].unknown_d2 = 0;
  1203. channel_data[ channel_id ].pitch_growth = (pitch_value + channel_data[ channel_id ].pitch_addition - ( channel_data[ channel_id ].pitch_base << 0x10 ) ) / channel_data[ channel_id ].unknown_64;
  1204. }
  1205. channel_data[ channel_id ].unknown_d4 = channel_data[ channel_id ].pitch_selector;
  1206. channel_data[ channel_id ].unknown_6a = channel_data[ channel_id ].saved_pitch;
  1207. }
  1208. else // 0xa0
  1209. {
  1210. LOGGER->Log( " 0xA0 FINISH.\n" );
  1211. }
  1212. }
  1213. const u8
  1214. AkaoParser::NextSequenceHandle( ChannelData* channel_data, int channel_id, ChannelConfig& channel_config )
  1215. {
  1216. u32 pointer = channel_data[ channel_id ].akao_sequence_pointer;
  1217. u16 loop_index = channel_data[ channel_id ].loop_index;
  1218. while( true )
  1219. {
  1220. u8 opcode = m_Music->GetU8( pointer );
  1221. if( opcode < 0x9a )
  1222. {
  1223. if( opcode >= 0x8f )
  1224. {
  1225. channel_data[ channel_id ].unknown_6c = 0;
  1226. channel_data[ channel_id ].unknown_6e &= 0xfffa;
  1227. }
  1228. return opcode;
  1229. }
  1230. if( opcode < 0xa0 )
  1231. {
  1232. return 0xa0;
  1233. }
  1234. u8 size = opcode_size[ opcode - 0xa0 ];
  1235. if( size == 0 )
  1236. {
  1237. switch( opcode )
  1238. {
  1239. case 0xc9:
  1240. {
  1241. if( m_Music->GetU8( pointer + 1 ) == channel_data[ channel_id ].loop_count[ loop_index ] )
  1242. {
  1243. pointer += 2;
  1244. loop_index = (loop_index - 1) & 3;
  1245. }
  1246. else
  1247. {
  1248. pointer = channel_data[ channel_id ].loop_pointer[ loop_index ];
  1249. }
  1250. continue;
  1251. }
  1252. break;
  1253. case 0xca:
  1254. {
  1255. pointer = channel_data[ channel_id ].loop_pointer[ loop_index ];
  1256. continue;
  1257. }
  1258. break;
  1259. case 0xcb:
  1260. case 0xcd:
  1261. case 0xd1:
  1262. case 0xdb:
  1263. {
  1264. pointer += 1;
  1265. channel_data[ channel_id ].unknown_6c = 0;
  1266. channel_data[ channel_id ].unknown_6e &= 0xfffa;
  1267. continue;
  1268. }
  1269. break;
  1270. case 0xee:
  1271. {
  1272. pointer += 3 + ( s16 )( m_Music->GetU16LE( pointer + 1 ) );
  1273. continue;
  1274. }
  1275. break;
  1276. case 0xef:
  1277. {
  1278. if( channel_config.conditional_value >= m_Music->GetU8( pointer + 1 ) )
  1279. {
  1280. pointer += 4 + ( s16 )( m_Music->GetU16LE( pointer + 2 ) );
  1281. }
  1282. else
  1283. {
  1284. pointer += 4;
  1285. }
  1286. continue;
  1287. }
  1288. break;
  1289. case 0xf0:
  1290. case 0xf1:
  1291. {
  1292. if( m_Music->GetU8( pointer + 1 ) == channel_data[ channel_id ].loop_count[ loop_index ] + 1 )
  1293. {
  1294. loop_index = (loop_index - 1) & 3;
  1295. pointer += 4 + ( s16 )( m_Music->GetU16LE( pointer + 2 ) );
  1296. }
  1297. else
  1298. {
  1299. pointer += 4;
  1300. }
  1301. continue;
  1302. }
  1303. break;
  1304. default:
  1305. {
  1306. channel_data[ channel_id ].unknown_6c = 0;
  1307. channel_data[ channel_id ].unknown_6e &= 0xfffa;
  1308. return 0xa0;
  1309. }
  1310. }
  1311. }
  1312. pointer += size;
  1313. }
  1314. }
  1315. void
  1316. AkaoParser::UpdateCounters( ChannelData* channel_data, int channel_id, ChannelConfig& channel_config )
  1317. {
  1318. // update volume level
  1319. if( channel_data[ channel_id ].volume_level_change_ticks != 0 )
  1320. {
  1321. channel_data[ channel_id ].volume_level_change_ticks -= 1;
  1322. s32 volume_level = channel_data[ channel_id ].volume_level + channel_data[ channel_id ].volume_level_add;
  1323. if( ( volume_level & 0xffe0 ) != ( channel_data[ channel_id ].volume_level & 0xffe0 ) )
  1324. {
  1325. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME;
  1326. }
  1327. channel_data[ channel_id ].volume_level = volume_level;
  1328. }
  1329. if( channel_data[ channel_id ].unknown_c6_change_ticks != 0 )
  1330. {
  1331. channel_data[ channel_id ].unknown_c6_change_ticks -= 1;
  1332. u16 value = channel_data[ channel_id ].unknown_c6 + channel_data[ channel_id ].unknown_c8;
  1333. if( channel_data[ channel_id ].mirror_update_flags & 0x00000100 )
  1334. {
  1335. if( ( value & 0xff00 ) != ( channel_data[ channel_id ].unknown_c6 & 0xff00 ) )
  1336. {
  1337. channel_data[ channel_id ].spu_update_flags |= SPU_LEFT_VOLUME | SPU_RIGHT_VOLUME;
  1338. }
  1339. }
  1340. channel_data[ channel_id ].unknown_c6 = value;
  1341. }
  1342. /*
  1343. if (hu[S0 + 62] != 0)
  1344. {
  1345. [S0 + 62] = h(hu[S0 + 62] - 1);
  1346. A1 = hu[S0 + 60] + h[S0 + ca];
  1347. if ((A1 & ff00) != (hu[S0 + 60] & ff00))
  1348. {
  1349. [S0 + e0] = w(w[S0 + e0] | 00000003);
  1350. }
  1351. [S0 + 60] = h(A1);
  1352. }
  1353. if (hu[S0 + 74] != 0) // wave1_delay_current
  1354. {
  1355. [S0 + 74] = h(hu[S0 + 74] - 1);
  1356. }
  1357. if (hu[S0 + 88] != 0) // wave2_delay_current
  1358. {
  1359. [S0 + 88] = h(hu[S0 + 88] - 1);
  1360. }
  1361. if (hu[S0 + a4] != 0)
  1362. {
  1363. [S0 + a4] = h(hu[S0 + a4] - 1);
  1364. if (hu[S0 + a4] == 0)
  1365. {
  1366. channel_config.unknown_2c ^= ( 1 << channel_id );
  1367. [8009a13c] = w(w[8009a13c] | 00000010);
  1368. func2ff4c;
  1369. }
  1370. }
  1371. if (hu[S0 + a6] != 0)
  1372. {
  1373. [S0 + a4] = h(hu[S0 + a4] - 1);
  1374. if (hu[S0 + a4] == 0)
  1375. {
  1376. channel_config.unknown_34 ^= ( 1 << channel_id );
  1377. 8002E660 jal func30148 [$80030148]
  1378. }
  1379. }
  1380. if (hu[S0 + 80] != 0)
  1381. {
  1382. [S0 + 80] = h(hu[S0 + 80] - 1);
  1383. [S0 + 7e] = h(hu[S0 + 7e] + hu[S0 + 82]);
  1384. A0 = (hu[S0 + 7e] & 7f00) >> 8;
  1385. if (hu[S0 + 7e] & 8000)
  1386. {
  1387. V0 = A0 * w[S0 + 30];
  1388. }
  1389. else
  1390. {
  1391. V0 = A0 * ((w[S0 + 30] * f) >> 8);
  1392. }
  1393. [S0 + 7c] = h(V0 >> 7);
  1394. if (hu[S0 + 74] == 0)
  1395. {
  1396. if (hu[S0 + 78] != 1)
  1397. {
  1398. A0 = w[S0 + 18];
  1399. if (h[A0 + 0] == 0)
  1400. {
  1401. if (h[A0 + 2] == 0)
  1402. {
  1403. A0 = A0 + h[A0 + 4] * 2;
  1404. }
  1405. }
  1406. A1 = (hu[S0 + 7c] * h[A0]) >> 10;
  1407. if (A1 != h[S0 + d6])
  1408. {
  1409. [S0 + d6] = h(A1);
  1410. [S0 + e0] = w(w[S0 + e0] | 00000010);
  1411. if (A1 >= 0)
  1412. {
  1413. [S0 + d6] = h(A1 * 2);
  1414. }
  1415. }
  1416. }
  1417. }
  1418. }
  1419. if (hu[S0 + 92] != 0)
  1420. {
  1421. [S0 + 92] = h(hu[S0 + 92] - 1);
  1422. [S0 + 90] = h(hu[S0 + 90] + hu[S0 + 94]);
  1423. if (hu[S0 + 88] == 0)
  1424. {
  1425. if (hu[S0 + 8c] != 1)
  1426. {
  1427. A0 = w[S0 + 1c];
  1428. if (h[A0 + 0] == 0)
  1429. {
  1430. V0 = h[A0 + 2];
  1431. if (V0 == 0)
  1432. {
  1433. A0 = A0 + h[A0 + 4] * 2;
  1434. }
  1435. }
  1436. A1 = ((((((h[S0 + 46] * w[S0 + 2c]) >> 7) * (hu[S0 + 90] >> 8)) << 9) >> 10) * h[A0]) >> f;
  1437. if (A1 != h[S0 + d8])
  1438. {
  1439. [S0 + e0] = w(w[S0 + e0] | 00000003);
  1440. [S0 + d8] = h(A1);
  1441. }
  1442. }
  1443. }
  1444. }
  1445. if (hu[S0 + a0] != 0)
  1446. {
  1447. [S0 + a0] = h(hu[S0 + a0] - 1);
  1448. [S0 + 9e] = h(hu[S0 + 9e] + hu[S0 + a2]);
  1449. if (hu[S0 + 9a] != 1)
  1450. {
  1451. A0 = w[S0 + 20];
  1452. if (h[A0 + 0] == 0)
  1453. {
  1454. if (h[A0 + 2] == 0)
  1455. {
  1456. A0 = A0 + h[A0 + 4] * 2;
  1457. }
  1458. }
  1459. A1 = ((hu[S0 + 9e] >> 8) * h[A0]) >> f;
  1460. if (A1 != h[S0 + da])
  1461. {
  1462. [S0 + e0] = w(w[S0 + e0] | 00000003);
  1463. [S0 + da] = h(A1);
  1464. }
  1465. }
  1466. }
  1467. if (hu[S0 + 64] != 0)
  1468. {
  1469. [S0 + 64] = h(hu[S0 + 64] - 1);
  1470. A1 = w[S0 + 34] + w[S0 + 4c];
  1471. if ((A1 & ffff0000) != (w[S0 + 34] & ffff0000))
  1472. {
  1473. [S0 + e0] = w(w[S0 + e0] | 00000010);
  1474. }
  1475. [S0 + 34] = w(A1);
  1476. }
  1477. */
  1478. }
  1479. void
  1480. AkaoParser::InitChannelInstrument( ChannelData* channel_data, int channel_id, int instrument_id )
  1481. {
  1482. //LOGGER->Log( "Load voice " + Ogre::StringConverter::toString( instrument_id ) + " to channel " + Ogre::StringConverter::toString( channel_id ) + ".\n" );
  1483. InstrumentData data = m_InstrumentData[ instrument_id ];
  1484. channel_data[ channel_id ].instrument_id = instrument_id;
  1485. channel_data[ channel_id ].start_offset = data.start_offset;
  1486. channel_data[ channel_id ].loop_offset = data.loop_offset;
  1487. //LOGGER->Log( "SPU_ADDRESS_START " + Ogre::StringConverter::toString( data.start_offset ) + "\n" );
  1488. //LOGGER->Log( "SPU_ADDRESS_LOOP " + Ogre::StringConverter::toString( data.loop_offset ) + "\n" );
  1489. channel_data[ channel_id ].attack_mode = data.attack_mode;
  1490. channel_data[ channel_id ].sustain_mode = data.sustain_mode;
  1491. channel_data[ channel_id ].release_mode = data.release_mode;
  1492. channel_data[ channel_id ].attack_rate = data.attack_rate;
  1493. channel_data[ channel_id ].decay_rate = data.decay_rate;
  1494. channel_data[ channel_id ].sustain_level = data.sustain_level;
  1495. channel_data[ channel_id ].sustain_rate = data.sustain_rate;
  1496. channel_data[ channel_id ].release_rate = data.release_rate;
  1497. channel_data[ channel_id ].spu_update_flags |=
  1498. SPU_START_OFFSET | SPU_ATTACK_RATE | SPU_SUSTAIN_RATE | SPU_RELEASE_RATE |
  1499. SPU_ATTACK_MODE | SPU_DECAY_RATE | SPU_SUSTAIN_MODE | SPU_RELEASE_MODE |
  1500. SPU_SUSTAIN_LEVEL | SPU_LOOP_OFFSET; // update everything we just set
  1501. }
  1502. void
  1503. AkaoParser::DumpSequenceData( const Ogre::String& file )
  1504. {
  1505. std::ofstream oF;
  1506. oF.open( file.c_str(), std::ios_base::binary | std::ios_base::out );
  1507. if ( !oF.is_open() )
  1508. {
  1509. return;
  1510. }
  1511. oF << std::setfill( '0' );
  1512. oF << std::hex;
  1513. oF << "*** Frame ID: 0x" << std::setw( 4 ) << m_Music->GetU16LE( 4 ) << std::endl;
  1514. oF << std::dec;
  1515. oF << "*** Frame Length: " << m_Music->GetU16LE( 6 ) << " bytes" << std::endl;
  1516. oF << std::hex;
  1517. oF << "*** Reverb Mode: 0x" << std::setw( 4 ) << m_Music->GetU16LE( 8 ) << std::endl;
  1518. oF << std::endl;
  1519. oF << std::hex;
  1520. oF << "*** Channels mask: " <<std:: setw( 8 ) << m_Music->GetU32LE( 16 ) << std::endl << std::endl;
  1521. for ( int i = 0; i < 24; ++i )
  1522. {
  1523. if ( ( ( m_Music->GetU32LE( 16 ) ) & ( 1 << i ) ) == 0 )
  1524. {
  1525. continue;
  1526. }
  1527. oF << std::dec;
  1528. oF << "*** Channel " << std::setw( 2 ) << ( int )i << " sequence: " << std::endl;
  1529. oF << std::hex;
  1530. u16 j = 0;
  1531. bool work = true;
  1532. while ( work )
  1533. {
  1534. u8 opcode = m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j );
  1535. switch ( opcode )
  1536. {
  1537. case 0xa0:
  1538. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 );
  1539. oF << std::endl;
  1540. work = false;
  1541. break;
  1542. // no parameters
  1543. case 0xa6: case 0xa7: case 0xb3: case 0xb6: case 0xba: case 0xbe: case 0xc2: case 0xc3:
  1544. case 0xc4: case 0xc5: case 0xc6: case 0xc7: case 0xc8: case 0xca: case 0xcb: case 0xcc:
  1545. case 0xcd: case 0xd0: case 0xd1: case 0xd4: case 0xd5: case 0xd6: case 0xd7: case 0xdb:
  1546. case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
  1547. case 0xed: case 0xf3: case 0xf5: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xff:
  1548. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 );
  1549. oF << std::endl;
  1550. ++j;
  1551. break;
  1552. // one parameter
  1553. case 0xa1: case 0xa2: case 0xa3: case 0xa5: case 0xa8: case 0xaa: case 0xac: case 0xad:
  1554. case 0xae: case 0xaf: case 0xb1: case 0xb2: case 0xb5: case 0xb7: case 0xb9: case 0xbb:
  1555. case 0xbd: case 0xbf: case 0xc0: case 0xc1: case 0xc9: case 0xce: case 0xcf: case 0xd2:
  1556. case 0xd3: case 0xd8: case 0xd9: case 0xda: case 0xdc: case 0xf2: case 0xf6: case 0xf8:
  1557. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 ) << ' ';
  1558. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 1 );
  1559. oF << std::endl;
  1560. j += 2;
  1561. break;
  1562. // two parameters
  1563. case 0xa4: case 0xa9: case 0xab: case 0xb0: case 0xbc: case 0xdd: case 0xde: case 0xdf:
  1564. case 0xe8: case 0xea: case 0xec: case 0xee: case 0xf4: case 0xf7: case 0xfd: case 0xfe:
  1565. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 ) << ' ';
  1566. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 1 ) << ' ';
  1567. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 2 );
  1568. oF << std::endl;
  1569. j += 3;
  1570. break;
  1571. // three parameters
  1572. case 0xb4: case 0xb8: case 0xe9: case 0xeb: case 0xef: case 0xf0: case 0xf1:
  1573. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 ) << ' ';
  1574. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 1 ) << ' ';
  1575. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 2 ) << ' ';
  1576. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 3 );
  1577. oF << std::endl;
  1578. j += 4;
  1579. break;
  1580. default:
  1581. oF << std::setw( 2 ) << ( int )m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 0 );
  1582. if ( m_Music->GetU8( m_MusicChannelData[ i ].akao_sequence_pointer + j + 1 ) < 0xa0)
  1583. {
  1584. oF << ' ';
  1585. }
  1586. else
  1587. {
  1588. oF << std::endl;
  1589. }
  1590. ++j;
  1591. }
  1592. }
  1593. oF << std::endl;
  1594. }
  1595. oF.close();
  1596. }