Mercurial > audlegacy-plugins
annotate src/adplug/core/jbm.cxx @ 3203:f5456241bff9 default tip
changed include path from audacious to audlegacy.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Tue, 10 Nov 2009 05:19:25 +0900 |
parents | f1b6f1b2cdb3 |
children |
rev | line source |
---|---|
964
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
1 /* |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
2 * Adplug - Replayer for many OPL2/OPL3 audio file formats. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
3 * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
4 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
8 * version 2.1 of the License, or (at your option) any later version. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
9 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
14 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
2835 | 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
964
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
18 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
19 * Johannes Bjerregaard's JBM Adlib Music Format player for AdPlug |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
20 * Written by Dennis Lindroos <lindroos@nls.fi>, February-March 2007 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
21 * - Designed and coded from scratch (only frequency-table taken from MUSIC.BIN) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
22 * - The percussion mode is buggy (?) but i'm not good enough to find them |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
23 * and honestly i think the melodic-mode tunes are much better ;) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
24 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
25 * This version doesn't use the binstr.h functions (coded with custom func.) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
26 * This is my first attempt on writing a musicplayer for AdPlug, and i'm not |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
27 * coding C++ very often.. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
28 * |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
29 * Released under the terms of the GNU General Public License. |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
30 */ |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
31 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
32 #include "jbm.h" |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
33 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
34 static const unsigned short notetable[96] = { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
35 0x0158, 0x016d, 0x0183, 0x019a, 0x01b2, 0x01cc, 0x01e7, 0x0204, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
36 0x0223, 0x0244, 0x0266, 0x028b, 0x0558, 0x056d, 0x0583, 0x059a, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
37 0x05b2, 0x05cc, 0x05e7, 0x0604, 0x0623, 0x0644, 0x0666, 0x068b, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
38 0x0958, 0x096d, 0x0983, 0x099a, 0x09b2, 0x09cc, 0x09e7, 0x0a04, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
39 0x0a23, 0x0a44, 0x0a66, 0x0a8b, 0x0d58, 0x0d6d, 0x0d83, 0x0d9a, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
40 0x0db2, 0x0dcc, 0x0de7, 0x0e04, 0x0e23, 0x0e44, 0x0e66, 0x0e8b, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
41 0x1158, 0x116d, 0x1183, 0x119a, 0x11b2, 0x11cc, 0x11e7, 0x1204, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
42 0x1223, 0x1244, 0x1266, 0x128b, 0x1558, 0x156d, 0x1583, 0x159a, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
43 0x15b2, 0x15cc, 0x15e7, 0x1604, 0x1623, 0x1644, 0x1666, 0x168b, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
44 0x1958, 0x196d, 0x1983, 0x199a, 0x19b2, 0x19cc, 0x19e7, 0x1a04, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
45 0x1a23, 0x1a44, 0x1a66, 0x1a8b, 0x1d58, 0x1d6d, 0x1d83, 0x1d9a, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
46 0x1db2, 0x1dcc, 0x1de7, 0x1e04, 0x1e23, 0x1e44, 0x1e66, 0x1e8b |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
47 }; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
48 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
49 static const unsigned char percmx_tab[4] = { 0x14, 0x12, 0x15, 0x11 }; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
50 static const unsigned char perchn_tab[5] = { 6, 7, 8, 8, 7 }; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
51 static unsigned char percmaskoff[5] = { 0xef, 0xf7, 0xfb, 0xfd, 0xfe }; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
52 static unsigned char percmaskon[5] = { 0x10, 0x08, 0x04, 0x02, 0x01 }; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
53 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
54 static inline unsigned short GET_WORD(unsigned char *b, int x) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
55 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
56 return ((unsigned short)(b[x+1] << 8) | b[x]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
57 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
58 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
59 /*** public methods *************************************/ |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
60 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
61 CPlayer *CjbmPlayer::factory(Copl *newopl) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
62 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
63 return new CjbmPlayer(newopl); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
64 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
65 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
66 bool CjbmPlayer::load(VFSFile * fd, const CFileProvider & fp) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
67 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
68 binistream *f = fp.open (fd); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
69 std::string filename (fd->uri); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
70 int filelen = fp.filesize(f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
71 int i; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
72 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
73 if (!filelen || !fp.extension(filename, ".jbm")) goto loaderr; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
74 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
75 // Allocate memory buffer m[] and read entire file into it |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
76 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
77 m = new unsigned char[filelen]; |
2239 | 78 if (f->readString((char *)m, filelen) != (unsigned int)filelen) goto loaderr; |
964
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
79 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
80 fp.close(f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
81 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
82 // The known .jbm files always seem to start with the number 0x0002 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
83 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
84 if (GET_WORD(m, 0) != 0x0002) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
85 return false; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
86 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
87 // Song tempo |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
88 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
89 i = GET_WORD(m, 2); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
90 timer = 1193810.0 / (i ? i : 0xffff); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
91 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
92 seqtable = GET_WORD(m, 4); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
93 instable = GET_WORD(m, 6); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
94 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
95 // The flags word has atleast 1 bit, the Adlib's rhythm mode, but |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
96 // currently we don't support that :( |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
97 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
98 flags = GET_WORD(m, 8); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
99 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
100 // Instrument datas are directly addressed with m[] |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
101 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
102 inscount = (filelen - instable) >> 4; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
103 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
104 // Voice' and sequence pointers |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
105 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
106 seqcount = 0xffff; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
107 for (i = 0; i < 11; i++) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
108 voice[i].trkpos = voice[i].trkstart = GET_WORD(m, 10 + (i<<1)); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
109 if (voice[i].trkpos && voice[i].trkpos < seqcount) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
110 seqcount = voice[i].trkpos; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
111 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
112 seqcount = (seqcount - seqtable) >> 1; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
113 sequences = new unsigned short[seqcount]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
114 for (i = 0; i < seqcount; i++) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
115 sequences[i] = GET_WORD(m, seqtable + (i<<1)); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
116 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
117 rewind(0); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
118 return true; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
119 loaderr: |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
120 fp.close(f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
121 return false; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
122 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
123 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
124 bool CjbmPlayer::update() |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
125 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
126 short c, spos, frq; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
127 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
128 for (c = 0; c < 11; c++) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
129 if (!voice[c].trkpos) // Unused channel |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
130 continue; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
131 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
132 if (--voice[c].delay) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
133 continue; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
134 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
135 // Turn current note/percussion off |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
136 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
137 if (voice[c].note&0x7f) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
138 opl_noteonoff(c, &voice[c], 0); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
139 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
140 // Process events until we have a note |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
141 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
142 spos = voice[c].seqpos; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
143 while(!voice[c].delay) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
144 switch(m[spos]) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
145 case 0xFD: // Set Instrument |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
146 voice[c].instr = m[spos+1]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
147 set_opl_instrument(c, &voice[c]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
148 spos+=2; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
149 break; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
150 case 0xFF: // End of Sequence |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
151 voice[c].seqno = m[++voice[c].trkpos]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
152 if (voice[c].seqno == 0xff) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
153 voice[c].trkpos = voice[c].trkstart; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
154 voice[c].seqno = m[voice[c].trkpos]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
155 //voicemask &= 0x7ff-(1<<c); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
156 voicemask &= ~(1<<c); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
157 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
158 spos = voice[c].seqpos = sequences[voice[c].seqno]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
159 break; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
160 default: // Note Event |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
161 if ((m[spos] & 127) > 95) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
162 return 0; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
163 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
164 voice[c].note = m[spos]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
165 voice[c].vol = m[spos+1]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
166 voice[c].delay = |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
167 (m[spos+2] + (m[spos+3]<<8)) + 1; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
168 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
169 frq = notetable[voice[c].note&127]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
170 voice[c].frq[0] = (unsigned char)frq; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
171 voice[c].frq[1] = frq >> 8; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
172 spos+=4; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
173 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
174 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
175 voice[c].seqpos = spos; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
176 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
177 // Write new volume to the carrier operator, or percussion |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
178 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
179 if (flags&1 && c > 6) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
180 opl->write(0x40 + percmx_tab[c-7], voice[c].vol ^ 0x3f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
181 else |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
182 opl->write(0x43 + op_table[c], voice[c].vol ^ 0x3f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
183 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
184 // Write new frequencies and Gate bit |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
185 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
186 opl_noteonoff(c, &voice[c], !(voice[c].note & 0x80)); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
187 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
188 return (voicemask); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
189 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
190 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
191 void CjbmPlayer::rewind(int subsong) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
192 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
193 int c; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
194 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
195 voicemask = 0; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
196 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
197 for (c = 0; c < 11; c++) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
198 voice[c].trkpos = voice[c].trkstart; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
199 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
200 if (!voice[c].trkpos) continue; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
201 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
202 voicemask |= (1<<c); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
203 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
204 voice[c].seqno = m[voice[c].trkpos]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
205 voice[c].seqpos = sequences[voice[c].seqno]; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
206 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
207 voice[c].note = 0; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
208 voice[c].delay = 1; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
209 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
210 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
211 opl->init(); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
212 opl->write(0x01, 32); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
213 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
214 // Set rhythm mode if flags bit #0 is set |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
215 // AM and Vibrato are full depths (taken from DosBox RAW output) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
216 bdreg = 0xC0 | (flags&1)<<5; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
217 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
218 opl->write(0xbd, bdreg); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
219 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
220 #if 0 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
221 if (flags&1) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
222 voice[7].frq[0] = 0x58; voice[7].frq[1] = 0x09; // XXX |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
223 voice[8].frq[0] = 0x04; voice[8].frq[1] = 0x0a; // XXX |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
224 opl_noteonoff(7, &voice[7], 0); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
225 opl_noteonoff(8, &voice[8], 0); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
226 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
227 #endif |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
228 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
229 return; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
230 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
231 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
232 /*** private methods ************************************/ |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
233 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
234 void CjbmPlayer::opl_noteonoff(int channel, JBMVoice *v, bool state) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
235 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
236 if (flags&1 && channel > 5) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
237 // Percussion |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
238 opl->write(0xa0 + perchn_tab[channel-6], voice[channel].frq[0]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
239 opl->write(0xb0 + perchn_tab[channel-6], voice[channel].frq[1]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
240 opl->write(0xbd, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
241 state ? bdreg | percmaskon[channel-6] : |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
242 bdreg & percmaskoff[channel-6]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
243 } else { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
244 // Melodic mode or Rhythm mode melodic channels |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
245 opl->write(0xa0 + channel, voice[channel].frq[0]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
246 opl->write(0xb0 + channel, |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
247 state ? voice[channel].frq[1] | 0x20 : |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
248 voice[channel].frq[1] & 0x1f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
249 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
250 return; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
251 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
252 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
253 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
254 void CjbmPlayer::set_opl_instrument(int channel, JBMVoice *v) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
255 { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
256 short i = instable + (v->instr << 4); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
257 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
258 // Sanity check on instr number - or we'll be reading outside m[] ! |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
259 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
260 if (v->instr >= inscount) |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
261 return; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
262 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
263 // For rhythm mode, multiplexed drums. I don't care about waveforms! |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
264 if ((flags&1) & (channel > 6)) { |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
265 opl->write(0x20 + percmx_tab[channel-7], m[i+0]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
266 opl->write(0x40 + percmx_tab[channel-7], m[i+1] ^ 0x3f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
267 opl->write(0x60 + percmx_tab[channel-7], m[i+2]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
268 opl->write(0x80 + percmx_tab[channel-7], m[i+3]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
269 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
270 opl->write(0xc0 + perchn_tab[channel-6], m[i+8]&15); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
271 return; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
272 } |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
273 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
274 // AM/VIB/EG/KSR/FRQMUL, KSL/OUTPUT, ADSR for 1st operator |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
275 opl->write(0x20 + op_table[channel], m[i+0]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
276 opl->write(0x40 + op_table[channel], m[i+1] ^ 0x3f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
277 opl->write(0x60 + op_table[channel], m[i+2]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
278 opl->write(0x80 + op_table[channel], m[i+3]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
279 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
280 // AM/VIB/EG/KSR/FRQMUL, KSL/OUTPUT, ADSR for 2nd operator |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
281 opl->write(0x23 + op_table[channel], m[i+4]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
282 opl->write(0x43 + op_table[channel], m[i+5] ^ 0x3f); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
283 opl->write(0x63 + op_table[channel], m[i+6]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
284 opl->write(0x83 + op_table[channel], m[i+7]); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
285 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
286 // WAVEFORM for operators |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
287 opl->write(0xe0 + op_table[channel], (m[i+8]>>4)&3); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
288 opl->write(0xe3 + op_table[channel], (m[i+8]>>6)&3); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
289 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
290 // FEEDBACK/FM mode |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
291 opl->write(0xc0 + channel, m[i+8]&15); |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
292 |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
293 return; |
368f8ee0a95f
[svn] Sync with upstream. Subsong improvements for ADL, new JBM player.
chainsaw
parents:
diff
changeset
|
294 } |