55#include "dmp_file.h"
66#include "tools.h"
77
8- int dmp_file_load (struct dmp_file * f , uint8_t * data , size_t data_len , int system ) {
8+ void dmp_file_init (struct dmp_file * f ) {
9+ memset (f , 0 , sizeof (* f ));
10+ }
11+
12+ int dmp_file_load (struct dmp_file * f , uint8_t * data , size_t data_len ) {
913 memset (f , 0 , sizeof (struct dmp_file ));
1014
11- if (data [0 ] != 9 ) {
15+ if (data [0 ] < 9 ) {
1216 fprintf (stderr , "Unsupported version 0x%02x (%d)\n" , data [0 ], data [0 ]);
1317 return -1 ;
1418 }
@@ -18,17 +22,34 @@ int dmp_file_load(struct dmp_file *f, uint8_t *data, size_t data_len, int system
1822 return -1 ;
1923 }
2024
25+ f -> system = DMP_SYSTEM_YM2612_OPN ;
2126 f -> version = data [0 ];
22- f -> mode = data [1 ];
27+ if (data [0 ] <= 10 ) {
28+ f -> mode = data [1 ];
29+ } else {
30+ f -> system = data [1 ];
31+ f -> mode = data [2 ];
32+ }
33+
34+ if (f -> system != DMP_SYSTEM_YM2612_OPN && f -> system != DMP_SYSTEM_YM2151_OPM ) {
35+ fprintf (stderr , "Unsupported system %d\n" , f -> system );
36+ return -1 ;
37+ }
2338
2439 if (f -> mode == 1 ) {
2540 uint8_t * p = data + 2 ;
26- f -> num_operators = * p ++ == 0 ? 2 : 4 ;
41+ if (f -> version < 10 ) {
42+ f -> num_operators = * p ++ == 0 ? 2 : 4 ;
43+ } else {
44+ f -> num_operators = 4 ;
45+ }
2746 f -> lfo = * p ++ ;
2847 f -> fb = * p ++ ;
2948 f -> alg = * p ++ ;
30- if (system == DMP_FILE_GENESIS ) {
49+ if (f -> version >= 10 ) {
3150 f -> lfo2 = * p ++ ;
51+ } else {
52+ f -> lfo2 = 0 ;
3253 }
3354
3455 for (int i = 0 ; i < f -> num_operators ; i ++ ) {
@@ -39,7 +60,7 @@ int dmp_file_load(struct dmp_file *f, uint8_t *data, size_t data_len, int system
3960 f -> operators [i ].sl = * p ++ ;
4061 f -> operators [i ].rr = * p ++ ;
4162 f -> operators [i ].am = * p ++ ;
42- if (system == DMP_FILE_GENESIS ) {
63+ if (f -> version >= 10 ) {
4364 f -> operators [i ].ksr = * p ++ ;
4465 f -> operators [i ].dt = * p ++ ;
4566 f -> operators [i ].d2r = * p ++ ;
@@ -54,6 +75,31 @@ int dmp_file_load(struct dmp_file *f, uint8_t *data, size_t data_len, int system
5475 return 0 ;
5576}
5677
78+ int dmp_file_save (struct dmp_file * f , int (* write_fn )(void * , size_t , void * ), void * data_ptr ) {
79+ uint8_t buf [50 ] = { 0 };
80+ uint8_t * p = buf ;
81+ * p ++ = 0x0a ; // version 10
82+ * p ++ = 1 ; // instrument type, 1 = FM
83+ * p ++ = f -> lfo ;
84+ * p ++ = f -> fb ;
85+ * p ++ = f -> alg ;
86+ * p ++ = f -> lfo2 ;
87+ for (int i = 0 ; i < f -> num_operators ; i ++ ) {
88+ * p ++ = f -> operators [i ].mult ;
89+ * p ++ = f -> operators [i ].tl ;
90+ * p ++ = f -> operators [i ].ar ;
91+ * p ++ = f -> operators [i ].dr ;
92+ * p ++ = f -> operators [i ].sl ;
93+ * p ++ = f -> operators [i ].rr ;
94+ * p ++ = f -> operators [i ].am ;
95+ * p ++ = f -> operators [i ].ksr ;
96+ * p ++ = f -> operators [i ].dt ;
97+ * p ++ = f -> operators [i ].d2r ;
98+ * p ++ = f -> operators [i ].ssg ;
99+ }
100+ return write_fn (buf , 50 , data_ptr );
101+ }
102+
57103#ifdef HAVE_STDIO
58104void dmp_file_dump (struct dmp_file * dmp ) {
59105 printf ("version=%d mode=%d\n" , dmp -> version , dmp -> mode );
@@ -85,11 +131,55 @@ void dmp_file_dump(struct dmp_file *dmp) {
85131#include "loader.h"
86132
87133static int load (void * data , int data_len , struct fm_voice_bank * bank ) {
88- return -1 ;
134+ struct dmp_file f ;
135+ int r = dmp_file_load (& f , (uint8_t * )data , data_len );
136+ if (r ) return r ;
137+ struct opn_voice * voice = fm_voice_bank_reserve_opn_voices (bank , 1 );
138+ if (!voice ) return -1 ;
139+ voice -> slot = 0x0f ;
140+ voice -> fb_con = (f .fb & 0x07 ) << 3 | (f .alg & 0x07 );
141+ voice -> lr_ams_pms = (f .lfo & 0x07 ) << 4 | (f .lfo2 & 0x03 );
142+ for (int i = 0 ; i < f .num_operators ; i ++ ) {
143+ struct opn_voice_operator * op = & voice -> operators [i ];
144+ struct dmp_file_operator * fop = & f .operators [i ];
145+ op -> dt_mul = (fop -> dt & 0x07 ) << 3 | (fop -> mult & 0x07 );
146+ op -> tl = fop -> tl & 0x7f ;
147+ op -> ks_ar = fop -> ksr << 6 | (fop -> ar & 0x1f );
148+ op -> am_dr = fop -> dr & 0x1f ;
149+ op -> sr = fop -> d2r ;
150+ op -> sl_rr = fop -> sl << 4 | (fop -> rr & 0x0f );
151+ op -> ssg_eg = fop -> ssg ;
152+ }
153+ return 0 ;
89154}
90155
91156static int save (struct fm_voice_bank * bank , struct fm_voice_bank_position * pos , int (* write_fn )(void * , size_t , void * ), void * data_ptr ) {
92- return -1 ;
157+ if (bank -> num_opn_voices <= pos -> opn ) return -1 ;
158+ struct dmp_file f ;
159+ dmp_file_init (& f );
160+ struct opn_voice * voice = & bank -> opn_voices [pos -> opn ];
161+ if (!voice ) return -1 ;
162+
163+ f .fb = opn_voice_get_fb (voice );
164+ f .alg = opn_voice_get_con (voice );
165+ f .lfo = opn_voice_get_ams (voice );
166+ f .lfo2 = opn_voice_get_pms (voice );
167+ for (int i = 0 ; i < 4 ; i ++ ) {
168+ struct dmp_file_operator * fop = & f .operators [i ];
169+ fop -> dt = opn_voice_get_operator_dt (voice , i );
170+ fop -> mult = opn_voice_get_operator_mul (voice , i );
171+ fop -> tl = opn_voice_get_operator_tl (voice , i );
172+ fop -> ksr = opn_voice_get_operator_ks (voice , i );
173+ fop -> ar = opn_voice_get_operator_ar (voice , i );
174+ fop -> dr = opn_voice_get_operator_dr (voice , i );
175+ fop -> am = opn_voice_get_operator_am (voice , i );
176+ fop -> d2r = opn_voice_get_operator_sr (voice , i );
177+ fop -> sl = opn_voice_get_operator_sl (voice , i );
178+ fop -> rr = opn_voice_get_operator_rr (voice , i );
179+ fop -> ssg = opn_voice_get_operator_ssg_eg (voice , i );
180+ }
181+ pos -> opn ++ ;
182+ return dmp_file_save (& f , write_fn , data_ptr );
93183}
94184
95185struct loader dmp_file_loader = {
@@ -98,8 +188,8 @@ struct loader dmp_file_loader = {
98188 .name = "DMP" ,
99189 .description = "DefleMask Preset Format" ,
100190 .file_ext = "dmp" ,
101- .max_opl_voices = 1 ,
191+ .max_opl_voices = 0 ,
102192 .max_opm_voices = 0 ,
103- .max_opn_voices = 0 ,
193+ .max_opn_voices = 1 ,
104194};
105195#endif
0 commit comments