////////////////////////////////////////////////////////////////////////////// // Copyright 2011 Alex Leffelman // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ////////////////////////////////////////////////////////////////////////////// package com.leff.midi.util; public class MidiUtil { /** * MIDI Unit Conversions */ public static long ticksToMs(long ticks, int mpqn, int resolution) { return ((ticks * mpqn) / resolution) / 1000; } public static long ticksToMs(long ticks, float bpm, int resolution) { return ticksToMs(ticks, bpmToMpqn(bpm), resolution); } public static double msToTicks(long ms, int mpqn, int ppq) { return ((ms * 1000.0) * ppq) / mpqn; } public static double msToTicks(long ms, float bpm, int ppq) { return msToTicks(ms, bpmToMpqn(bpm), ppq); } public static int bpmToMpqn(float bpm) { return (int) (bpm * 60000000); } public static float mpqnToBpm(int mpqn) { return mpqn / 60000000.0f; } /** * Utility methods for working with bytes and byte buffers */ public static int bytesToInt(byte[] buff, int off, int len) { int num = 0; int shift = 0; for(int i = off + len - 1; i >= off; i--) { num += (buff[i] & 0xFF) << shift; shift += 8; } return num; } public static byte[] intToBytes(int val, int byteCount) { byte[] buffer = new byte[byteCount]; int[] ints = new int[byteCount]; for(int i = 0; i < byteCount; i++) { ints[i] = val & 0xFF; buffer[byteCount - i - 1] = (byte) ints[i]; val = val >> 8; if(val == 0) { break; } } return buffer; } public static boolean bytesEqual(byte[] buf1, byte[] buf2, int off, int len) { for(int i = off; i < off + len; i++) { if(i >= buf1.length || i >= buf2.length) { return false; } if(buf1[i] != buf2[i]) { return false; } } return true; } public static byte[] extractBytes(byte[] buffer, int off, int len) { byte[] ret = new byte[len]; for(int i = 0; i < len; i++) { ret[i] = buffer[off + i]; } return ret; } private static final String HEX = "0123456789ABCDEF"; public static String byteToHex(byte b) { int high = (b & 0xF0) >> 4; int low = (b & 0x0F); return "" + HEX.charAt(high) + HEX.charAt(low); } public static String bytesToHex(byte[] b) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < b.length; i++) { sb.append(byteToHex(b[i])).append(" "); } return sb.toString(); } }