Initial commit: akai-fetch - AKAI sampler ISO downloader & extractor
- fetch: Go CLI tool for searching, downloading, and extracting AKAI sampler ISOs from archive.org - scripts/extract_wavs.sh: Shell script driving akaiutil to convert samples to WAV - Dockerfile: Multi-stage build packaging akaiutil + fetch - third_party/akaiutil: Vendored akaiutil v4.6.7 source (GPLv2) - docs/akaiutil.md: Full akaiutil reference
This commit is contained in:
+563
@@ -0,0 +1,563 @@
|
||||
#ifndef __AKAIUTIL_FILE_H
|
||||
#define __AKAIUTIL_FILE_H
|
||||
/*
|
||||
* Copyright (C) 2010,2012,2018,2019,2020 Klaus Michael Indlekofer. All rights reserved.
|
||||
*
|
||||
* m.indlekofer@gmx.de
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "commoninclude.h"
|
||||
#include "akaiutil.h"
|
||||
|
||||
|
||||
|
||||
/* AKAI files */
|
||||
|
||||
/* Note: all data types are little endian */
|
||||
|
||||
|
||||
|
||||
/* AKAI file type ranges */
|
||||
#define AKAI_S900_FTYPE_MIN 'A' /* min. file type for S900 */
|
||||
#define AKAI_S900_FTYPE_MAX 'Z' /* max. file type for S900 */
|
||||
#define AKAI_S1000_FTYPE_MIN 'a' /* min. file type for S1000 */
|
||||
#define AKAI_S1000_FTYPE_MAX 'z' /* max. file type for S1000 */
|
||||
#define AKAI_S3000_FTYPE_MIN ('a'+0x80) /* min. file type for S3000 */
|
||||
#define AKAI_S3000_FTYPE_MAX ('z'+0x80) /* max. file type for S3000 */
|
||||
/* Note: exception: AKAI_CDSETUP3000_FTYPE=='T' is within range of file types for S900 */
|
||||
|
||||
|
||||
|
||||
/* AKAI S900 sample header */
|
||||
struct akai_sample900_s{
|
||||
char name[AKAI_NAME_LEN_S900]; /* sample name (in RAM) */
|
||||
u_char dummy1[6]; /* XXX 0x00 */
|
||||
u_char slen[4]; /* number of samples */
|
||||
u_char srate[2]; /* sample rate in Hz */
|
||||
#define SAMPLE900_NPITCH_DEF (60*16) /* default */
|
||||
u_char npitch[2]; /* nominal pitch in 1/16 semitones */
|
||||
u_char loud[2]; /* loudness offset (signed) */
|
||||
#define SAMPLE900_PMODE_ONESHOT 'O'
|
||||
#define SAMPLE900_PMODE_LOOP 'L'
|
||||
#define SAMPLE900_PMODE_ALTLOOP 'A'
|
||||
u_char pmode; /* playback mode */
|
||||
u_char dummy2; /* XXX */
|
||||
u_char end[4]; /* end marker */
|
||||
u_char start[4]; /* start marker */
|
||||
u_char llen[4]; /* loop length */
|
||||
u_char dmadesa[2]; /* address of DMA descriptor list (updated by sampler) */
|
||||
#define SAMPLE900_TYPE_NORM 0x00 /* normal */
|
||||
#define SAMPLE900_TYPE_VELXF 0xff /* velocity crossfade */
|
||||
u_char type; /* sample type */
|
||||
#define SAMPLE900_DIR_NORM 'N'
|
||||
#define SAMPLE900_DIR_REV 'R'
|
||||
u_char dir; /* time direction */
|
||||
u_char dummy3[10]; /* XXX */
|
||||
u_char locat[4]; /* absolute address (updated by sampler) */
|
||||
u_char dummy4[2]; /* XXX */
|
||||
}; /* Note: should be 0x003c Bytes */
|
||||
/* Note: header is followed by sample data (in non-compressed or compressed sample format) */
|
||||
|
||||
/* S900 compressed sample format */
|
||||
#define SAMPLE900COMPR_GROUP_SAMPNUM 10 /* number of samples per group */
|
||||
#define SAMPLE900COMPR_UPBITNUM_NEGCODE_OFF 16 /* offset between bit number for upabsval and -code */
|
||||
#define SAMPLE900COMPR_UPBITNUM_MAX 12 /* max. bit number to be used for upabsval */
|
||||
#define SAMPLE900COMPR_INTERVALSIZ (1<<SAMPLE900COMPR_UPBITNUM_MAX) /* interval size for max. bit number */
|
||||
#define SAMPLE900COMPR_BITMASK (SAMPLE900COMPR_INTERVALSIZ-1) /* bit mask for interval */
|
||||
#define SAMPLE900COMPR_INTERVALSIZ2 (SAMPLE900COMPR_INTERVALSIZ>>1) /* half interval size */
|
||||
|
||||
#define AKAI_SAMPLE900_FTYPE 'S' /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S900 program header */
|
||||
struct akai_program900_s{
|
||||
char name[AKAI_NAME_LEN_S900]; /* program name (in RAM) */
|
||||
u_char dummy1[6]; /* XXX 0x00 */
|
||||
u_char dummy2[2]; /* XXX */
|
||||
#define PROGRAM900_KGA_NONE 0x0000 /* value for none */
|
||||
u_char kg1a[2]; /* address of keygroup 1 (updated by sampler) */
|
||||
u_char dummy3; /* XXX */
|
||||
u_char kgxf; /* keygroup (positional) crossfade enable */
|
||||
u_char dummy4; /* XXX */
|
||||
u_char kgnum; /* number of keygroups */
|
||||
u_char dummy5[14]; /* XXX */
|
||||
}; /* Note: should be 0x0026 Bytes */
|
||||
/* Note: header is followed by keygroups */
|
||||
|
||||
/* AKAI S900 program: keygroup */
|
||||
struct akai_program900kg_s{
|
||||
u_char keyhi; /* high MIDI key */
|
||||
u_char keylo; /* low MIDI key */
|
||||
#define PROGRAM900KG_VELSWTH_NOSOFT 0 /* value for no soft sample */
|
||||
#define PROGRAM900KG_VELSWTH_NOLOUD 128 /* value for no loud sample */
|
||||
u_char velswth; /* velocity switch threshold */
|
||||
u_char dummy1[15]; /* XXX */
|
||||
#define PROGRAM900KG_FLAGS_PCONST 0x01 /* constant pitch enable */
|
||||
#define PROGRAM900KG_FLAGS_VELXF 0x02 /* velocity crossfade enable */
|
||||
#define PROGRAM900KG_FLAGS_ONESHOT 0x08 /* one-shot trigger mode enable */
|
||||
u_char flags; /* flags */
|
||||
#define PROGRAM900KG_OUTCH1_LEFT 0x08 /* code for LEFT */
|
||||
#define PROGRAM900KG_OUTCH1_RIGHT 0x09 /* code for RIGHT */
|
||||
#define PROGRAM900KG_OUTCH1_ANY 0xff /* code for ANY */
|
||||
u_char outch1; /* audio output channel: channel number-1 or code */
|
||||
u_char midichoff; /* MIDI channel offset */
|
||||
u_char dummy2[3]; /* XXX */
|
||||
u_char sname1[AKAI_NAME_LEN_S900]; /* sample name (in RAM) for sample 1 ("soft") */
|
||||
u_char dummy3[4]; /* XXX */
|
||||
u_char velxfv50; /* if velocity crossfade: velocity value for 50% */
|
||||
u_char dummy4; /* XXX */
|
||||
#define PROGRAM900KG_SHDRA_NONE 0x0000 /* value for none */
|
||||
u_char shdra1[2]; /* address of sample header for sample 1 (updated by sampler) */
|
||||
u_char tune1[2]; /* tuning offset (transpose) in 1/16 semitones (signed) for sample 1 */
|
||||
u_char filter1; /* filter for sample 1 */
|
||||
u_char loud1; /* loudness offset (signed) for sample 1 */
|
||||
u_char sname2[AKAI_NAME_LEN_S900]; /* sample name (in RAM) for sample 2 ("loud") */
|
||||
u_char dummy5[6]; /* XXX */
|
||||
u_char shdra2[2]; /* address of sample header for sample 2 (updated by sampler) */
|
||||
u_char tune2[2]; /* tuning offset in 1/16 semitones (signed) for sample 2 */
|
||||
u_char filter2; /* filter for sample 2 */
|
||||
u_char loud2; /* loudness offset (signed) for sample 2 */
|
||||
u_char kgnexta[2]; /* address of next keygroup (updated by sampler) */
|
||||
}; /* Note: should be 0x0046 Bytes */
|
||||
|
||||
#define AKAI_PROGRAM900_FTYPE 'P' /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S900/S950 drum settings descriptor */
|
||||
struct akai_drum900des_s{
|
||||
u_char inpnr1; /* input number-1 */
|
||||
u_char midich1; /* MIDI channel-1 */
|
||||
u_char midinote; /* MIDI note */
|
||||
u_char gain; /* gain */
|
||||
u_char ask90_trig; /* if ASK90: trigger threshold */
|
||||
/* if ME35T: (ignored) */
|
||||
u_char dummy1[3]; /* XXX */
|
||||
#define DRUM900DES_ITYPE_ASK90 0x00 /* interface type: ASK90 */
|
||||
#define DRUM900DES_ITYPE_ME35T 0xff /* interface type: ME35T */
|
||||
u_char itype; /* interface type */
|
||||
u_char me35t_trig; /* if ASK90: (ignored) */
|
||||
/* if ME35T: trigger threshold */
|
||||
u_char me35t_vcurv1; /* if ASK90: (ignored) */
|
||||
/* if ME35T: "V-curve"-1 */
|
||||
u_char dummy2; /* XXX */
|
||||
u_char captt4[2]; /* 4* capture time in msec */
|
||||
u_char ontime4[2]; /* 4* on-time in msec */
|
||||
u_char recovt4[2]; /* 4* recovery time in msec */
|
||||
u_char dummy3[8];
|
||||
u_char ask90_resba[2]; /* if ASK90: ASK90 base address for CH RESET */
|
||||
/* if ME35T: (ignored) */
|
||||
u_char ask90_adcla[2]; /* if ASK90: ASK90 address for ADC latch */
|
||||
/* if ME35T: (ignored) */
|
||||
}; /* Note: should be 0x001e Bytes */
|
||||
|
||||
/* AKAI S900/S950 drum settings file */
|
||||
struct akai_drum900_s{
|
||||
u_char ask90enab; /* if ASK90: ASK90 enable */
|
||||
/* if ME35T: (ignored) */
|
||||
u_char ask90sens; /* if ASK90: ASK90 sensitivity */
|
||||
/* if ME35T: (ignored) */
|
||||
u_char dummy1[20]; /* XXX 0x00 ... 0x00 */
|
||||
#define DRUM900_INPUTNUM 8 /* number of drum trigger inputs */
|
||||
struct akai_drum900des_s ddes[DRUM900_INPUTNUM]; /* drum setting descriptors */
|
||||
}; /* Note: should be 0x0106 Bytes */
|
||||
|
||||
#define AKAI_DRUM900_FTYPE 'D' /* file type */
|
||||
#define AKAI_DRUM900_FNAME "DRUM SET " /* default file name */
|
||||
|
||||
|
||||
|
||||
/* AKAI S900 overall settings file */
|
||||
struct akai_ovs900_s{
|
||||
char progname[AKAI_NAME_LEN_S900]; /* selected program name */
|
||||
u_char dummy1[6]; /* XXX 0x20 ... 0x20 */
|
||||
u_char dummy2[4]; /* XXX */
|
||||
u_char testmidich[2]; /* test MIDI channel */
|
||||
u_char testmidikey[2]; /* test MIDI key */
|
||||
u_char testmidivel[2]; /* test MIDI velocity */
|
||||
u_char dummy3; /* XXX */
|
||||
#define OVS900_BMIDICH1MASK 0x7f /* bit mask for basic MIDI channel-1 */
|
||||
#define OVS900_OMNIMASK 0x80 /* bit mask for OMNI flag */
|
||||
u_char bmidich1omni; /* basic MIDI channel-1 | OMNI flag */
|
||||
u_char loudness; /* loudness enable */
|
||||
#define OVS900_CTRLPORT_MIDI 0x01 /* control port: MIDI */
|
||||
#define OVS900_CTRLPORT_RS232 0x02 /* control port: RS232 */
|
||||
u_char ctrlport; /* control port */
|
||||
u_char progchange; /* program change enable */
|
||||
u_char dummy4[4]; /* XXX */
|
||||
u_char pwheelrange; /* pitch wheel range */
|
||||
u_char rs232brate10[2]; /* RS232 baudrate/10 */
|
||||
u_char dummy5[2]; /* XXX */
|
||||
}; /* Note: should be 0x0028 Bytes */
|
||||
|
||||
#define AKAI_OVS900_FTYPE 'O' /* file type */
|
||||
#define AKAI_OVS900_FNAME "OVERALL SE" /* default file name */
|
||||
|
||||
|
||||
|
||||
/* AKAI S900 fixup file */
|
||||
#define AKAI_FIXUP900_FTYPE 'F' /* file type */
|
||||
|
||||
/* AKAI S900 memory image file */
|
||||
#define AKAI_MEMIMG900_FTYPE 'M' /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 empty file name */
|
||||
#define AKAI_EMPTY1000_FNAME "VVVVVVVVVVVV" /* S1000 empty file name */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 generic header */
|
||||
struct akai_genfilehdr_s{
|
||||
u_char blockid; /* block ID */
|
||||
u_char dummy1[2]; /* XXX */
|
||||
u_char name[AKAI_NAME_LEN]; /* file name (in RAM) */
|
||||
}; /* Note: should be 0x000f Bytes */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 sample loop parameters */
|
||||
struct akai_sample1000loop_s{
|
||||
u_char at[4]; /* loop at marker */
|
||||
u_char flen[2]; /* loop fine length in 1/65536 sample */
|
||||
u_char len[4]; /* loop length in samples */
|
||||
#define SAMPLE1000LOOP_TIME_NOLOOP 0 /* value for NOLOOP */
|
||||
#define SAMPLE1000LOOP_TIME_HOLD 9999 /* value for HOLD */
|
||||
u_char time[2]; /* loop time in msec */
|
||||
};
|
||||
|
||||
/* AKAI S1000 sample header */
|
||||
struct akai_sample1000_s{
|
||||
#define SAMPLE1000_BLOCKID 0x03
|
||||
u_char blockid; /* block ID */
|
||||
#define SAMPLE1000_BANDW_10KHZ 0x00
|
||||
#define SAMPLE1000_BANDW_20KHZ 0x01
|
||||
u_char bandw; /* bandwidth select */
|
||||
u_char rkey; /* MIDI root key (typ. 0x3c) */
|
||||
u_char name[AKAI_NAME_LEN]; /* sample name (in RAM) */
|
||||
u_char dummy1; /* XXX 0x80 */
|
||||
u_char lnum; /* number of loops */
|
||||
u_char lfirst; /* first active loop-1 */
|
||||
u_char dummy2; /* XXX 0x00 */
|
||||
#define SAMPLE1000_PMODE_LOOP 0x00
|
||||
#define SAMPLE1000_PMODE_LOOPNOTREL 0x01
|
||||
#define SAMPLE1000_PMODE_NOLOOP 0x02
|
||||
#define SAMPLE1000_PMODE_TOEND 0x03
|
||||
u_char pmode; /* playback mode */
|
||||
u_char ctune; /* cents tune (signed) */
|
||||
u_char stune; /* semitone tune (signed) */
|
||||
u_char locat[4]; /* absolute address (updated by sampler) */
|
||||
u_char slen[4]; /* number of samples */
|
||||
u_char start[4]; /* start marker */
|
||||
u_char end[4]; /* end marker */
|
||||
#define AKAI_SAMPLE1000_LOOPNUM 8
|
||||
struct akai_sample1000loop_s loop[AKAI_SAMPLE1000_LOOPNUM];
|
||||
u_char dummy3[2]; /* XXX 0x00 0x00 */
|
||||
#define AKAI_SAMPLE1000_STPAIRA_NONE 0xffff /* value for none */
|
||||
u_char stpaira[2]; /* address of sample header of partner in stereo pair (updated by sampler) */
|
||||
u_char srate[2]; /* sample rate in Hz */
|
||||
u_char hltoff; /* HOLD loop tune offset */
|
||||
u_char dummy4[9]; /* XXX 0x00 ... 0x00 */
|
||||
}; /* Note: should be 0x0096 Bytes */
|
||||
/* Note: header is followed by sample data */
|
||||
|
||||
#define AKAI_SAMPLE1000_FTYPE 's' /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S3000 sample header */
|
||||
struct akai_sample3000_s{
|
||||
#define SAMPLE3000_BLOCKID SAMPLE1000_BLOCKID
|
||||
struct akai_sample1000_s s1000;
|
||||
u_char dummy1[42]; /* XXX 0x00 ... 0x00 */
|
||||
}; /* Note: should be 0x00c0 Bytes */
|
||||
/* Note: header is followed by sample data */
|
||||
|
||||
/* address multiplicand */
|
||||
#define SAMPLE3000_STPAIRA_MULT 0x10
|
||||
|
||||
#define AKAI_SAMPLE3000_FTYPE ('s'+0x80) /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI CD3000 CD-ROM sample parameters file */
|
||||
/* Note: contains S3000 sample header */
|
||||
#define AKAI_CDSAMPLE3000_FTYPE ('h'+0x80) /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 program header */
|
||||
struct akai_program1000_s{
|
||||
#define PROGRAM1000_BLOCKID 0x01
|
||||
u_char blockid; /* block ID */
|
||||
#define PROGRAM1000_KGA_NONE 0x0000 /* value for none */
|
||||
u_char kg1a[2]; /* address of keygroup 1 (updated by sampler) */
|
||||
u_char name[AKAI_NAME_LEN]; /* program name (in RAM) */
|
||||
u_char dummy1; /* XXX */
|
||||
#define PROGRAM1000_MIDICH1_OMNI 0xff /* code for OMNI */
|
||||
u_char midich1; /* MIDI channel number-1 or code */
|
||||
u_char dummy2[2]; /* XXX */
|
||||
u_char keylo; /* low MIDI key */
|
||||
u_char keyhi; /* high MIDI key */
|
||||
u_char oct; /* octave offset (signed) */
|
||||
#define PROGRAM1000_AUXCH1_OFF 0xff /* code for OFF */
|
||||
u_char auxch1; /* aux output channel number-1 or code */
|
||||
u_char dummy3[18]; /* XXX */
|
||||
u_char kgxf; /* keygroup crossfade enable */
|
||||
u_char kgnum; /* number of keygroups */
|
||||
u_char dummy4[107]; /* XXX */
|
||||
}; /* Note: should be 0x0096 Bytes */
|
||||
/* Note: header is followed by keygroups */
|
||||
|
||||
/* AKAI S1000 program keygroup: velocity zone */
|
||||
struct akai_program1000kgvelzone_s{
|
||||
u_char sname[AKAI_NAME_LEN]; /* sample name (in RAM) */
|
||||
u_char vello; /* low MIDI velocity */
|
||||
u_char velhi; /* high MIDI velocity */
|
||||
u_char ctune; /* cents tune offset (signed) */
|
||||
u_char stune; /* semitone tune offset (signed) */
|
||||
u_char loud; /* loudness offset (signed) */
|
||||
u_char filter; /* filter offset (signed) */
|
||||
u_char pan; /* pan offset (signed) */
|
||||
#define PROGRAM1000_PMODE_SAMPLE 0x00
|
||||
#define PROGRAM1000_PMODE_LOOP 0x01
|
||||
#define PROGRAM1000_PMODE_LOOPNOTREL 0x02
|
||||
#define PROGRAM1000_PMODE_NOLOOP 0x03
|
||||
#define PROGRAM1000_PMODE_TOEND 0x04
|
||||
u_char pmode; /* playback mode */
|
||||
u_char dummy1[2]; /* XXX */
|
||||
#define PROGRAM1000KG_SHDRA_NONE 0xffff /* value for none */
|
||||
u_char shdra[2]; /* address of sample header (updated by sampler) */
|
||||
}; /* Note: should be 0x0018 Bytes */
|
||||
|
||||
/* AKAI S1000 program: keygroup */
|
||||
struct akai_program1000kg_s{
|
||||
#define PROGRAM1000KG_BLOCKID 0x02
|
||||
u_char blockid; /* block ID */
|
||||
u_char kgnexta[2]; /* address of next keygroup (updated by sampler) */
|
||||
u_char keylo; /* low MIDI key */
|
||||
u_char keyhi; /* high MIDI key */
|
||||
u_char ctune; /* cents tune offset (signed) */
|
||||
u_char stune; /* semitone tune offset (signed) */
|
||||
u_char filter; /* filter */
|
||||
u_char dummy1[22]; /* XXX */
|
||||
u_char velxf; /* velocity crossfade enable */
|
||||
u_char dummy2[3]; /* XXX */
|
||||
#define PROGRAM1000KG_VELZONENUM 4 /* number of velocity zones per keygroup */
|
||||
struct akai_program1000kgvelzone_s velzone[PROGRAM1000KG_VELZONENUM]; /* velocity zones */
|
||||
u_char dummy3[2]; /* XXX */
|
||||
u_char pconst[PROGRAM1000KG_VELZONENUM]; /* constant pitch enable for velocity zones */
|
||||
u_char auxchoff[PROGRAM1000KG_VELZONENUM]; /* aux output channel offsets for velocity zones */
|
||||
u_char dummy4[10]; /* XXX */
|
||||
}; /* Note: should be 0x0096 Bytes */
|
||||
|
||||
#define AKAI_PROGRAM1000_FTYPE 'p' /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S3000 program header */
|
||||
struct akai_program3000_s{
|
||||
#define PROGRAM3000_BLOCKID PROGRAM1000_BLOCKID
|
||||
struct akai_program1000_s s1000;
|
||||
u_char dummy1[42]; /* XXX */
|
||||
}; /* Note: should be 0x00c0 Bytes */
|
||||
/* Note: header is followed by keygroups */
|
||||
|
||||
/* AKAI S3000 program: keygroup */
|
||||
struct akai_program3000kg_s{
|
||||
#define PROGRAM3000KG_BLOCKID PROGRAM1000KG_BLOCKID
|
||||
struct akai_program1000kg_s s1000;
|
||||
u_char dummy1[42]; /* XXX */
|
||||
}; /* Note: should be 0x00c0 Bytes */
|
||||
|
||||
/* address multiplicands */
|
||||
#define PROGRAM3000_KGA_MULT 0x10
|
||||
#define PROGRAM3000_SHDRA_MULT 0x10
|
||||
|
||||
#define AKAI_PROGRAM3000_FTYPE ('p'+0x80) /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 or S3000 drum settings descriptor */
|
||||
struct akai_drum1000des_s{
|
||||
u_char midich1; /* MIDI channel-1 */
|
||||
u_char midinote; /* MIDI note */
|
||||
u_char sens; /* sensitivity level */
|
||||
u_char trig; /* trigger level */
|
||||
u_char vcurv1; /* "V-curve"-1 */
|
||||
u_char captt; /* capture time in msec */
|
||||
u_char recovt; /* recovery time in msec */
|
||||
u_char ontime; /* on-time in msec */
|
||||
u_char dummy1; /* XXX */
|
||||
}; /* Note: should be 0x0009 Bytes */
|
||||
|
||||
/* AKAI S1000 or S3000 drum settings file */
|
||||
struct akai_drum1000_s{
|
||||
#define DRUM1000_BLOCKID 0x01
|
||||
u_char blockid; /* block ID */
|
||||
u_char dummy1[2]; /* XXX */
|
||||
u_char name[AKAI_NAME_LEN]; /* drum settings name (in RAM) */
|
||||
#define DRUM1000_UNITNUM 2 /* number of units */
|
||||
#define DRUM1000_INPUTNUM 8 /* number of drum trigger inputs per unit */
|
||||
struct akai_drum1000des_s ddes1[DRUM1000_INPUTNUM]; /* drum setting descriptors for unit 1 */
|
||||
u_char dummy2[3]; /* XXX */
|
||||
struct akai_drum1000des_s ddes2[DRUM1000_INPUTNUM]; /* drum setting descriptors for unit 2 */
|
||||
}; /* Note: should be 0x00a2 Bytes */
|
||||
|
||||
#define AKAI_DRUM1000_FTYPE 'd' /* file type */
|
||||
#define AKAI_DRUM1000_FNAME "DRUM INPUTS " /* default file name */
|
||||
|
||||
|
||||
|
||||
/* AKAI S1100 or S3000 or S3000XL effects file */
|
||||
/* Note: effects files of different system types are incompatible */
|
||||
#define AKAI_FXFILE_FTYPE 'x' /* file type */
|
||||
#define AKAI_FXFILE_FNAME "EFFECTS FILE" /* default file name */
|
||||
#define AKAI_FXFILE_FSIZE 0x1c90 /* default file size */
|
||||
#define FXFILE1100_BLOCKID 0x00
|
||||
#define FXFILE3000_BLOCKID 0x00
|
||||
#define FXFILE3000XL_BLOCKID 0x02
|
||||
|
||||
|
||||
|
||||
/* AKAI S1100 or S3000 cue/take-list header */
|
||||
struct akai_cuelist_s{
|
||||
#define CUELIST_BLOCKID 0x00
|
||||
u_char blockid; /* block ID */
|
||||
u_char dummy1[2]; /* XXX */
|
||||
u_char name[AKAI_NAME_LEN]; /* cue/take-list name (in RAM) */
|
||||
u_char dummy2[7]; /* XXX */
|
||||
u_char cuenum; /* number of cues */
|
||||
u_char dummy3[105]; /* XXX */
|
||||
}; /* Note: should be 0x0080 Bytes */
|
||||
/* Note: header is followed by cues */
|
||||
|
||||
/* AKAI S1100 or S3000 cue */
|
||||
/* Note: depending on file/cue type, some struct elements are ignored */
|
||||
struct akai_cue_s{
|
||||
u_char name[AKAI_NAME_LEN]; /* program or take name */
|
||||
u_char time[5]; /* time (BCD format) */
|
||||
#define AKAI_CUETYPE_MOFF 0x00 /* program: MIDI note off */
|
||||
#define AKAI_CUETYPE_MON 0x01 /* program: MIDI note on */
|
||||
#define AKAI_CUETYPE_TOFF 0x02 /* DD take: off */
|
||||
#define AKAI_CUETYPE_TON 0x03 /* DD take: on */
|
||||
u_char type; /* cue type */
|
||||
u_char midinote; /* MIDI note */
|
||||
u_char midivel; /* MIDI velocity */
|
||||
u_char pan; /* panning (signed) */
|
||||
u_char stlvl; /* stereo output level */
|
||||
u_char midich1; /* MIDI channel-1 */
|
||||
u_char repeat1; /* repeat count-1 */
|
||||
u_char fadein[2]; /* fade in time in ms */
|
||||
u_char fadeout[2]; /* fade out time in ms */
|
||||
u_char dummy1[4]; /* XXX */
|
||||
}; /* Note: should be 0x0020 Bytes */
|
||||
|
||||
#define AKAI_QLFILE_FTYPE 'q' /* cue-list file type */
|
||||
#define AKAI_QLFILE_FNAME "QL1 " /* default cue-list file name */
|
||||
|
||||
#define AKAI_TLFILE_FTYPE 't' /* take-list file type */
|
||||
#define AKAI_TLFILE_FNAME "TL1 " /* default take-list file name */
|
||||
|
||||
|
||||
|
||||
/* AKAI S3000 multi file */
|
||||
#define AKAI_MULTI3000_FTYPE ('m'+0x80) /* file type */
|
||||
#define AKAI_MULTI3000_FNAME "MULTI FILE " /* default file name */
|
||||
#define MULTI3000_BLOCKID 0x00
|
||||
|
||||
|
||||
|
||||
/* AKAI S1000 operating system file */
|
||||
#define AKAI_SYS1000_FTYPE 'c' /* file type */
|
||||
|
||||
/* AKAI S3000 operating system file */
|
||||
#define AKAI_SYS3000_FTYPE ('c'+0x80) /* file type */
|
||||
|
||||
|
||||
|
||||
/* AKAI CD3000 CD-ROM setup header */
|
||||
/* Note: generic file header does not apply for this file type! */
|
||||
struct akai_cdsetup3000_s{
|
||||
u_char name[AKAI_NAME_LEN]; /* CD-ROM setup name (in RAM) */
|
||||
u_char dummy1[3]; /* XXX */
|
||||
u_char cdlabel[AKAI_NAME_LEN]; /* CD-ROM label */
|
||||
}; /* Note: should be 0x006b Bytes */
|
||||
/* followed by marked file entries */
|
||||
|
||||
/* marked file entry */
|
||||
struct akai_cdsetup3000_entry_s{
|
||||
u_char parti; /* partition index */
|
||||
u_char voli; /* volume index */
|
||||
u_char filei[2]; /* file index */
|
||||
}; /* Note: should be 4 Bytes */
|
||||
/* Note: unused entry is 0xff 0xff 0xff 0xff */
|
||||
|
||||
#define AKAI_CDSETUP3000_FTYPE 'T' /* file type */
|
||||
/* Note: AKAI_CDSETUP3000_FTYPE is within range of file types for S900 */
|
||||
#define AKAI_CDSETUP3000_FNAME "NEW CD SETUP" /* default file name */
|
||||
|
||||
|
||||
|
||||
/* Declarations */
|
||||
|
||||
extern int akai_file_info(struct file_s *fp,int verbose);
|
||||
extern void akai_sample_info(struct file_s *fp,u_char *hdrp);
|
||||
extern int akai_program_info(struct file_s *fp);
|
||||
extern int akai_cuelist_info(struct file_s *fp);
|
||||
extern int akai_takelist_info(struct file_s *fp);
|
||||
extern int akai_drum1000_info(struct file_s *fp);
|
||||
extern int akai_drum900_info(struct file_s *fp);
|
||||
extern int akai_ovs900_info(struct file_s *fp);
|
||||
extern int akai_cdsetup3000_info(struct file_s *fp);
|
||||
|
||||
extern int akai_fixramname(struct file_s *fp);
|
||||
|
||||
extern int akai_s900comprfile_updateuncompr(struct file_s *fp);
|
||||
|
||||
extern u_int akai_sample900_getsamplesize(struct file_s *fp);
|
||||
|
||||
extern void akai_sample900noncompr_sample2wav(u_char *sbuf,u_char *wavbuf,u_int samplecountpart);
|
||||
extern void akai_sample900noncompr_wav2sample(u_char *sbuf,u_char *wavbuf,u_int samplecountpart);
|
||||
|
||||
extern u_int akai_sample900compr_getbits(u_char *buf,u_int bitpos,u_int bitnum);
|
||||
extern u_int akai_sample900compr_sample2wav(u_char *sbuf,u_char *wavbuf,u_int sbufsiz,u_int wavbufsiz);
|
||||
extern void akai_sample900compr_setbits(u_char *buf,u_int bitpos,u_int bitnum,u_int val);
|
||||
extern int akai_sample900compr_wav2sample(u_char *sbuf,u_char *wavbuf,u_int samplecountpart);
|
||||
|
||||
extern int akai_sample900_noncompr2compr(struct file_s *fp,struct vol_s *volp);
|
||||
extern int akai_sample900_compr2noncompr(struct file_s *fp,struct vol_s *volp);
|
||||
|
||||
#define SAMPLE2WAV_CHECK 1
|
||||
#define SAMPLE2WAV_EXPORT 2
|
||||
#define SAMPLE2WAV_CREATE 4
|
||||
#define SAMPLE2WAV_ALL 0xff
|
||||
extern int akai_sample2wav(struct file_s *fp,int wavfd,u_int *sizep,char **wavnamep,int what);
|
||||
|
||||
#define WAV2SAMPLE_OPEN 1
|
||||
#define WAV2SAMPLE_OVERWRITE 2
|
||||
extern int akai_wav2sample(int wavfd,char *wavname,struct vol_s *volp,u_int findex,
|
||||
u_int type,int s9cflag,u_int osver,u_char *tagp,
|
||||
u_int *bcountp,int what);
|
||||
|
||||
|
||||
|
||||
#endif /* !__AKAIUTIL_FILE_H */
|
||||
Reference in New Issue
Block a user