Mercurial > hg > dmlib
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 |