390 lines
16 KiB
Java
390 lines
16 KiB
Java
/*
|
|
BASSMIDI 2.4 Java class
|
|
Copyright (c) 2006-2018 Un4seen Developments Ltd.
|
|
|
|
See the BASSMIDI.CHM file for more detailed documentation
|
|
*/
|
|
|
|
package com.un4seen.bass;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
import com.sun.jna.Callback;
|
|
import com.sun.jna.Native;
|
|
import com.sun.jna.Pointer;
|
|
import com.sun.jna.Structure;
|
|
|
|
import anywheresoftware.b4a.BA;
|
|
|
|
//import com.un4seen.bass.BASS.Asset;
|
|
|
|
public class BASSMIDI
|
|
{
|
|
// Additional error codes returned by BASS_ErrorGetCode
|
|
public static final int BASS_ERROR_MIDI_INCLUDE=7000;
|
|
|
|
// Additional BASS_SetConfig options
|
|
public static final int BASS_CONFIG_MIDI_COMPACT=0x10400;
|
|
public static final int BASS_CONFIG_MIDI_VOICES=0x10401;
|
|
public static final int BASS_CONFIG_MIDI_AUTOFONT=0x10402;
|
|
|
|
// Additional BASS_SetConfigPtr options
|
|
public static final int BASS_CONFIG_MIDI_DEFFONT=0x10403;
|
|
|
|
// Additional sync types
|
|
public static final int BASS_SYNC_MIDI_MARK=0x10000;
|
|
public static final int BASS_SYNC_MIDI_EVENT=0x10004;
|
|
public static final int BASS_SYNC_MIDI_TICK=0x10005;
|
|
|
|
// Additional BASS_MIDI_StreamCreateFile/etc flags
|
|
public static final int BASS_MIDI_NOSYSRESET=0x800;
|
|
public static final int BASS_MIDI_DECAYEND=0x1000;
|
|
public static final int BASS_MIDI_NOFX=0x2000;
|
|
public static final int BASS_MIDI_DECAYSEEK=0x4000;
|
|
public static final int BASS_MIDI_NOCROP=0x8000;
|
|
public static final int BASS_MIDI_NOTEOFF1=0x10000;
|
|
public static final int BASS_MIDI_SINCINTER=0x800000;
|
|
|
|
// BASS_MIDI_FontInit flags
|
|
public static final int BASS_MIDI_FONT_MMAP=0x20000;
|
|
public static final int BASS_MIDI_FONT_XGDRUMS=0x40000;
|
|
public static final int BASS_MIDI_FONT_NOFX=0x80000;
|
|
public static final int BASS_MIDI_FONT_LINATTMOD=0x100000;
|
|
|
|
@BA.ShortName("BASS_MIDI_FONT")
|
|
// @Structure.FieldOrder({"font","preset","bank"})
|
|
public static class BASS_MIDI_FONT extends Structure {
|
|
public int font; // soundfont
|
|
public int preset; // preset number (-1=all)
|
|
public int bank;
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"font","preset","bank"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
@BA.ShortName("BASS_MIDI_FONTEX")
|
|
// @Structure.FieldOrder({"font","spreset","sbank","dpreset","dbank","dbanklsb"})
|
|
public static class BASS_MIDI_FONTEX extends Structure{
|
|
public int font; // soundfont
|
|
public int spreset; // source preset number
|
|
public int sbank; // source bank number
|
|
public int dpreset; // destination preset/program number
|
|
public int dbank; // destination bank number
|
|
public int dbanklsb; // destination bank number LSB
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"font","spreset","sbank","dpreset","dbank","dbanklsb"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
// BASS_MIDI_StreamSet/GetFonts flag
|
|
public static final int BASS_MIDI_FONT_EX=0x1000000; // BASS_MIDI_FONTEX (auto-detected)
|
|
|
|
@BA.ShortName("BASS_MIDI_FONTINFO")
|
|
// @Structure.FieldOrder({"name","copyright","comment","presets","samsize","samload","samtype"})
|
|
public static class BASS_MIDI_FONTINFO extends Structure{
|
|
public String name;
|
|
public String copyright;
|
|
public String comment;
|
|
public int presets; // number of presets/instruments
|
|
public int samsize; // total size (in bytes) of the sample data
|
|
public int samload; // amount of sample data currently loaded
|
|
public int samtype; // sample format (CTYPE) if packed
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"name","copyright","comment","presets","samsize","samload","samtype"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
@BA.ShortName("BASS_MIDI_MARK")
|
|
// @Structure.FieldOrder({"track","pos","text"})
|
|
public static class BASS_MIDI_MARK extends Structure{
|
|
public int track; // track containing marker
|
|
public int pos; // marker position
|
|
public String text; // marker text
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"track","pos","text"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
@BA.ShortName("BASS_MIDI_MARKB")
|
|
// @Structure.FieldOrder({"track","pos","text"})
|
|
public static class BASS_MIDI_MARKB extends Structure{
|
|
public int track; // track containing marker
|
|
public int pos; // marker position
|
|
public byte[] text; // marker text
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"track","pos","text"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
|
|
// Marker types
|
|
public static final int BASS_MIDI_MARK_MARKER=0; // marker
|
|
public static final int BASS_MIDI_MARK_CUE=1; // cue point
|
|
public static final int BASS_MIDI_MARK_LYRIC=2; // lyric
|
|
public static final int BASS_MIDI_MARK_TEXT=3; // text
|
|
public static final int BASS_MIDI_MARK_TIMESIG=4; // time signature
|
|
public static final int BASS_MIDI_MARK_KEYSIG=5; // key signature
|
|
public static final int BASS_MIDI_MARK_COPY=6; // copyright notice
|
|
public static final int BASS_MIDI_MARK_TRACK=7; // track name
|
|
public static final int BASS_MIDI_MARK_INST=8; // instrument name
|
|
public static final int BASS_MIDI_MARK_TRACKSTART=9; // track start (SMF2)
|
|
public static final int BASS_MIDI_MARK_TICK=0x10000; // flag: get position in ticks (otherwise bytes)
|
|
|
|
// MIDI events
|
|
public static final int MIDI_EVENT_NOTE=1;
|
|
public static final int MIDI_EVENT_PROGRAM=2;
|
|
public static final int MIDI_EVENT_CHANPRES=3;
|
|
public static final int MIDI_EVENT_PITCH=4;
|
|
public static final int MIDI_EVENT_PITCHRANGE=5;
|
|
public static final int MIDI_EVENT_DRUMS=6;
|
|
public static final int MIDI_EVENT_FINETUNE=7;
|
|
public static final int MIDI_EVENT_COARSETUNE=8;
|
|
public static final int MIDI_EVENT_MASTERVOL=9;
|
|
public static final int MIDI_EVENT_BANK=10;
|
|
public static final int MIDI_EVENT_MODULATION=11;
|
|
public static final int MIDI_EVENT_VOLUME=12;
|
|
public static final int MIDI_EVENT_PAN=13;
|
|
public static final int MIDI_EVENT_EXPRESSION=14;
|
|
public static final int MIDI_EVENT_SUSTAIN=15;
|
|
public static final int MIDI_EVENT_SOUNDOFF=16;
|
|
public static final int MIDI_EVENT_RESET=17;
|
|
public static final int MIDI_EVENT_NOTESOFF=18;
|
|
public static final int MIDI_EVENT_PORTAMENTO=19;
|
|
public static final int MIDI_EVENT_PORTATIME=20;
|
|
public static final int MIDI_EVENT_PORTANOTE=21;
|
|
public static final int MIDI_EVENT_MODE=22;
|
|
public static final int MIDI_EVENT_REVERB=23;
|
|
public static final int MIDI_EVENT_CHORUS=24;
|
|
public static final int MIDI_EVENT_CUTOFF=25;
|
|
public static final int MIDI_EVENT_RESONANCE=26;
|
|
public static final int MIDI_EVENT_RELEASE=27;
|
|
public static final int MIDI_EVENT_ATTACK=28;
|
|
public static final int MIDI_EVENT_DECAY=29;
|
|
public static final int MIDI_EVENT_REVERB_MACRO=30;
|
|
public static final int MIDI_EVENT_CHORUS_MACRO=31;
|
|
public static final int MIDI_EVENT_REVERB_TIME=32;
|
|
public static final int MIDI_EVENT_REVERB_DELAY=33;
|
|
public static final int MIDI_EVENT_REVERB_LOCUTOFF=34;
|
|
public static final int MIDI_EVENT_REVERB_HICUTOFF=35;
|
|
public static final int MIDI_EVENT_REVERB_LEVEL=36;
|
|
public static final int MIDI_EVENT_CHORUS_DELAY=37;
|
|
public static final int MIDI_EVENT_CHORUS_DEPTH=38;
|
|
public static final int MIDI_EVENT_CHORUS_RATE=39;
|
|
public static final int MIDI_EVENT_CHORUS_FEEDBACK=40;
|
|
public static final int MIDI_EVENT_CHORUS_LEVEL=41;
|
|
public static final int MIDI_EVENT_CHORUS_REVERB=42;
|
|
public static final int MIDI_EVENT_USERFX=43;
|
|
public static final int MIDI_EVENT_USERFX_LEVEL=44;
|
|
public static final int MIDI_EVENT_USERFX_REVERB=45;
|
|
public static final int MIDI_EVENT_USERFX_CHORUS=46;
|
|
public static final int MIDI_EVENT_DRUM_FINETUNE=50;
|
|
public static final int MIDI_EVENT_DRUM_COARSETUNE=51;
|
|
public static final int MIDI_EVENT_DRUM_PAN=52;
|
|
public static final int MIDI_EVENT_DRUM_REVERB=53;
|
|
public static final int MIDI_EVENT_DRUM_CHORUS=54;
|
|
public static final int MIDI_EVENT_DRUM_CUTOFF=55;
|
|
public static final int MIDI_EVENT_DRUM_RESONANCE=56;
|
|
public static final int MIDI_EVENT_DRUM_LEVEL=57;
|
|
public static final int MIDI_EVENT_DRUM_USERFX=58;
|
|
public static final int MIDI_EVENT_SOFT=60;
|
|
public static final int MIDI_EVENT_SYSTEM=61;
|
|
public static final int MIDI_EVENT_TEMPO=62;
|
|
public static final int MIDI_EVENT_SCALETUNING=63;
|
|
public static final int MIDI_EVENT_CONTROL=64;
|
|
public static final int MIDI_EVENT_CHANPRES_VIBRATO=65;
|
|
public static final int MIDI_EVENT_CHANPRES_PITCH=66;
|
|
public static final int MIDI_EVENT_CHANPRES_FILTER=67;
|
|
public static final int MIDI_EVENT_CHANPRES_VOLUME=68;
|
|
public static final int MIDI_EVENT_MOD_VIBRATO=69;
|
|
public static final int MIDI_EVENT_MODRANGE=69;
|
|
public static final int MIDI_EVENT_BANK_LSB=70;
|
|
public static final int MIDI_EVENT_KEYPRES=71;
|
|
public static final int MIDI_EVENT_KEYPRES_VIBRATO=72;
|
|
public static final int MIDI_EVENT_KEYPRES_PITCH=73;
|
|
public static final int MIDI_EVENT_KEYPRES_FILTER=74;
|
|
public static final int MIDI_EVENT_KEYPRES_VOLUME=75;
|
|
public static final int MIDI_EVENT_SOSTENUTO=76;
|
|
public static final int MIDI_EVENT_MOD_PITCH=77;
|
|
public static final int MIDI_EVENT_MOD_FILTER=78;
|
|
public static final int MIDI_EVENT_MOD_VOLUME=79;
|
|
public static final int MIDI_EVENT_MIXLEVEL=0x10000;
|
|
public static final int MIDI_EVENT_TRANSPOSE=0x10001;
|
|
public static final int MIDI_EVENT_SYSTEMEX=0x10002;
|
|
public static final int MIDI_EVENT_SPEED=0x10004;
|
|
|
|
public static final int MIDI_EVENT_END=0;
|
|
public static final int MIDI_EVENT_END_TRACK=0x10003;
|
|
|
|
public static final int MIDI_EVENT_NOTES=0x20000;
|
|
public static final int MIDI_EVENT_VOICES=0x20001;
|
|
|
|
public static final int MIDI_SYSTEM_DEFAULT=0;
|
|
public static final int MIDI_SYSTEM_GM1=1;
|
|
public static final int MIDI_SYSTEM_GM2=2;
|
|
public static final int MIDI_SYSTEM_XG=3;
|
|
public static final int MIDI_SYSTEM_GS=4;
|
|
|
|
@BA.ShortName("BASS_MIDI_EVENT")
|
|
// @Structure.FieldOrder({"event","param","chan","tick","pos"})
|
|
public static class BASS_MIDI_EVENT extends Structure{
|
|
public int event; // MIDI_EVENT_xxx
|
|
public int param;
|
|
public int chan;
|
|
public int tick; // event position (ticks)
|
|
public int pos; // event position (bytes)
|
|
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"event","param","chan","tick","pos"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
// BASS_MIDI_StreamEvents modes
|
|
public static final int BASS_MIDI_EVENTS_STRUCT=0; // BASS_MIDI_EVENT structures
|
|
public static final int BASS_MIDI_EVENTS_RAW=0x10000; // raw MIDI event data
|
|
public static final int BASS_MIDI_EVENTS_SYNC=0x1000000; // flag: trigger event syncs
|
|
public static final int BASS_MIDI_EVENTS_NORSTATUS=0x2000000; // flag: no running status
|
|
public static final int BASS_MIDI_EVENTS_CANCEL=0x4000000; // flag: cancel pending events
|
|
public static final int BASS_MIDI_EVENTS_TIME=0x8000000; // flag: delta-time info is present
|
|
public static final int BASS_MIDI_EVENTS_ABSTIME=0x10000000; // flag: absolute time info is present
|
|
|
|
// BASS_MIDI_StreamGetChannel special channels
|
|
public static final int BASS_MIDI_CHAN_CHORUS=-1;
|
|
public static final int BASS_MIDI_CHAN_REVERB=-2;
|
|
public static final int BASS_MIDI_CHAN_USERFX=-3;
|
|
|
|
// BASS_CHANNELINFO type
|
|
public static final int BASS_CTYPE_STREAM_MIDI=0x10d00;
|
|
|
|
// Additional attributes
|
|
public static final int BASS_ATTRIB_MIDI_PPQN=0x12000;
|
|
public static final int BASS_ATTRIB_MIDI_CPU=0x12001;
|
|
public static final int BASS_ATTRIB_MIDI_CHANS=0x12002;
|
|
public static final int BASS_ATTRIB_MIDI_VOICES=0x12003;
|
|
public static final int BASS_ATTRIB_MIDI_VOICES_ACTIVE=0x12004;
|
|
public static final int BASS_ATTRIB_MIDI_STATE=0x12005;
|
|
public static final int BASS_ATTRIB_MIDI_SRC=0x12006;
|
|
public static final int BASS_ATTRIB_MIDI_KILL=0x12007;
|
|
public static final int BASS_ATTRIB_MIDI_TRACK_VOL=0x12100; // + track #
|
|
|
|
// Additional tag type
|
|
public static final int BASS_TAG_MIDI_TRACK=0x11000; // + track #, track text : array of null-terminated ANSI strings
|
|
|
|
// BASS_ChannelGetLength/GetPosition/SetPosition mode
|
|
public static final int BASS_POS_MIDI_TICK=2; // tick position
|
|
|
|
public interface MIDIFILTERPROC extends Callback
|
|
{
|
|
boolean MIDIFILTERPROC(int handle, int track, BASS_MIDI_EVENT event, boolean seeking, Pointer user);
|
|
/* Event filtering callback function.
|
|
handle : MIDI stream handle
|
|
track : Track containing the event
|
|
event : The event
|
|
seeking: true = the event is being processed while seeking, false = it is being played
|
|
user : The 'user' parameter value given when calling BASS_MIDI_StreamSetFilter
|
|
RETURN : true = process the event, false = drop the event */
|
|
}
|
|
|
|
@BA.ShortName("BASS_MIDI_DEVICEINFO")
|
|
// @Structure.FieldOrder({"name","id","flags"})
|
|
public static class BASS_MIDI_DEVICEINFO extends Structure{
|
|
public String name; // description
|
|
public int id;
|
|
public int flags;
|
|
@Override
|
|
protected List<String> getFieldOrder() {
|
|
return Arrays.asList(
|
|
"name","id","flags"
|
|
);
|
|
}
|
|
|
|
@BA.Hide public void autoWrite(){}
|
|
@BA.Hide public void autoRead(){}
|
|
}
|
|
|
|
public static native int BASS_MIDI_StreamCreate(int channels, int flags, int freq);
|
|
public static native int BASS_MIDI_StreamCreateFile(String file, long offset, long length, int flags, int freq);
|
|
public static native int BASS_MIDI_StreamCreateURL(String url, int offset, int flags, BASS.DOWNLOADPROC proc, Pointer user, int freq);
|
|
public static native int BASS_MIDI_StreamCreateFileUser(int system, int flags, BASS.BASS_FILEPROCS procs, Pointer user, int freq);
|
|
public static native int BASS_MIDI_StreamCreateEvents(BASS_MIDI_EVENT[] events, int ppqn, int flags, int freq);
|
|
public static native boolean BASS_MIDI_StreamGetMark(int handle, int type, int index, BASS_MIDI_MARK mark);
|
|
public static native boolean BASS_MIDI_StreamGetMark(int handle, int type, int index, BASS_MIDI_MARKB mark);
|
|
public static native int BASS_MIDI_StreamGetMarks(int handle, int track, int type, BASS_MIDI_MARK[] marks);
|
|
public static native int BASS_MIDI_StreamGetMarks(int handle, int track, int type, BASS_MIDI_MARKB[] marks);
|
|
public static native boolean BASS_MIDI_StreamSetFonts(int handle, BASS_MIDI_FONT[] fonts, int count);
|
|
public static native boolean BASS_MIDI_StreamSetFonts(int handle, BASS_MIDI_FONTEX[] fonts, int count);
|
|
public static native int BASS_MIDI_StreamGetFonts(int handle, BASS_MIDI_FONT[] fonts, int count);
|
|
public static native int BASS_MIDI_StreamGetFonts(int handle, BASS_MIDI_FONTEX[] fonts, int count);
|
|
public static native boolean BASS_MIDI_StreamLoadSamples(int handle);
|
|
public static native boolean BASS_MIDI_StreamEvent(int handle, int chan, int event, int param);
|
|
public static native int BASS_MIDI_StreamEvents(int handle, int mode, BASS_MIDI_EVENT[] events, int length);
|
|
public static native int BASS_MIDI_StreamEvents(int handle, int mode, Pointer events, int length);
|
|
public static native int BASS_MIDI_StreamGetEvent(int handle, int chan, int event);
|
|
public static native int BASS_MIDI_StreamGetEvents(int handle, int track, int filter, BASS_MIDI_EVENT[] events);
|
|
public static native int BASS_MIDI_StreamGetEventsEx(int handle, int track, int filter, BASS_MIDI_EVENT[] events, int start, int count);
|
|
public static native boolean BASS_MIDI_StreamGetPreset(int handle, int chan, BASS_MIDI_FONT font);
|
|
public static native int BASS_MIDI_StreamGetChannel(int handle, int chan);
|
|
public static native boolean BASS_MIDI_StreamSetFilter(int handle, boolean seeking, MIDIFILTERPROC proc, Pointer user);
|
|
|
|
public static native int BASS_MIDI_FontInit(String file, int flags);
|
|
public static native int BASS_MIDI_FontInitUser(BASS.BASS_FILEPROCS procs, Pointer user, int flags);
|
|
public static native boolean BASS_MIDI_FontFree(int handle);
|
|
public static native boolean BASS_MIDI_FontGetInfo(int handle, BASS_MIDI_FONTINFO info);
|
|
public static native boolean BASS_MIDI_FontGetPresets(int handle, int[] presets);
|
|
public static native String BASS_MIDI_FontGetPreset(int handle, int preset, int bank);
|
|
public static native boolean BASS_MIDI_FontLoad(int handle, int preset, int bank);
|
|
public static native boolean BASS_MIDI_FontUnload(int handle, int preset, int bank);
|
|
public static native boolean BASS_MIDI_FontCompact(int handle);
|
|
public static native boolean BASS_MIDI_FontUnpack(int handle, String outfile, int flags);
|
|
public static native boolean BASS_MIDI_FontSetVolume(int handle, float volume);
|
|
public static native float BASS_MIDI_FontGetVolume(int handle);
|
|
|
|
public static native int BASS_MIDI_ConvertEvents(Pointer data, int length, BASS_MIDI_EVENT[] events, int count, int flags);
|
|
|
|
static {
|
|
String path = BassLibrary.ExtractLibraryFromJar(BassLibrary.lib_bassmidi);
|
|
if (path!=null && path.length()>0) Native.register(BASSMIDI.class, path); }
|
|
|
|
}
|