comparison minijss/jssmod.c @ 2278:40ccc09f09be

Implement empty channel removal in xm2jss and make JSSMOD format support channel remapping for this.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 Jun 2019 12:12:51 +0300
parents 2f8506171064
children fc58f62f100c
comparison
equal deleted inserted replaced
2277:026c3aa0e48f 2278:40ccc09f09be
341 JSSPattern *pattern; 341 JSSPattern *pattern;
342 JSSNote *pnote; 342 JSSNote *pnote;
343 343
344 // Check arguments 344 // Check arguments
345 if (nrows <= 0 || nchannels <= 0) 345 if (nrows <= 0 || nchannels <= 0)
346 JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%i or nchannels=%i.\n", nrows, nchannels); 346 JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%d or nchannels=%d.\n", nrows, nchannels);
347 347
348 // Allocate a pattern structure 348 // Allocate a pattern structure
349 if ((pattern = dmMalloc0(sizeof(JSSPattern))) == NULL) 349 if ((pattern = dmMalloc0(sizeof(JSSPattern))) == NULL)
350 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern structure.\n"); 350 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern structure.\n");
351 351
352 // Allocate notedata 352 // Allocate notedata
353 pattern->data = dmMalloc(nrows * nchannels * sizeof(JSSNote)); 353 pattern->data = dmMalloc(nrows * nchannels * sizeof(JSSNote));
354 if (pattern->data == NULL) 354 if (pattern->data == NULL)
355 { 355 {
356 dmFree(pattern); 356 jssFreePattern(pattern);
357 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%i, nchannels=%i).\n", nrows, 357 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%d, nchannels=%d).\n",
358 nchannels); 358 nrows, nchannels);
359 } 359 }
360 360
361 // Initialize structure 361 // Initialize structure
362 pattern->nrows = nrows; 362 pattern->nrows = nrows;
363 pattern->nchannels = nchannels; 363 pattern->nchannels = nchannels;
364 pattern->nmap = nchannels;
364 365
365 pnote = pattern->data; 366 pnote = pattern->data;
366 for (int row = 0; row < nrows; row++) 367 for (int row = 0; row < nrows; row++)
367 for (int chn = 0; chn < nchannels; chn++) 368 for (int chn = 0; chn < nchannels; chn++)
368 { 369 {
370 pnote->effect = pnote->param = jsetNotSet; 371 pnote->effect = pnote->param = jsetNotSet;
371 372
372 pnote++; 373 pnote++;
373 } 374 }
374 375
376 // Initialize pattern channel map
377 pattern->map = dmMalloc(nchannels * sizeof(pattern->map[0]));
378 pattern->used = dmMalloc(nchannels * sizeof(pattern->used[0]));
379 if (pattern->map == NULL || pattern->used == NULL)
380 {
381 jssFreePattern(pattern);
382 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern map (nchannels=%d).\n",
383 nchannels);
384 }
385
386 for (int chn = 0; chn < nchannels; chn++)
387 pattern->map[chn] = chn;
388
375 return pattern; 389 return pattern;
376 } 390 }
377 391
378 392
379 void jssFreePattern(JSSPattern *pattern) 393 void jssFreePattern(JSSPattern *pattern)
380 { 394 {
381 if (pattern != NULL) 395 if (pattern != NULL)
382 { 396 {
397 dmFree(pattern->used);
398 dmFree(pattern->map);
383 dmFree(pattern->data); 399 dmFree(pattern->data);
384 dmFree(pattern); 400 dmFree(pattern);
385 } 401 }
386 } 402 }
387 403