File size: 3,227 Bytes
b0bfea8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
import { writeRIFFOddSize } from "../riff_chunk.js";
import { writeDword } from "../../../utils/byte_functions/little_endian.js";
import { combineArrays, IndexedByteArray } from "../../../utils/indexed_array.js";
import { writeLins } from "./lins.js";
import { getStringBytesZero, writeStringAsBytes } from "../../../utils/byte_functions/string.js";
import { writeWavePool } from "./wvpl.js";
import { SpessaSynthGroupCollapsed, SpessaSynthGroupEnd, SpessaSynthInfo } from "../../../utils/loggin.js";
import { consoleColors } from "../../../utils/other.js";
/**
* Write the soundfont as a .dls file. Experimental
* @this {BasicSoundBank}
* @returns {Uint8Array}
*/
export function writeDLS()
{
SpessaSynthGroupCollapsed(
"%cSaving DLS...",
consoleColors.info
);
// write colh
const colhNum = new IndexedByteArray(4);
writeDword(colhNum, this.presets.length);
const colh = writeRIFFOddSize(
"colh",
colhNum
);
SpessaSynthGroupCollapsed(
"%cWriting instruments...",
consoleColors.info
);
const lins = writeLins.apply(this);
SpessaSynthInfo(
"%cSuccess!",
consoleColors.recognized
);
SpessaSynthGroupEnd();
SpessaSynthGroupCollapsed(
"%cWriting WAVE samples...",
consoleColors.info
);
const wavepool = writeWavePool.apply(this);
const wvpl = wavepool.data;
const ptblOffsets = wavepool.indexes;
SpessaSynthInfo("%cSucceeded!", consoleColors.recognized);
SpessaSynthGroupEnd();
// write ptbl
const ptblData = new IndexedByteArray(8 + 4 * ptblOffsets.length);
writeDword(ptblData, 8);
writeDword(ptblData, ptblOffsets.length);
for (const offset of ptblOffsets)
{
writeDword(ptblData, offset);
}
const ptbl = writeRIFFOddSize(
"ptbl",
ptblData
);
this.soundFontInfo["ICMT"] = (this.soundFontInfo["ICMT"] || "Soundfont") + "\nConverted from SF2 to DLS using SpessaSynth";
this.soundFontInfo["ISFT"] = "SpessaSynth";
// write INFO
const infos = [];
for (const [info, data] of Object.entries(this.soundFontInfo))
{
if (
info !== "ICMT" &&
info !== "INAM" &&
info !== "ICRD" &&
info !== "IENG" &&
info !== "ICOP" &&
info !== "ISFT" &&
info !== "ISBJ"
)
{
continue;
}
infos.push(
writeRIFFOddSize(
info,
getStringBytesZero(data),
true
)
);
}
const info = writeRIFFOddSize(
"INFO",
combineArrays(infos),
false,
true
);
const out = new IndexedByteArray(
colh.length
+ lins.length
+ ptbl.length
+ wvpl.length
+ info.length
+ 4);
writeStringAsBytes(out, "DLS ");
out.set(combineArrays([
colh,
lins,
ptbl,
wvpl,
info
]), 4);
SpessaSynthInfo(
"%cSaved succesfully!",
consoleColors.recognized
);
SpessaSynthGroupEnd();
return writeRIFFOddSize(
"RIFF",
out
);
} |