import * as path from 'path' import * as fs from 'fs' import audiosprite, { Channels, ExportType, Logger, LogLevel, VBR, VBR_Vorbis } from 'audiosprite' import { wrapper, TypeOnBody, TypeToolProp, TypeToolOptions } from '@asset-toolkit/core' export interface TypeProps extends TypeToolOptions { output?: string | undefined path?: string | undefined export?: string | undefined format?: ExportType | undefined log?: LogLevel | undefined autoplay?: string | null | undefined loop?: string[] | undefined silence?: number | undefined gap?: number | undefined minlength?: number | undefined bitrate?: number | undefined vbr?: VBR | undefined 'vbr:vorbis'?: VBR_Vorbis | undefined samplerate?: number | undefined channels?: Channels | undefined rawparts?: string | undefined logger?: Logger | undefined } /** * A tool to create sprite audio * @param props - { pathIn, pathOut } * @param options * @returns { Promise(returns) } */ /** * * ### A tool to create a single audio file from more audio files. * Use "format" options to define a type of audiosprite, default is "jukebox" (use with howler.js or pixi-audio) * * https://www.npmjs.com/package/audiosprite * https://howlerjs.com/ * https://pixijs.io/sound/examples/ * * * ### Example * * ```js const { pipeline } = require("@asset-toolkit/core"); const audioSprite = require("@asset-toolkit/audio-sprite"); *``` * * ```js const pipelineAudio = pipeline(audioSprite); pipelineAudio({ pathIn: "./audio/", pathOut: "../public/audio", }); * ``` * @module */ const audioSpriteTool: (_props: TypeToolProp, options?: TypeProps) => Promise = wrapper( ({ file, pathIn, pathOut, wrapperProps, next }) => { if (file.includes('_loop')) { wrapperProps.loop += `${file}, ` } wrapperProps.files.push(path.join(pathIn || pathOut, file)) next() }, ({ pathOut, options, wrapperProps }: TypeOnBody): Promise => { const opts = Object.assign( { output: 'spriteTrack', format: 'jukebox', export: 'mp3,m4a', channels: 2, samplerate: 48000, ignorerounding: 1, loop: wrapperProps.loop, }, options, ) return new Promise(resolve => { audiosprite(wrapperProps.files, opts, (err: any, obj: any) => { if (err) return console.error(err) fs.readdirSync(process.cwd()).forEach(file => { if (file.includes(opts.output)) { fs.rename(file, path.join(pathOut, file), function(err) { if (err) throw err }) } }) fs.writeFileSync(path.join(pathOut, 'tracks.json'), JSON.stringify(obj, null, 2)) resolve(false) }) }) }, { exts: ['mp3'], name: 'Audio Sprite', files: [], loop: '' }, ) export default audioSpriteTool