/* 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 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 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 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 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 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 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 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); } }