diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index fe3ed99..fa8530e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -18,6 +18,10 @@ jobs: analyze: name: Analyze runs-on: ubuntu-latest + permissions: + security-events: write + actions: read + contents: read strategy: fail-fast: false @@ -30,11 +34,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -45,13 +49,11 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: maven - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -60,13 +62,11 @@ jobs: # and modify them (or add more) to build your code if your project # uses a compiled language - name: Build with Maven - run: mvn -B package --file pom.xml -s $GITHUB_WORKSPACE/settings.xml -Dmaven.test.skip=true - env: - GITHUB_TOKEN: ${{ github.token }} + run: mvn -B package --file pom.xml -Dmaven.test.skip=true #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 7ce4bf5..8f4fabb 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -16,14 +16,14 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check w/o SNAPSHOT when "bump version" if: ${{ contains(github.event.head_commit.message, 'bump version') }} run: grep "" pom.xml | head -1 | grep -v SNAPSHOT - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' diff --git a/README.md b/README.md index c0b51dd..ee007df 100644 --- a/README.md +++ b/README.md @@ -5,53 +5,57 @@ # vavi-sound -Provides old school Japanese cell phone sounds library as `javax.sound` SPI. -Includes many ADPCM codecs and the [SSRC](https://github.com/shibatch/SSRC) sampling rate converter. - -## Status - -| **SPI** | **Codec** | **Description** | **IN Status** | **OUT Status** | **SPI Status** | **Comment** | -|:--------|:---------------------------------------------------------|:---------------------------|:--------------|:---------------|:---------------|:----------------------------| -| midi | [MFi](src/main/java/vavi/sound/midi/mfi) | Japanese cell phone format | 🚧 | ✅ | ✅ | | -| midi | [SMAF](src/main/java/vavi/sound/midi/smaf) | YAMAHA cell phone format | 🚧 | ✅ | ✅ | | -| sampled | [MFi](src/main/java/vavi/sound/sampled/mfi) | Japanese cell phone format | ✅ | ✅ | ✅ | | -| sampled | [SMAF](src/main/java/vavi/sound/sampled/smaf) | YAMAHA cell phone format | ✅ | ✅ | ✅ | | -| sampled | [CCITT ADPCM](src/main/java/vavi/sound/adpcm/ccitt) | G711, G721, G723 | ✅ | ✅ | ✅ | | -| sampled | [DVI ADPCM](src/main/java/vavi/sound/adpcm/dvi) | DVI ADPCM | ✅ | ✅ | ✅ | | -| sampled | [IMA ADPCM](src/main/java/vavi/sound/adpcm/ima) | IMA ADPCM | ✅ | ✅ | ✅ | | -| sampled | [MA ADPCM](https://gitlab.com/umjammer/vavi-sound-nda) | YAMAHA ADPCM | ✅ | ✅ | ✅ | | -| sampled | [MS ADPCM](src/main/java/vavi/sound/adpcm/ms) | Microsoft ADPCM | ✅ | ✅ | ✅ | | -| sampled | [OKI ADPCM](src/main/java/vavi/sound/adpcm/oki) | OKI ADPCM | ✅ | ✅ | ✅ | | -| sampled | [ROHM ADPCM](https://gitlab.com/umjammer/vavi-sound-nda) | ROHM ADPCM | ✅ | ✅ | ✅ | | -| sampled | [VOX ADPCM](src/main/java/vavi/sound/adpcm/vox) | VOX ADPCM | ✅ | ✅ | ✅ | | -| sampled | [YAMAHA ADPCM](src/main/java/vavi/sound/adpcm/yamaha) | YAMAHA ADPCM | ✅ | ✅ | - | same as ym2068 | -| sampled | [YM2068 ADPCM](src/main/java/vavi/sound/adpcm/ym2608) | YAMAHA ADPCM | ✅ | ✅ | ✅ | | -| sampled | [ssrc](src/main/java/vavi/sound/pcm/resampling/ssrc) | resampling | ✅ | - | ✅ | need to wait for phase 1 | +Provides old school Japanese cell phone sounds library as `javax.sound` SPI
+includes many ADPCM codecs and the [SSRC](https://github.com/shibatch/SSRC) sampling rate converter. + +### Status + +| **SPI** | **Codec** | **Description** | **IN Status** | **OUT Status** | **SPI Status** | **Comment** | +|:--------|:---------------------------------------------------------|:-------------------------------------|:-------------:|:--------------:|:---------------:|:-------------------------| +| midi | [MFi](src/main/java/vavi/sound/midi/mfi) | Japanese ring tone format | 🚧 | ✅ | ✅ | DoCoMo | +| midi | [SMAF](src/main/java/vavi/sound/midi/smaf) | YAMAHA ring tone format | 🚧 | ✅ | ✅ | au, Softbank | +| sampled | [MFi](src/main/java/vavi/sound/sampled/mfi) | Japanese ring tone format | ✅ | ✅ | ✅ | DoCoMo | +| sampled | [SMAF](src/main/java/vavi/sound/sampled/smaf) | YAMAHA ring tone format | ✅ | ✅ | ✅ | au, Softbank | +| sampled | [CCITT ADPCM](src/main/java/vavi/sound/adpcm/ccitt) | G711, G721, G723 | ✅ | ✅ | ✅ | | +| sampled | [DVI ADPCM](src/main/java/vavi/sound/adpcm/dvi) | DVI ADPCM | ✅ | ✅ | ✅ | | +| sampled | [IMA ADPCM](src/main/java/vavi/sound/adpcm/ima) | IMA ADPCM | ✅ | ✅ | ✅[1] | | +| sampled | [MA ADPCM](https://gitlab.com/umjammer/vavi-sound-nda) | YAMAHA ADPCM | ✅ | ✅ | ✅ | | +| sampled | [MS ADPCM](src/main/java/vavi/sound/adpcm/ms) | Microsoft ADPCM | ✅ | ✅ | ✅[1] | | +| sampled | [OKI ADPCM](src/main/java/vavi/sound/adpcm/oki) | OKI ADPCM | ✅ | ✅ | ✅ | | +| sampled | [ROHM ADPCM](https://gitlab.com/umjammer/vavi-sound-nda) | ROHM ADPCM | ✅ | ✅ | ✅ | | +| sampled | [VOX ADPCM](src/main/java/vavi/sound/adpcm/vox) | VOX ADPCM | ✅ | ✅ | ✅ | | +| sampled | [YAMAHA ADPCM](src/main/java/vavi/sound/adpcm/yamaha) | YAMAHA ADPCM | ✅ | ✅ | ✅ | | +| sampled | [YM2068 ADPCM](src/main/java/vavi/sound/adpcm/ym2608) | YAMAHA ADPCM | ✅ | ✅ | - | same as yamaha | +| sampled | [ssrc](src/main/java/vavi/sound/pcm/resampling/ssrc) | resampling | ✅ | - | ✅ | need to wait for phase 1 | + +[1] wav file readable ## Install - * https://jitpack.io/#umjammer/vavi-sound +* https://jitpack.io/#umjammer/vavi-sound + +## Usage -## FAQ +### FAQ #### Q. can I use SSRC sampling converter under LGPL license? A. yes you can, follow those steps - * create a separated jar (ssrc.jar) file including ssrc classes. (**never include those .class files into your application jar file**) - * `vavi/sound/pcm/resampling/ssrc/SSRC.class` - * `vavi/util/SplitRadixFft.class` - * `vavi/util/I0Bessel.class` - * ⚠ **caution**: - * your application complies with the LGPL. customers **have a right to reverse engineering your application**. - * if you include ssrc.jar with a distribution, you **must offer a way to get ssrc source code**. - * see also - * https://opensource.org/licenses/LGPL-2.1 - * http://www.gnu.org/licenses/lgpl-java.en.html +* create a separated jar (ssrc.jar) file including ssrc classes. (**never include those .class files into your application jar file**) + * `vavi/sound/pcm/resampling/ssrc/SSRC.class` + * `vavi/util/SplitRadixFft.class` + * `vavi/util/I0Bessel.class` +* ⚠ **caution**: + * your application complies with the LGPL. customers **have a right to reverse engineering your application**. + * if you include ssrc.jar with a distribution, you **must offer a way to get ssrc source code**. +* see also + * https://opensource.org/licenses/LGPL-2.1 + * http://www.gnu.org/licenses/lgpl-java.en.html -## Tech Know +### Tech Know - * github actions workflow on ubuntu java8 cannot deal line `PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian` +* github actions workflow on ubuntu java8 cannot deal line `PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian` ## TODO @@ -60,4 +64,3 @@ A. yes you can, follow those steps * on macos m2 ultra 1st pass is in a blink of an eye * ~~`ima`, `ms` adpcm: wav reader~~ * ~~`tritonus:tritonus-remaining:org.tritonus.sampled.file.WaveAudioFileReader`~~ - * ~~wip at [vavi-sound-sandbox](https://github.com/umjammer/vavi-sound-sandbox)~~ done in this project diff --git a/local.properties.sample b/local.properties.sample index 7a65b1f..246a0da 100644 --- a/local.properties.sample +++ b/local.properties.sample @@ -1,3 +1,6 @@ #ssrc=/foo/bar.wav -#sf2=/Users/nsano/Library/Audio/Sounds/Banks/Orchestra/baz.sf2 +#sf2=/Users/foo/Library/Audio/Sounds/Banks/Orchestra/baz.sf2 + +vavi.test.volume=0.02 +vavi.test.volume.midi=0.2 diff --git a/pom.xml b/pom.xml index 5ee06ec..3abd418 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ vavi vavi-sound - 1.0.16 + 1.0.17 Vavi Sound API https://github.com/umjammer/vavi-sound @@ -23,6 +23,11 @@ TODO https://github.com/umjammer/vavi-sound/issues + + 0.02 + 0.2 + + mac @@ -58,6 +63,38 @@ TODO + + local + + + ${basedir}/local.properties + + + + + + org.codehaus.mojo + properties-maven-plugin + 1.1.0 + + + read-properties + initialize + + read-project-properties + + + + ${basedir}/local.properties + + + + + + + + + assembly-with-test @@ -123,12 +160,14 @@ TODO org.apache.maven.plugins maven-surefire-plugin - 3.1.2 + 3.2.2 -Djava.util.logging.config.file=${project.build.testOutputDirectory}/logging.properties -Dvavi.test.dev.null=${dev.null} - -Dvavi.test.volume=0.02 + -Dvavi.test.volume=${vavi.test.volume} + -Dvavi.test.volume.midi=${vavi.test.volume.midi} + -Dvavi.test.version=${project.version} false @@ -142,7 +181,7 @@ TODO https://jitpack.io - gitlab-maven + gitlab-maven-packages https://gitlab.com/api/v4/projects/30804899/packages/maven @@ -152,7 +191,7 @@ TODO org.junit junit-bom - 5.10.0 + 5.10.2 pom import @@ -161,9 +200,9 @@ TODO - com.github.umjammer + com.github.umjammer vavi-commons - 1.1.9 + 1.1.11 com.github.umjammer @@ -177,7 +216,7 @@ TODO - com.github.umjammer + com.github.umjammer vavi-util-codec-sandbox 1.0.2 diff --git a/src/main/java/vavi/sound/SoundUtil.java b/src/main/java/vavi/sound/SoundUtil.java index 77d1953..895aa8f 100644 --- a/src/main/java/vavi/sound/SoundUtil.java +++ b/src/main/java/vavi/sound/SoundUtil.java @@ -30,5 +30,3 @@ public static void volume(DataLine line, double gain) { gainControl.setValue(dB); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/AdpcmInputStream.java b/src/main/java/vavi/sound/adpcm/AdpcmInputStream.java index 6cb731a..d1920b4 100644 --- a/src/main/java/vavi/sound/adpcm/AdpcmInputStream.java +++ b/src/main/java/vavi/sound/adpcm/AdpcmInputStream.java @@ -15,6 +15,7 @@ import vavi.io.BitInputStream; import vavi.io.BitOutputStream; +import vavi.util.Debug; /** @@ -24,18 +25,18 @@ * @version 0.00 030714 nsano initial version
* 0.01 030714 nsano fine tune
* 0.02 030714 nsano fix available()
- * 0.03 030715 nsano read() endian 対応
+ * 0.03 030715 nsano support read() endian
* 0.10 060427 nsano refactoring
*/ public abstract class AdpcmInputStream extends FilterInputStream { - /** #read() が返す PCM のフォーマット */ + /** PCM format that #read() returns */ protected AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED; - /** #read() が返す PCM のバイトオーダ */ + /** PCM byte order that #read() returns */ protected ByteOrder byteOrder; - /** デコーダ */ + /** decoder */ protected Codec decoder; /** */ @@ -43,9 +44,9 @@ public abstract class AdpcmInputStream extends FilterInputStream { /** * @param in PCM - * @param byteOrder {@link #read()} 時のバイトオーダ - * @param bits {@link BitOutputStream} のサイズ - * @param bitOrder {@link BitOutputStream} のバイトオーダ + * @param byteOrder byte order for {@link #read()} + * @param bits {@link BitOutputStream} size + * @param bitOrder byte order for {@link BitOutputStream} */ public AdpcmInputStream(InputStream in, ByteOrder byteOrder, int bits, ByteOrder bitOrder) { super(new BitInputStream(in, bits, bitOrder)); @@ -54,21 +55,21 @@ public AdpcmInputStream(InputStream in, ByteOrder byteOrder, int bits, ByteOrder //Debug.println(this.in); } - /** ADPCM (4bit) 換算時の長さ */ + /** ADPCM (4bit) length */ @Override public int available() throws IOException { //Debug.println("0: " + in.available() + ", " + ((in.available() * 2) + (rest ? 1 : 0))); - // TODO * 2 とか bits で計算すべき? + // TODO "* 2" calc should be in bits? return (in.available() * 2) + (rest ? 1 : 0); } - /** 残っているかどうか */ + /** remaining or not */ protected boolean rest = false; - /** 現在の値 */ + /** current stream value */ protected int current; /** - * @return PCM H or L (8bit LSB 有効) + * @return PCM H or L (8bit LSB available) */ @Override public int read() throws IOException { @@ -129,10 +130,8 @@ public int read(byte[] b, int off, int len) throws IOException { } } } catch (IOException e) { -e.printStackTrace(System.err); + Debug.printStackTrace(e); } return i; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/AdpcmOutputStream.java b/src/main/java/vavi/sound/adpcm/AdpcmOutputStream.java index 7de9e13..08c7425 100644 --- a/src/main/java/vavi/sound/adpcm/AdpcmOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/AdpcmOutputStream.java @@ -25,24 +25,24 @@ */ public abstract class AdpcmOutputStream extends FilterOutputStream { - /** #write(int) に渡す PCM のフォーマット */ + /** PCM format for #write(int) */ protected AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED; - /** #write(int) に渡す PCM のバイトオーダ */ + /** PCM byte order for #write(int) */ protected ByteOrder byteOrder; - /** エンコーダ */ + /** encoder */ protected Codec encoder; /** */ protected abstract Codec getCodec(); /** - * TODO BitOutputStream の引数をまとめて BitOutputStream にする? + * TODO make gathered all BitOutputStream arguments BitOutputStream? * @param out ADPCM - * @param byteOrder {@link #write(int)} のバイトオーダ - * @param bits {@link BitOutputStream} のサイズ - * @param bitOrder {@link BitOutputStream} のバイトオーダ + * @param byteOrder byte order for {@link #write(int)} + * @param bits {@link BitOutputStream} size + * @param bitOrder byte order for {@link BitOutputStream} */ public AdpcmOutputStream(OutputStream out, ByteOrder byteOrder, int bits, ByteOrder bitOrder) { super(new BitOutputStream(out, bits, bitOrder)); @@ -51,13 +51,13 @@ public AdpcmOutputStream(OutputStream out, ByteOrder byteOrder, int bits, ByteOr //Debug.println(this.out); } - /** 残っていないかどうか (PCM L or H 片方保持してるかどうか) */ + /** remaining or not (having PCM L or H at least one side) */ protected boolean flushed = true; - /** 現在の値 (PCM L or H 片方しか来てない時の保持用) */ + /** current value (when PCM L or H one part is coming) */ protected int current; /** - * @param b PCM H or L byte を {@link #byteOrder} 順に指定 (LSB 8bit 有効) + * @param b let "PCM H or L byte" {@link #byteOrder} order (LSB 8bit available) */ @Override public void write(int b) throws IOException { @@ -89,5 +89,3 @@ public void write(int b) throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/Codec.java b/src/main/java/vavi/sound/adpcm/Codec.java index 2c0da31..51d23f0 100644 --- a/src/main/java/vavi/sound/adpcm/Codec.java +++ b/src/main/java/vavi/sound/adpcm/Codec.java @@ -26,5 +26,3 @@ public interface Codec { */ int decode(int adpcm); } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G711.java b/src/main/java/vavi/sound/adpcm/ccitt/G711.java index dec1060..6a18727 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G711.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G711.java @@ -519,5 +519,3 @@ public void setEncoding(AudioFormat.Encoding encoding) { this.encoding = encoding; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G721.java b/src/main/java/vavi/sound/adpcm/ccitt/G721.java index 8343eae..6aefb06 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G721.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G721.java @@ -29,7 +29,6 @@ import javax.sound.sampled.AudioFormat; - /** * These routines comprise an implementation of the CCITT G.721 ADPCM * coding algorithm. Essentially, this implementation is identical to @@ -118,7 +117,7 @@ public int encode(int sl) { // quantize the prediction difference // MIX int y = state.getStepSize(); // quantizer step size - int i = quantize(d, y, qtab_721, 7); // i = ADPCM code + int i = quantize(d, y, qtab_721, 7); // i = ADPCM code // quantized est diff int dq = reconstruct((i & 8) != 0, _dqlntab[i], y); @@ -154,14 +153,13 @@ public int decode(int i) { int sei = sezi + state.getPolePredictor(); int se = sei >> 1; // se = estimated signal -/* -System.err.println("---- (" + (ccc++) + ")"); -System.err.println("i:\t" + StringUtil.toHex2(i)); -System.err.println("sezi:\t" + sezi); -System.err.println("sez:\t" + sez); -System.err.println("sei:\t" + sei); -System.err.println("se:\t" + se); -*/ +//System.err.println("---- (" + (ccc++) + ")"); +//System.err.println("i:\t" + StringUtil.toHex2(i)); +//System.err.println("sezi:\t" + sezi); +//System.err.println("sez:\t" + sez); +//System.err.println("sei:\t" + sei); +//System.err.println("se:\t" + se); + // MIX int y = state.getStepSize(); // dynamic quantizer step size @@ -191,5 +189,3 @@ public int getEncodingBits() { return 4; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G721InputStream.java b/src/main/java/vavi/sound/adpcm/ccitt/G721InputStream.java index 900d0a7..155814e 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G721InputStream.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G721InputStream.java @@ -20,28 +20,25 @@ * @version 0.00 030714 nsano initial version
* 0.01 030714 nsano fine tune
* 0.02 030714 nsano fix available()
- * 0.03 030715 nsano read() endian 対応
+ * 0.03 030715 nsano support read() endian
* 0.10 060427 nsano refactoring
*/ public class G721InputStream extends AdpcmInputStream { - /** デコーダ */ @Override protected Codec getCodec() { return new G721(); } /** - * {@link vavi.io.BitInputStream} は 4bit little endian 固定 - *
  • TODO BitInputStream の endian + * {@link vavi.io.BitInputStream} is 4bit little endian fixed + *
  • TODO endian for BitInputStream *
  • TODO PCM encoding * @param in G721 ADPCM - * @param byteOrder #read() 時のバイトオーダ + * @param byteOrder byte order for #read() */ public G721InputStream(InputStream in, ByteOrder byteOrder) { super(in, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); ((G721) decoder).setEncoding(encoding); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G721OutputStream.java b/src/main/java/vavi/sound/adpcm/ccitt/G721OutputStream.java index 693e326..a770d18 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G721OutputStream.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G721OutputStream.java @@ -22,22 +22,19 @@ */ public class G721OutputStream extends AdpcmOutputStream { - /** エンコーダ */ @Override protected Codec getCodec() { return new G721(); } /** - * {@link vavi.io.BitOutputStream} は 4bit little endian 固定 - *
  • TODO {@link vavi.io.BitOutputStream} の endian + * {@link vavi.io.BitOutputStream} is 4bit little endian fixed + *
  • TODO endian for {@link vavi.io.BitOutputStream} * @param out ADPCM - * @param byteOrder {@link #write(int)} のバイトオーダ + * @param byteOrder byte order for {@link #write(int)} */ public G721OutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); ((G721) encoder).setEncoding(encoding); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G723_16.java b/src/main/java/vavi/sound/adpcm/ccitt/G723_16.java index 32c7226..a33fa80 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G723_16.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G723_16.java @@ -173,5 +173,3 @@ public int getEncodingBits() { return 2; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G723_16InputStream.java b/src/main/java/vavi/sound/adpcm/ccitt/G723_16InputStream.java index 4fb401b..20ec08c 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G723_16InputStream.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G723_16InputStream.java @@ -28,8 +28,8 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 2bit little endian 固定 - *
  • TODO BitInputStream の endian + * {@link vavi.io.BitInputStream} is 2bit little endian fixed + *
  • TODO endian for BitInputStream *
  • TODO PCM encoding */ public G723_16InputStream(InputStream in, ByteOrder byteOrder) { @@ -38,12 +38,10 @@ public G723_16InputStream(InputStream in, ByteOrder byteOrder) { //Debug.println(this.in); } - /** ADPCM (4bit) 換算時の長さ */ + /** ADPCM (4bit) length */ @Override public int available() throws IOException { //Debug.println("0: " + in.available() + ", " + ((in.available() * 2) + (rest ? 1 : 0))); return (in.available() * 4) + (rest ? 1 : 0); // TODO check * 4 ??? } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G723_24.java b/src/main/java/vavi/sound/adpcm/ccitt/G723_24.java index 63c83aa..148d684 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G723_24.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G723_24.java @@ -153,5 +153,3 @@ public int getEncodingBits() { return 3; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/G723_40.java b/src/main/java/vavi/sound/adpcm/ccitt/G723_40.java index 6fb5a44..80ee21c 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/G723_40.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/G723_40.java @@ -177,5 +177,3 @@ public int getEncodingBits() { return 5; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ccitt/State.java b/src/main/java/vavi/sound/adpcm/ccitt/State.java index 927f9f0..c0928c4 100644 --- a/src/main/java/vavi/sound/adpcm/ccitt/State.java +++ b/src/main/java/vavi/sound/adpcm/ccitt/State.java @@ -104,7 +104,7 @@ class State { /** delayed tone detect, new in 1988 version */ private int td; - //------------------------------------------------------------------------- + //---- /** */ private static final int[] power2 = { @@ -118,7 +118,7 @@ class State { * * Using linear search for simple coding. * - * TODO package 内公開かっちょ悪いが G711 内で隠蔽されるので無視 + * TODO package level is not good, but ignore because it's capsuled in G711 */ static int quan(int val) { int i; @@ -405,5 +405,3 @@ public void update(int code_size, int y, int wi, int fi, int _dq, int _sr, int d } } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/dvi/Dvi.java b/src/main/java/vavi/sound/adpcm/dvi/Dvi.java index 0bb813b..f57cdda 100644 --- a/src/main/java/vavi/sound/adpcm/dvi/Dvi.java +++ b/src/main/java/vavi/sound/adpcm/dvi/Dvi.java @@ -243,5 +243,3 @@ public int decode(int input) { return valPrev; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/dvi/DviInputStream.java b/src/main/java/vavi/sound/adpcm/dvi/DviInputStream.java index c4c179d..672fe0d 100644 --- a/src/main/java/vavi/sound/adpcm/dvi/DviInputStream.java +++ b/src/main/java/vavi/sound/adpcm/dvi/DviInputStream.java @@ -27,11 +27,9 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 4bit big endian 固定 + * {@link vavi.io.BitInputStream} is 4bit big endian fixed */ public DviInputStream(InputStream in, ByteOrder byteOrder) { super(in, byteOrder, 4, ByteOrder.BIG_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/dvi/DviOutputStream.java b/src/main/java/vavi/sound/adpcm/dvi/DviOutputStream.java index cec0532..1b5af20 100644 --- a/src/main/java/vavi/sound/adpcm/dvi/DviOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/dvi/DviOutputStream.java @@ -27,13 +27,11 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitOutputStream} は 4bit big endian 固定 + * {@link vavi.io.BitOutputStream} is 4bit big endian fixed * @param out ADPCM - * @param byteOrder {@link #write(int)} のバイトオーダ + * @param byteOrder byte order for {@link #write(int)} */ public DviOutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.BIG_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ima/Ima.java b/src/main/java/vavi/sound/adpcm/ima/Ima.java index 9281c73..a14bb72 100644 --- a/src/main/java/vavi/sound/adpcm/ima/Ima.java +++ b/src/main/java/vavi/sound/adpcm/ima/Ima.java @@ -450,5 +450,3 @@ public static int getBytesPerBlock(int channels, int samplesPerBlock) { return (samplesPerBlock + 14) / 8 * 4 * channels; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ima/ImaInputEngine.java b/src/main/java/vavi/sound/adpcm/ima/ImaInputEngine.java index 1b9ac80..2c4b423 100644 --- a/src/main/java/vavi/sound/adpcm/ima/ImaInputEngine.java +++ b/src/main/java/vavi/sound/adpcm/ima/ImaInputEngine.java @@ -30,13 +30,13 @@ class ImaInputEngine implements InputEngine { private OutputStream out; - private Ima encoder = new Ima(); + private final Ima encoder = new Ima(); private InputStream in; - private int samplesPerBlock; - private int channels; - private ByteOrder byteOrder; + private final int samplesPerBlock; + private final int channels; + private final ByteOrder byteOrder; /** */ public ImaInputEngine(OutputStream out, @@ -60,12 +60,12 @@ public void initialize(InputStream in) throws IOException { } /** */ - private int[] steps = new int[16]; + private final int[] steps = new int[16]; /** - * {@link #in} が {@link #samplesPerBlock} * 2 しか読まないので {@link IOStreamInputEngine} の + * because {@link #in} reads only {@link #samplesPerBlock} * 2 bytes, bufferSize for * {@link IOStreamInputEngine#IOStreamInputEngine(OutputStream, vavix.io.IOStreamInputEngine.InputStreamFactory, int)} - * の bufferSize を {@link #samplesPerBlock} * 2 にすること。 + * of {@link IOStreamInputEngine} must be set {@link #samplesPerBlock} * 2. */ @Override public void execute() throws IOException { @@ -106,5 +106,3 @@ public void finish() throws IOException { out.close(); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ima/ImaInputStream.java b/src/main/java/vavi/sound/adpcm/ima/ImaInputStream.java index 6b1b6e2..7f3e533 100644 --- a/src/main/java/vavi/sound/adpcm/ima/ImaInputStream.java +++ b/src/main/java/vavi/sound/adpcm/ima/ImaInputStream.java @@ -12,6 +12,7 @@ import java.nio.ByteOrder; import vavi.io.OutputEngineInputStream; +import vavi.util.Debug; /** @@ -23,7 +24,7 @@ public class ImaInputStream extends FilterInputStream { /** - * バイトオーダーは little endian + * byte order is little endian */ public ImaInputStream(InputStream in, int samplesPerBlock, @@ -106,10 +107,8 @@ public int read(byte[] b, int off, int len) throws IOException { } } } catch (IOException e) { -e.printStackTrace(System.err); + Debug.printStackTrace(e); } return i; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ima/ImaOutputStream.java b/src/main/java/vavi/sound/adpcm/ima/ImaOutputStream.java index 9a030f5..b2a0508 100644 --- a/src/main/java/vavi/sound/adpcm/ima/ImaOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/ima/ImaOutputStream.java @@ -23,7 +23,7 @@ public class ImaOutputStream extends FilterOutputStream { /** - * バイトオーダーは little endian + * byte order is little endian */ public ImaOutputStream(OutputStream out, int samplesPerBlock, @@ -51,5 +51,3 @@ public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ms/Ms.java b/src/main/java/vavi/sound/adpcm/ms/Ms.java index 2f3a623..5a9f3c4 100644 --- a/src/main/java/vavi/sound/adpcm/ms/Ms.java +++ b/src/main/java/vavi/sound/adpcm/ms/Ms.java @@ -441,5 +441,3 @@ public static int getBytesPerBlock(int channels, int samplesPerBlock) { return n; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ms/MsInputEngine.java b/src/main/java/vavi/sound/adpcm/ms/MsInputEngine.java index bdfc9b4..dbfb4b1 100644 --- a/src/main/java/vavi/sound/adpcm/ms/MsInputEngine.java +++ b/src/main/java/vavi/sound/adpcm/ms/MsInputEngine.java @@ -50,7 +50,6 @@ public MsInputEngine(OutputStream out, Debug.println(Level.FINE, "byteOrder: " + this.byteOrder); } - /* */ @Override public void initialize(InputStream in) throws IOException { if (this.in != null) { @@ -64,9 +63,9 @@ public void initialize(InputStream in) throws IOException { private int[] steps = new int[16]; /** - * {@link #in} が {@link #samplesPerBlock} * 2 しか読まないので {@link IOStreamInputEngine} の + * because {@link #in} reads only {@link #samplesPerBlock} * 2 bytes, bufferSize for * {@link IOStreamInputEngine#IOStreamInputEngine(OutputStream, vavix.io.IOStreamInputEngine.InputStreamFactory, int)} - * の bufferSize を {@link #samplesPerBlock} * 2 にすること。 + * of {@link IOStreamInputEngine} must be set {@link #samplesPerBlock} * 2. */ @Override public void execute() throws IOException { @@ -108,5 +107,3 @@ public void finish() throws IOException { out.close(); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ms/MsInputStream.java b/src/main/java/vavi/sound/adpcm/ms/MsInputStream.java index 574012f..f840581 100644 --- a/src/main/java/vavi/sound/adpcm/ms/MsInputStream.java +++ b/src/main/java/vavi/sound/adpcm/ms/MsInputStream.java @@ -25,7 +25,7 @@ public class MsInputStream extends FilterInputStream { /** - * バイトオーダーは little endian + * byte order little endian */ public MsInputStream(InputStream in, int samplesPerBlock, @@ -61,9 +61,9 @@ public MsInputStream(InputStream in, channels, blockSize, samplesPerBlock); -Debug.println(Level.FINE, "numSamples: " + numSamples); +Debug.println(Level.FINER, "numSamples: " + numSamples); this.available = numSamples * channels * bytesPerSample; -Debug.println(Level.FINE, "available: " + available); +Debug.println(Level.FINER, "available: " + available); } /** */ @@ -114,5 +114,3 @@ public int read(byte[] b, int off, int len) throws IOException { return i; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ms/MsOutputStream.java b/src/main/java/vavi/sound/adpcm/ms/MsOutputStream.java index 30f24c3..329fe60 100644 --- a/src/main/java/vavi/sound/adpcm/ms/MsOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/ms/MsOutputStream.java @@ -23,7 +23,7 @@ public class MsOutputStream extends FilterOutputStream { /** - * バイトオーダーは little endian + * byte order is little endian */ public MsOutputStream(OutputStream out, int samplesPerBlock, int channels) throws IOException { @@ -46,5 +46,3 @@ public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/oki/Oki.java b/src/main/java/vavi/sound/adpcm/oki/Oki.java index 54f2cac..c4ec79d 100644 --- a/src/main/java/vavi/sound/adpcm/oki/Oki.java +++ b/src/main/java/vavi/sound/adpcm/oki/Oki.java @@ -36,7 +36,7 @@ /** * OKI MSM6258 ADPCM voice synthesizer codec. *

    - * TODO 8 bit 対応 + * TODO support 8 bit *

    * @author Tetsuya Isaki * @author Naohide Sano (nsano) @@ -50,13 +50,13 @@ class Oki implements Codec { /** */ private int mc_estim; - /** 次回の PCM 値を予測するためのテーブル */ + /** table for next PCM value prediction */ private static final int[] adpcm_estimindex = { 2, 6, 10, 14, 18, 22, 26, 30, -2, -6, -10, -14, -18, -22, -26, -30 }; - /** 量子化幅 */ + /** quantizing width */ private static final int[] adpcm_estim = { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, @@ -65,17 +65,17 @@ class Oki implements Codec { 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 }; - /** 何するテーブル? */ + /** what for? */ private static final int[] adpcm_estimstep = { -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8 }; /** - * signed linear 16 の 1 サンプルを Oki ADPCM 1 サンプルに変換します。 + * Converts signed linear 16 1 sample into Oki ADPCM 1 sample. *

    - * MSM6258 が期待する PCM は 12bit 符号付 PCM (slinear12 にあたる) である。 - * 従ってこの関数では同時に振幅変換(16bit -> 12bit) も行なっている。 + * MSM6258 expect 12bit signed PCM (corresponds to slinear12), + * so amplitude conversion (16bit -> 12bit) is done also. *

    * * @param a 16bit signed linear pcm @@ -84,27 +84,25 @@ class Oki implements Codec { @Override public int encode(int a) { - // mc->mc_estim には、前回の差分比予測値インデックスが入っている + // `mc_estim` holds previous difference prediction index. int estim = this.mc_estim; int b; int s; - // df は、実 PCM 値 a と前回の予測 PCM 値との差分である + // `df` is difference between real PCM value `a` and predicted PCM value int df = a - this.mc_amp; - // dl は、差分比予測値テーブル adpcm_estim[] から、予測された - // 差分比を取り出したもの + // dl is difference ratio of predicted value from difference prediction table `adpcm_estim[]`. int dl = adpcm_estim[estim]; - // c は、差分を 12bit に変換し、(dl/8) に対する比率を出したもの。 - // /16 は 16bit と 12bit との差、すなわち 2^4 である。 - // *8 は、dl すなわち adpcm_estim[] の値が8倍値で記録してあること - // に起因する + // `c` is ratio of 12bit converted difference and `(dl/8)` + // `/16` is difference 16bit and 12bit, that means `2^4`. + // `*8` is `dl`, that means because `adpcm_estim[]` is stored multiple 8 times int c = (df / 16) * 8 / dl; - // c が正か負かによって処理が変わる。 - // ただし c は除算により 0 になっているかも知れず、その場合正として - // 扱われてしまうのを避けるため符号判定には df を用いている。 + // processing changes depending on `c` is positive or negative. + // except when `c` is 0 by division, avoiding the value is dealt as positive number, + // use `df` for determining sign // - // 実際にエンコードする ADPCM データは、符号ビットと振幅ビットの - // 組み合わせである。振幅ビットは c を 2 で割ったもの + // actual encoded ADPCM data consists a sign bit and amplitude bits. + // amplitude bits are division `c` by 2. if (df < 0) { b = -c / 2; s = 0x08; @@ -112,26 +110,25 @@ public int encode(int a) { b = c / 2; s = 0; } - // 振幅は 3bit なので、7 で制限する + // amplitude are 3bits, so limit by 7 if (b > 7) { b = 7; } - // こうしておくことで、以後 s は符号つき 4bit。 - // b は符号なしの絶対値として使い分けることができる + // by doing this, `s` will be a signed 4 bit from now on. + // `b` can be used as an unsigned absolute value s |= b; - // ここまでの変換で、振幅ビット b の実際の比率 c との関係は、 - // b : 比率範囲 c - // 0 : 0 <= 比率 < 2 - // 1 : 2 <= 比率 < 4 - // 2 : 4 <= 比率 < 6 - // 3 : 6 <= 比率 < 8 - // 4 : 8 <= 比率 < 10 - // 5 : 10 <= 比率 < 12 - // 6 : 12 <= 比率 < 14 - // 7 : 14 <= 比率 - // のようになる。 + // conversion so far, relation of amplitude bits `b` and real ratio `c` is below + // b : ratio range c + // 0 : 0 <= ratio < 2 + // 1 : 2 <= ratio < 4 + // 2 : 4 <= ratio < 6 + // 3 : 6 <= ratio < 8 + // 4 : 8 <= ratio < 10 + // 5 : 10 <= ratio < 12 + // 6 : 12 <= ratio < 14 + // 7 : 14 <= ratio // - // 次回のPCM値を予測する。すごくすっきりしているが、実際には + // prediction next PCM value. It's simply but actually // // static int adpcm_estimindex_0[16] = { // 1, 3, 5, 7, 9, 11, 13, 15, @@ -139,17 +136,17 @@ public int encode(int a) { // }; // mc->mc_amp += (short) (adpcm_estimindex_0[(int) s] * 16 / 8 * dl); // - // なのである。adpcm_estimindex_0[] は adpcm_estimindex[] の - // 1/2 値であり、この数列の意味は上記比率範囲の中央値である。 - // この比率に、16 = 2 ^ 4 を掛けて 16 bit 化し、(dl / 8) を掛けることに - // よって予測差分値が求められ、これを記録するのである。 - // そういうわけで、adpcm_estimindex[] をあらかじめ2倍しておくと - // すっきりするのである。 + // `adpcm_estimindex_0[]` is 1/2 of `adpcm_estimindex[]` + // and this array means median of ratio ranges above. + // multiplying it by `16 = 2 ^ 4`, make it 16 bit. and multiplying it by `(dl / 8)` + // prediction difference is calculated. then store it. + // that's because multiplying `adpcm_estimindex[]` by 2 in advance + // make it simple. this.mc_amp += adpcm_estimindex[s] * dl; - // b の値に従って、次回使用する差分比を予測し mc->mc_estim に - // 保存しておく。全部で 49 段階。 - // 余談であるが、ここだけだと adpcm_estimstep[16] は [8] でよい。 - // [16] なのは adpcm2pcm との関係上必要だからである。 + // predict next difference ratio using `b` then store it to `mc_estim`. + // those are all 49 steps. + // As a side note for only this method `adpcm_estimstep[16]` size [8] is enough. + // `adpcm2pcm` requires [16]. estim += adpcm_estimstep[b]; if (estim < 0) { estim = 0; @@ -162,10 +159,10 @@ public int encode(int a) { } /** - * Oki ADPCM 1 サンプルを signed linear 16 の 1 サンプルに変換します。 + * Converts Oki ADPCM 1 sample to signed linear 16 1 sample. *

    - * MSM6258 が出力する PCM は 12bit 符号付 PCM (slinear12 にあたる) である。 - * 従ってこの関数では同時に振幅変換(12bit -> 16bit) も行なっている。 + * output PCM by MSM6258 is 12bit signed PCM (corresponds to slinear12). + * so amplitude conversion (12bit -> 16bit) is done also. *

    * * @param b 4bit adpcm @@ -173,20 +170,20 @@ public int encode(int a) { */ @Override public int decode(int b) { - // mc->mc_estim には、前回の差分比予測値インデックスが入っている + // `mc_estim` holds previous difference prediction index. int estim = this.mc_estim; - // 実 PCM 値を計算している。本来の式は + // calc actual PCM value. originally a formula is // - // mc->mc_amp += adpcm_estim[estim] / 8 * adpcm_estimindex_0[b] * 16; + // mc.mc_amp += adpcm_estim[estim] / 8 * adpcm_estimindex_0[b] * 16; // - // である。pcm2adpcm_step() でも述べた通り adpcm_estim[] は8倍値で - // あるので 8 で割る。それに比率である adpcm_estimindex_0[] を掛ける。 - // 更に 12bit -> 16bit 変換のために 16 (= 2^4) を掛けている。 - // adpcm_estimindex_0[] * 2 は adpcm_estimindex[] であるので、 - // 上式は実際に使われている以下の式となる + // as described in `pcm2adpcm_step()` `adpcm_estim[]` are 8x values, + // divide by 8. then multiply it by a ratio of `adpcm_estimindex_0[]`. + // and then multiply it by `16 (= 2^4)` for 12bit -> 16bit conversion. + // `adpcm_estimindex_0[] * 2` is `adpcm_estimindex[]`, so + // a formula above become simply below this.mc_amp += adpcm_estim[estim] * adpcm_estimindex[b]; - // 次回の差分比を予測して mc->mc_estim に保存しておく + // predict next difference ration, then store it to `mc_estim` estim += adpcm_estimstep[b]; if (estim < 0) { @@ -200,5 +197,3 @@ public int decode(int b) { return this.mc_amp; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/oki/OkiInputStream.java b/src/main/java/vavi/sound/adpcm/oki/OkiInputStream.java index 08de790..648403e 100644 --- a/src/main/java/vavi/sound/adpcm/oki/OkiInputStream.java +++ b/src/main/java/vavi/sound/adpcm/oki/OkiInputStream.java @@ -29,13 +29,11 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 4bit little endian 固定 + * {@link vavi.io.BitInputStream} is 4bit little endian fixed * TODO PCM encoding */ public OkiInputStream(InputStream in, ByteOrder byteOrder) { - super(in, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); // oki adpcm は little endian 固定 + super(in, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); // oki adpcm is little endian fixed Debug.println(Level.FINE, this.in); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/oki/OkiOutputStream.java b/src/main/java/vavi/sound/adpcm/oki/OkiOutputStream.java index 2a4746d..1107384 100644 --- a/src/main/java/vavi/sound/adpcm/oki/OkiOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/oki/OkiOutputStream.java @@ -21,20 +21,17 @@ */ public class OkiOutputStream extends AdpcmOutputStream { - /** エンコーダ */ @Override protected Codec getCodec() { return new Oki(); } /** - * {@link vavi.io.BitOutputStream} は 4bit little endian 固定 + * {@link vavi.io.BitOutputStream} is 4bit little endian fixed * @param out ADPCM - * @param byteOrder #write(int) のバイトオーダ + * @param byteOrder byte order for #write(int) */ public OkiOutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/vox/Vox.java b/src/main/java/vavi/sound/adpcm/vox/Vox.java index 283374f..35768e0 100644 --- a/src/main/java/vavi/sound/adpcm/vox/Vox.java +++ b/src/main/java/vavi/sound/adpcm/vox/Vox.java @@ -111,5 +111,3 @@ private int adjust(int code) { return (c - 3) * 2; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/vox/VoxInputStream.java b/src/main/java/vavi/sound/adpcm/vox/VoxInputStream.java index 56525b7..9330967 100644 --- a/src/main/java/vavi/sound/adpcm/vox/VoxInputStream.java +++ b/src/main/java/vavi/sound/adpcm/vox/VoxInputStream.java @@ -28,8 +28,8 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 4bit big endian 固定 - * TODO vox は big endian ? + * {@link vavi.io.BitInputStream} is 4bit big endian fixed + * TODO vox is big endian ? */ public VoxInputStream(InputStream in, ByteOrder byteOrder) { super(in, byteOrder, 4, ByteOrder.BIG_ENDIAN); @@ -73,5 +73,3 @@ public int read() throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/vox/VoxOutputStream.java b/src/main/java/vavi/sound/adpcm/vox/VoxOutputStream.java index 91fe8b0..730ea38 100644 --- a/src/main/java/vavi/sound/adpcm/vox/VoxOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/vox/VoxOutputStream.java @@ -24,25 +24,21 @@ */ public class VoxOutputStream extends AdpcmOutputStream { - /** エンコーダ */ @Override protected Codec getCodec() { return new Vox(); } /** - * {@link vavi.io.BitInputStream} は 4bit big endian 固定 + * {@link vavi.io.BitInputStream} is 4bit big endian fixed * TODO check endian * @param out ADPCM - * @param byteOrder #write(int) のバイトオーダ + * @param byteOrder byte order for #write(int) */ public VoxOutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.BIG_ENDIAN); } - /** - * @param b - */ @Override public void write(int b) throws IOException { if (!flushed) { @@ -74,5 +70,3 @@ public void write(int b) throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/yamaha/Yamaha.java b/src/main/java/vavi/sound/adpcm/yamaha/Yamaha.java index d46af3b..728bbb5 100644 --- a/src/main/java/vavi/sound/adpcm/yamaha/Yamaha.java +++ b/src/main/java/vavi/sound/adpcm/yamaha/Yamaha.java @@ -27,7 +27,7 @@ private static class Status { private Status stat = new Status(); /** - * @param code ADPCM (LSB 4bit 有効) + * @param code ADPCM (LSB 4bit available) * @param ss ? * @return adjusted ss */ @@ -64,7 +64,7 @@ private int adjust(int code, int ss) { } /** - * @param code ADPCM (LSB 4bit 有効) + * @param code ADPCM (LSB 4bit available) * @return 16bit PCM signed */ @Override @@ -99,7 +99,7 @@ public int decode(int code) { /** * @param samp 16bit PCM signed - * @return ADPCM (LSB 4bit 有効) + * @return ADPCM (LSB 4bit available) */ @Override public int encode(int samp) { @@ -127,5 +127,3 @@ public int encode(int samp) { return code; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/yamaha/YamahaInputStream.java b/src/main/java/vavi/sound/adpcm/yamaha/YamahaInputStream.java index 1128f8e..95a7faa 100644 --- a/src/main/java/vavi/sound/adpcm/yamaha/YamahaInputStream.java +++ b/src/main/java/vavi/sound/adpcm/yamaha/YamahaInputStream.java @@ -27,12 +27,10 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 4bit little endian 固定 - * TODO ma は little endian ? + * {@link vavi.io.BitInputStream} is 4bit little endian fixed + * TODO ma is little endian? */ public YamahaInputStream(InputStream in, ByteOrder byteOrder) { super(in, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/yamaha/YamahaOutputStream.java b/src/main/java/vavi/sound/adpcm/yamaha/YamahaOutputStream.java index 51bcb0b..cf36b31 100644 --- a/src/main/java/vavi/sound/adpcm/yamaha/YamahaOutputStream.java +++ b/src/main/java/vavi/sound/adpcm/yamaha/YamahaOutputStream.java @@ -21,7 +21,6 @@ */ public class YamahaOutputStream extends AdpcmOutputStream { - /** エンコーダ */ @Override protected Codec getCodec() { return new Yamaha(); @@ -29,13 +28,11 @@ protected Codec getCodec() { /** * - * {@link vavi.io.BitOutputStream} は 4bit little endian 固定 + * {@link vavi.io.BitOutputStream} is 4bit little endian fixed * @param out ADPCM - * @param byteOrder {@link #write(int)} のバイトオーダ + * @param byteOrder byte order for {@link #write(int)} */ public YamahaOutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608.java b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608.java index be46d49..e5ed2b2 100644 --- a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608.java +++ b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608.java @@ -46,12 +46,12 @@ void next() { @Override public int encode(int pcm) { - // エンコード処理 2 + // encoding process 2 long dn = pcm - state.xn; //System.err.printf("%05d: %d, %d, %d\n", ccc, dn, pcm, state.xn); // OK - // エンコード処理 3, 4 - // I = | dn | / Sn から An を求める。 - // 乗数を使用して整数位で演算する。 + // encoding process 3, 4 + // calc An from "I = | dn | / Sn" + // calc using integer part of production. long i = (int) (((Math.abs(dn)) << 16) / ((state.stepSize) << 14)); //System.err.printf("%05d: %d\n", ccc, i); // OK if (i > 7) { @@ -59,16 +59,16 @@ public int encode(int pcm) { } int adpcm = (int) (i & 0xff); - // エンコード処理 5 - // L3 + L2 / 2 + L1 / 4 + 1 / 8 * stepSize を 8 倍して整数演算 + // encoding process 5 + // L3 + L2 / 2 + L1 / 4 + 1 / 8 * stepSize multiply 8 times and calc as integer i = (adpcm * 2L + 1) * state.stepSize / 8; //System.err.printf("%05d: %d, %d, %d\n", ccc, i, adpcm, state.stepSize); // OK - // 1 - 2 * L4 -> L4 が 1 の場合は -1 をかけるのと同じ + // if "1 - 2 * L4 -> L4" is 1 equals multiply -1 if (dn < 0) { - // - の場合符号ビットを付ける。 - // エンコード処理 5 で ADPCM 符号が邪魔になるので、 - // 予測値更新時まで保留した。 + // when - case, add a sign bit + // at encode process 5, sign of ADPCM is not necessary + // so holding it until prediction updating adpcm |= 0x8; state.xn -= i; } else { @@ -76,12 +76,12 @@ public int encode(int pcm) { } //System.err.printf("%05d: %d, %d\n", ccc, state.xn, i); - // エンコード処理 6 - // ステップサイズの更新 + // encode process 6 + // update step size state.stepSize = (stepsizeTable[adpcm] * state.stepSize) / 64; //System.err.printf("%05d: %d, %d, %d\n", ccc, i, adpcm, state.stepSize); // OK - // エンコード処理 7 + // encode process 7 if (state.stepSize < 127) { state.stepSize = 127; } else if (state.stepSize > 24576) { @@ -94,14 +94,14 @@ public int encode(int pcm) { } /** - * @param adpcm ADPCM (LSB 4 bit 有効) + * @param adpcm ADPCM (LSB 4 bit available) * @return PCM */ @Override public int decode(int adpcm) { - // デコード処理 2, 3 - // L3 + L2 / 2 + L1 / 4 + 1 / 8 * stepSize を 8 倍して整数演算 + // decode process 2, 3 + // L3 + L2 / 2 + L1 / 4 + 1 / 8 * stepSize multiply 8 times and calc as integer. long i = ((adpcm & 7) * 2 + 1) * state.stepSize / 8; if ((adpcm & 8) != 0) { state.xn -= i; @@ -110,16 +110,16 @@ public int decode(int adpcm) { } //System.err.printf("%05d: %d, %d, %d\n", state.count, state.xn, state.stepSize, adpcm); // OK - // デコード処理 4 + // decode process 4 if (state.xn > 32767) { state.xn = 32767; } else if (state.xn < -32768) { state.xn = -32768; } - // デコード処理 5 + // decode process 5 state.stepSize = state.stepSize * stepsizeTable[adpcm] / 64; - // デコード処理 6 + // decode process 6 if (state.stepSize < 127) { state.stepSize = 127; } else if (state.stepSize > 24576) { @@ -127,7 +127,7 @@ public int decode(int adpcm) { } // System.err.printf("%05d: %d, %d, %d\n", state.count, state.xn, state.stepSize, adpcm); // OK - // PCM で保存する + // store PCM int pcm = (int) state.xn; state.next(); @@ -135,5 +135,3 @@ public int decode(int adpcm) { return pcm; } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608InputStream.java b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608InputStream.java index eda01b3..7d519c5 100644 --- a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608InputStream.java +++ b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608InputStream.java @@ -27,11 +27,9 @@ protected Codec getCodec() { } /** - * {@link vavi.io.BitInputStream} は 4bit big endian 固定 + * {@link vavi.io.BitInputStream} is 4bit big endian fixed */ public Ym2608InputStream(InputStream in, ByteOrder byteOrder) { super(in, byteOrder, 4, ByteOrder.BIG_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608OutputStream.java b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608OutputStream.java index 38aaf3a..0bb2165 100644 --- a/src/main/java/vavi/sound/adpcm/ym2608/Ym2608OutputStream.java +++ b/src/main/java/vavi/sound/adpcm/ym2608/Ym2608OutputStream.java @@ -21,20 +21,17 @@ */ public class Ym2608OutputStream extends AdpcmOutputStream { - /** エンコーダ */ @Override protected Codec getCodec() { return new Ym2608(); } /** - * {@link vavi.io.BitOutputStream} は 4bit big endian 固定 + * {@link vavi.io.BitOutputStream} is 4bit big endian fixed * @param out ADPCM - * @param byteOrder #write(int) のバイトオーダ + * @param byteOrder byte order for #write(int) */ public Ym2608OutputStream(OutputStream out, ByteOrder byteOrder) { super(out, byteOrder, 4, ByteOrder.BIG_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/adpcm/ym2608/readme.md b/src/main/java/vavi/sound/adpcm/ym2608/readme.md index e9dc735..725d971 100644 --- a/src/main/java/vavi/sound/adpcm/ym2608/readme.md +++ b/src/main/java/vavi/sound/adpcm/ym2608/readme.md @@ -16,90 +16,116 @@ completed (maybe) none -## ADPCMの基礎知識、およびYM2608のADPCM仕様 +## Basic knowledge of ADPCM and the ADPCM specifications of YM2608 -[source](http://hackipedia.org/Platform/Sega/Genesis/hardware,%20FM%20synthesis,%20YM2608/html/adpcm.html) +[source](https://web.archive.org/web/20111013151432/http://hackipedia.org/Platform/Sega/Genesis/hardware,%20FM%20synthesis,%20YM2608/html/adpcm.html) ### ADPCM -ADPCMはMPEGと違い、リニアPCMデータに対して1サンプルの振幅情報を圧縮する方式である。 -ADPCMはサンプル間の差分を用いてデータ圧縮を行うという基本は変わらないが、コーデックの種類は多数存在し、YM2608のADPCM仕様もそのコーデックの1つである。 -多くのコーデックは1サンプルのデータを2~4ビットに変換し、このADPCM化されたデータは完全に元の波形に戻る事は無く、コーデックの性能は「元波形の再現性」に現れる。 +ADPCM differs from MPEG in that it compresses the amplitude information of one sample of linear PCM data. The basic +principle of ADPCM is that data compression is performed using differences between samples, but there are many types of +codecs, and the YM2608 ADPCM specification is one of these codecs. Many codecs convert one sample of data into 2 to 4 +bits, and this ADPCM data does not completely return to its original waveform, and the performance of the codec is +reflected in its "reproducibility of the original waveform." + +In the case of 16-bit linear PCM, a maximum of 16 bits of information is required to express the difference from the +previous sample, but if this is recorded as is (DPCM format), the data cannot be reduced. Therefore, ADPCM compresses +data by sacrificing the accuracy of the difference. Specifically, this process dynamically changes the step size +according to the encoding calculation rules of the codec, and converts each difference value to 2 to 4 bits of +precision. + +For example, YM2608 ADPCM has 4 bits of information, so there are 16 types of predicted amplitude values divided by +step size. Since the difference is divided into halves depending on whether the difference is positive or negative, +there are eight types of predicted values that are actually applied, and the encoder selects the location closest to +these eight types of predicted values. Furthermore, the predicted values for two of these points are treated as +meaning outside the predicted value range, which is either lower or higher, so there are six types of predicted values +with the smallest error. ADPCM encoding performs conversion processing into a 4-bit value while comparing the actual +difference value and the predicted value in this way. + +The step size is the resolution width of one sample, and 16-bit PCM with a step size of 1 is expressed in 65536 steps +from 0 to 65535. 16-bit PCM with a step size of 4 is expressed in 16384 steps from 0x0000 to 0xFFFC, where the lower two +bits are 0. If the step size is 8192, it is expressed in 16 steps from 0x0000 to 0xF000 with the lower 12 bits set to 0. +In brute force, 8-bit PCM can also be expressed as 16-bit PCM with a step size of 256 (although the recording range is +the upper 8 bits). The step size is also called the quantization width. + +For this reason, when converting the step size from a small value to a large value (ADPCM encoding), the waveform +accuracy deteriorates as the error between the difference value and the boundary value of the step size increases. +Furthermore, even when conversion (ADPCM decoding) is performed to restore the step size to its original value, the +information corresponding to the lost precision cannot be reproduced. This means +sacrificing "the reproducibility of the original waveform" and "the accuracy of the difference." + +Dynamic changes in step size are updated by codec encoding operations for each sample. This is because if the step size +is recorded as data, data compression will not be efficient. If an appropriate step size for the original waveform is +used during encoding, the conversion accuracy can be kept as high as possible. This means that the better the encoder +and its waveform prediction rules, the higher the recovery rate of ADPCM data. -16ビットのリニアPCMの場合、前サンプルとの差分を表現するには最大16ビット分の情報が必要となるが、これをそのまま記録(DPCM形式)したのではデータを小さくする事ができない。 -そこでADPCMは「差分の精度を犠牲」にする事でデータを圧縮する。 -具体的にはステップサイズをコーデックのエンコード演算ルールに従い動的変化させ、各差分値を2~4ビットの精度へ変換する処理である。 +### Encoding -たとえばYM2608のADPCMでは4ビットの情報を持つので、ステップサイズにて分割された予測される振幅値は16種類存在する。 -差分の正負で半分に分かれる為、実際に適用する予測値は8種類になり、エンコーダはこの8種類の予測値にもっとも近い場所を選びだす。 -さらにこのうち2点の予測値は、よりLowerかよりHigherな予測値範囲外の意味として扱われるため、もっとも誤差の小さい予測値は6種類になる。 -このように実際の差分値と予測値を比較しながら4ビットの値に変換処理を行うのがADPCMエンコードである。 +YM2608's ADPCM algorithm is relatively simple. YM2608's ADPCM converts 16-bit PCM to 4-bit ADPCM data. Also, the step +size is bounded by a linear range of 1/4 unit. This encoding procedure is described below. -ステップサイズとは1サンプルの分解能幅の事であり、ステップサイズが1の16ビットPCMは0~65535の65536段階で表現する。 -ステップサイズが4の16ビットPCMは下位2ビットが0である0x0000~0xFFFCの16384段階で表現する。 -ステップサイズが8192の場合、下位12ビットを0にした0x0000~0xF000の16段階で表現する。 -強引な表現では、8ビットPCMはステップサイズが256の16ビットPCMという表現も可能である(ただし記録する範囲は上位8ビットだが)。 -ステップサイズは量子化幅とも呼ばれる。 +1. Initialize the predicted value and step size along with obtaining the first sample X1. The initial value of the + predicted value x0=0, and the initial value of the step size S0=127. -この為、ステップサイズを小さい値から大きい値に変換(ADPCMエンコード)した場合、差分値とステップサイズの境界値との誤差が大きいほど波形精度が悪くなる。 -またステップサイズを元に戻す変換(ADPCMデコード)をした場合も、落とされた精度分の情報を再現する事ができない。 -これが「元波形の再現性」と「差分の精度を犠牲」にするという意味である。 +2. To find the ADPCM data An, calculate the difference between Xn and the predicted value xn, and find the difference + ⊿n. -ステップサイズの動的変更は、各サンプル毎のコーデックエンコード演算によって更新される。 -これはステップサイズまでデータとして記録すると、データ圧縮として効率的で無くなる為である。 -エンコードの際に、元波形に対する適切なステップサイズが適宜使用されれば、その変換精度をなるべく高く保つ事が可能である。 -これはそのエンコーダと、その波形予測ルールが優秀であるほど、ADPCM化されたデータの復元率が高くなる事を表す。 +3. Divide the absolute value of ⊿n by Sn (I=|⊿n|/Sn) and determine the lower 3 bits from the operation result of I as + shown in the table below. -ADPCMはMPEGと違いリアルタイムエンコード時のレイテンシーの低さが特徴である。 -MPEG形式の周波数帯域圧縮はある一定時間(512サンプル)のサンプリングデータに対して圧縮しなければならない。 -これに対してADPCMは、1~3サンプル程度のデータから圧縮が可能であり、音声通信によるレイテンシを大きく下げる事が可能である。 +| An | L3 | L2 | L1 | I= ⊿n|/Sn | f | +|:--:|:--:|:--:|:--:|:---------------------|:------:| +| 0 | 0 | 0 | 0 | I < 1/4 | 57/64 | +| 1 | 0 | 0 | 1 | 1/4 <= I < 2/4 | 57/64 | +| 2 | 0 | 1 | 0 | 2/4 <= I < 1/4 | 57/64 | +| 3 | 0 | 1 | 1 | 3/4 <= I < 4/4 | 57/64 | +| 4 | 1 | 0 | 0 | 4/4 <= I < 5/4 | 77/64 | +| 5 | 1 | 0 | 1 | 5/4 <= I < 6/4 | 102/64 | +| 6 | 1 | 1 | 0 | 6/4 <= I < 7/4 | 128/64 | +| 7 | 1 | 1 | 1 | 7/4 <= I | 153/64 | -### Encoding +If the division value I between ⊿n and Sn is 1/4 or more and less than 2/4, An is determined to be 1. In other words, if +the actual difference exceeds the predicted step size (less than 1/4 or more than 7/4), it may deviate significantly +from the predicted value, and this will begin to affect data reproducibility. represents. + +4. If ⊿n is positive, set the most significant bit (bit 4) of An to 0; if ⊿n is negative, set it to 1. + +5. Find the predicted value x(n+1). The predicted value is updated using each bit value of An and the following formula. -YM2608のADPCMアルゴリズムは比較的単純である。 -YM2608のADPCMは16ビットのPCMを4ビットのADPCMデータに変換する。 -またステップサイズは1/4単位の線形範囲による境界となる。 -以下にこのエンコード手順を記載する。 - - * 最初のサンプル X1 の取得と共に、予測値とステップサイズを初期化する。
    -予測値の初期値 x0=0、ステップサイズの初期値 S0=127である。 - * ADPCMデータ An を求めるには Xn と予測値 xn の差を演算し、差分 ⊿n を求める。
    -⊿n の絶対値を Sn で分割し( I=|⊿n|/Sn )、以下の表のようにIの演算結果から下位3ビットを決定する。
    - -|An|L3|L2|L1|I=|⊿n|/Sn|f| -|:--:|:--:|:--:|:--:|:--:|:--:| -|0|0|0|0|I < 1/4|57/64| -|1|0|0|1|1/4 <= I < 2/4|57/64| -|2|0|1|0|2/4 <= I < 1/4|57/64| -|3|0|1|1|3/4 <= I < 4/4|57/64| -|4|1|0|0|4/4 <= I < 5/4|77/64| -|5|1|0|1|5/4 <= I < 6/4|102/64| -|6|1|1|0|6/4 <= I < 7/4|128/64| -|7|1|1|1|7/4 <= I|153/64| - -⊿n と Sn の分割値 I が1/4以上かつ2/4未満であれば An は1というように求める。 -つまり実際の差分が予測ステップサイズを超える精度になった場合(1/4未満や7/4以上)、予測値を大きく外れている可能性があり、これはデータ再現性に影響が出始める事を表す。 - * `⊿n` が正の場合は An の最上位ビット(ビット4)を0、負の場合は1にする。 - * 予測値 x(n+1) を求める。予測値の更新には An の各ビット値と以下の式を用いて求める。
    -```x -x(n+1) = ( 1-2xL4 ) x ( L3 + L2/2 + L1/4 + 1/8 ) x ⊿n + xn ``` - * ステップサイズ `S(n+1)` を求める。ステップサイズの更新には、An の下位3ビットと上記表の f との関係を用いて求める。
    +x(n+1) = (1 - 2 x L4) x (L3 + L2 / 2 + L1 / 4 + 1 / 8) x ⊿n + xn ``` -S(n+1) = f( An ) x Sn + +6. Find the step size S(n+1). The step size is updated using the relationship between the lower 3 bits of An and f in + the table above. + ``` - * ステップサイズ Sn を飽和する。YM2608のADPCMステップサイズは最小127、最大24576と決められている。 - * データの終端まで2~7を繰り返す。 +S(n+1) = f(An) x Sn +``` + +7. Saturate the step size Sn. The ADPCM step size of YM2608 is determined to be a minimum of 127 and a maximum of 24576. + +8. Repeat steps 2 to 7 until the end of the data. ### Decoding -エンコードの5と6が予測値とステップサイズを求める式となり、予測値 xn が復元値 Xn になる。 +Encoding 5 and 6 are the formulas for calculating the predicted value and step size, and the predicted value xn becomes +the restored value Xn. + +1. Initialize the predicted value and step size while acquiring the first ADPCM sample A1. The initial value of the + predicted value x0=0, and the initial value of the step size S0=127. + +2. Find the predicted value x(n+1). To update the predicted value, use each bit value of An and the table as in + encoding. + +3. Let the predicted value x(n+1) be the restored value X(n). + +4. Clip the restored value X(n) to the range of -32768 to 32767 as appropriate. + +5. Find the step size S(n+1). The step size is updated using the relationship between the lower 3 bits of An and f in + the table above. + +6.Saturate the step size S(n+1). The ADPCM step size of YM2608 is determined to be a minimum of 127 and a maximum of +24576. - * 最初のADPCMサンプル `A1` の取得と共に、予測値とステップサイズを初期化する。
    -予測値の初期値 `x0=0`、ステップサイズの初期値 `S0=127`である。 - * 予測値 `x(n+1)` を求める。予測値の更新にはエンコード同様 `An` の各ビット値と表を用いて求める。 - * 予測値 `x(n+1)` を復元値 `X(n)` とする。 - * 復元値 `X(n)` を`-32768~32767`の範囲に適宜クリッピングする。 - * ステップサイズ `S(n+1)` を求める。ステップサイズの更新には、An の下位3ビットと上記表の f との関係を用いて求める。 - * ステップサイズ `S(n+1)` を飽和する。YM2608のADPCMステップサイズは最小127、最大24576と決められている。 - * ADPCMデータの終端まで2~6を繰り返す。 +7.Repeat steps 2 to 6 until the end of ADPCM data. diff --git a/src/main/java/vavi/sound/mfi/ChannelMessage.java b/src/main/java/vavi/sound/mfi/ChannelMessage.java index 1e5bfe7..1c87f38 100644 --- a/src/main/java/vavi/sound/mfi/ChannelMessage.java +++ b/src/main/java/vavi/sound/mfi/ChannelMessage.java @@ -8,11 +8,11 @@ /** - * チャンネルナンバに依存する {@link MfiMessage} を表すクラスです。 + * Represents {@link MfiMessage} depends on channel number. *

    - * MIDI にあわせるためにこの名前を Voice ... の代わりに用いています。 + * using this name to match MIDI api instead of Voice ... *

    - *
  • javax.sound.midi パッケージにはない... いるのか? + *
  • is this really needed? no class in the package javax.sound.midi * @author Naohide Sano (nsano) * @version 0.00 031203 nsano initial version
    */ @@ -24,5 +24,3 @@ public interface ChannelMessage { /** */ void setVoice(int voice); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/InvalidMfiDataException.java b/src/main/java/vavi/sound/mfi/InvalidMfiDataException.java index 2a03d80..7658c45 100644 --- a/src/main/java/vavi/sound/mfi/InvalidMfiDataException.java +++ b/src/main/java/vavi/sound/mfi/InvalidMfiDataException.java @@ -30,5 +30,3 @@ public InvalidMfiDataException(Throwable t) { super(t); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/LongMessage.java b/src/main/java/vavi/sound/mfi/LongMessage.java index c90568e..cdc928d 100644 --- a/src/main/java/vavi/sound/mfi/LongMessage.java +++ b/src/main/java/vavi/sound/mfi/LongMessage.java @@ -10,9 +10,9 @@ /** * LongMessage. *

    - * MFi 仕様の"拡張ステータス A"を表します。 + * Represents MFi specs. "Extended Status A". *

    - *
  • javax.sound.midi パッケージにはない。(MFi オリジナル) + *
  • not in javax.sound.midi package.(MFi original) * @author Naohide Sano (nsano) * @version 0.00 070116 nsano initial version
    */ @@ -22,8 +22,8 @@ public abstract class LongMessage extends MfiMessage { * * @param delta * @param status - * @param data1 拡張ステータス番号 - * @param data2 機能の値 + * @param data1 extended status number + * @param data2 function number */ public LongMessage(int delta, int status, int data1, byte[] data2) { super(new byte[3 + data2.length]); @@ -40,8 +40,8 @@ public int getCommand() { } /** - * data (0 ~ 2 ヘッダ無し) - * @return コピー + * data (0 ~ 2 no header) + * @return copied data */ public byte[] getData() { byte[] tmp = new byte[this.length - 3]; @@ -49,5 +49,3 @@ public byte[] getData() { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MetaEventListener.java b/src/main/java/vavi/sound/mfi/MetaEventListener.java index e51d58d..51262ce 100644 --- a/src/main/java/vavi/sound/mfi/MetaEventListener.java +++ b/src/main/java/vavi/sound/mfi/MetaEventListener.java @@ -19,5 +19,3 @@ public interface MetaEventListener extends EventListener { void meta(MetaMessage meta); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MetaMessage.java b/src/main/java/vavi/sound/mfi/MetaMessage.java index c986021..3b5bae6 100644 --- a/src/main/java/vavi/sound/mfi/MetaMessage.java +++ b/src/main/java/vavi/sound/mfi/MetaMessage.java @@ -10,7 +10,7 @@ /** * MetaMessage. *

    - * 拡張情報に準拠。 + * Extended Information compliant *

    *
      * this class {@link #data} in [MFi meta]
    @@ -50,7 +50,7 @@ public void setMessage(int type, byte[] data, int length)
     
             tmp[0] = (byte) 0x00; // delta time always 0
             tmp[1] = (byte) 0xff; // normal
    -        tmp[2] = (byte) 0xfd; // 拡張情報空番 0xfd を勝手に(TODO) Meta とする
    +        tmp[2] = (byte) 0xfd; // use Extended Information vacant number 0xfd as Meta arbitrarily TODO
             tmp[3] = (byte) (((length + 1) / 0x100) & 0xff);
             tmp[4] = (byte) (((length + 1) % 0x100) & 0xff);
             tmp[5] = (byte) type;
    @@ -60,7 +60,7 @@ public void setMessage(int type, byte[] data, int length)
         }
     
         /**
    -     * Meta 番号
    +     * Meta number
          * 

    * {@link javax.sound.midi.MetaMessage} compatible. *

    @@ -70,11 +70,11 @@ public int getType() { } /** - * data (ヘッダ、先頭の Meta type は無し) + * data (header, without top Meta type) *

    * {@link javax.sound.midi.MetaMessage} compatible. *

    - * @return コピー + * @return copied data */ public byte[] getData() { byte[] tmp = new byte[this.length - HEADER_LENGTH]; @@ -82,5 +82,3 @@ public byte[] getData() { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MfiDevice.java b/src/main/java/vavi/sound/mfi/MfiDevice.java index f25bb36..d46f486 100644 --- a/src/main/java/vavi/sound/mfi/MfiDevice.java +++ b/src/main/java/vavi/sound/mfi/MfiDevice.java @@ -7,7 +7,6 @@ package vavi.sound.mfi; - /** * MfiDevice. * @@ -87,5 +86,3 @@ public final String toString() { /** */ void open() throws MfiUnavailableException; } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MfiEvent.java b/src/main/java/vavi/sound/mfi/MfiEvent.java index 1958702..5552a27 100644 --- a/src/main/java/vavi/sound/mfi/MfiEvent.java +++ b/src/main/java/vavi/sound/mfi/MfiEvent.java @@ -8,7 +8,7 @@ /** - * MFi のイベントです. + * MFi Event.. * * @author Naohide Sano (nsano) * @version 0.00 020627 nsano initial version
    @@ -48,5 +48,3 @@ public long getTick() { return tick; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MfiFileFormat.java b/src/main/java/vavi/sound/mfi/MfiFileFormat.java index e96bb87..16c955d 100644 --- a/src/main/java/vavi/sound/mfi/MfiFileFormat.java +++ b/src/main/java/vavi/sound/mfi/MfiFileFormat.java @@ -15,7 +15,7 @@ */ public class MfiFileFormat { - /** ファイルすべての長さ */ + /** total file length */ protected int byteLength; /** */ @@ -27,7 +27,7 @@ public MfiFileFormat(int type, int bytes) { this.byteLength = bytes; } - /** ファイルすべての長さを取得します。 */ + /** Gets total file length. */ public int getByteLength() { return byteLength; } @@ -37,5 +37,3 @@ public int getType() { return type; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MfiMessage.java b/src/main/java/vavi/sound/mfi/MfiMessage.java index 71ad20c..3e6fbf3 100644 --- a/src/main/java/vavi/sound/mfi/MfiMessage.java +++ b/src/main/java/vavi/sound/mfi/MfiMessage.java @@ -10,7 +10,7 @@ /** - * Mfi メッセージの基底クラスです. + * Mfi Message base class. *
      * +--+--+--+--+--+--+--+--+-
      * |Δ|ST|D1 D2 ...
    @@ -50,7 +50,7 @@ public abstract class MfiMessage
         protected int length;
     
         /**
    -     * @after {@link #length} が設定される
    +     * @after {@link #length} will be set
          */
         protected MfiMessage(byte[] data) {
             this.data = data;
    @@ -60,7 +60,7 @@ protected MfiMessage(byte[] data) {
         }
     
         /**
    -     * メッセージのバイト配列を設定します.
    +     * Sets message of byte array.
          */
         protected void setMessage(byte[] data, int length)
             throws InvalidMfiDataException {
    @@ -77,8 +77,8 @@ protected void setMessage(byte[] data, int length)
         }
     
         /**
    -     * メッセージのバイト配列を取得します.
    -     * @return コピー
    +     * Gets message of byte array.
    +     * @return copied data
          */
         public byte[] getMessage() {
             byte[] returnedArray = new byte[length];
    @@ -86,34 +86,32 @@ public byte[] getMessage() {
             return returnedArray;
         }
     
    -    /** 前のデータが実行されてからの時間を取得します. */
    +    /** Gets time since previous data is proceeded. */
         public int getDelta() {
             if (length > 0) {
                 return data[0] & 0xff;
             }
    -        return 0;  // TODO this.data が設定されていない場合
    +        return 0;  // TODO when this.data is not set
         }
     
         /**
    -     * delta を設定します.
    +     * Sets delta..
          * @param delta delta
          */
         public void setDelta(int delta) {
             this.data[0] = (byte) (delta & 0xff);
         }
     
    -    /** ステータス情報を取得します. */
    +    /** Gets status information. */
         public int getStatus() {
             if (length > 1) {
                 return data[1] & 0xff;
             }
    -        return 0;  // TODO this.data が設定されていない場合
    +        return 0;  // TODO when this.data is not set
         }
     
    -    /** メッセージの長さを取得します. */
    +    /** Gets message length. */
         public int getLength() {
             return length;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/MfiSystem.java b/src/main/java/vavi/sound/mfi/MfiSystem.java
    index 31f0917..683270d 100644
    --- a/src/main/java/vavi/sound/mfi/MfiSystem.java
    +++ b/src/main/java/vavi/sound/mfi/MfiSystem.java
    @@ -41,30 +41,30 @@
      */
     public final class MfiSystem {
     
    -    /** アクセスできません。 */
    +    /** cannot be access */
         private MfiSystem() {
         }
     
    -    /** デフォルトプロバイダからすべてのデバイスを取得します。 */
    +    /** Gets all device from the default provider */
         public static MfiDevice.Info[] getMfiDeviceInfo() {
    -        return provider.getDeviceInfo(); // TODO プロバイダまわすべき
    +        return provider.getDeviceInfo(); // TODO should search all providers
         }
     
    -    /** デフォルトプロバイダから指定した情報のデバイスを取得します。 */
    +    /** Get device by specified info from the default provider. */
         public static MfiDevice getMfiDevice(MfiDevice.Info info)
             throws MfiUnavailableException {
     
    -        return provider.getDevice(info); // TODO プロバイダまわすべき
    +        return provider.getDevice(info); // TODO should search all providers
         }
     
         /**
    -     * デフォルトプロバイダからシーケンサを取得します。
    +     * Get a sequencer from the default provider.
          * 

    - * {@link #getSequencer()} で再生する場合は - * システムプロパティ javax.sound.midi.Sequencer"#Real Time Sequencer" - * を明示するようにしてください。"Java MIDI(MFi/SMAF) ADPCM Sequencer" が - * デフォルトシーケンサになった場合、{@link #getMetaEventListener()}で取得できるリスナー - * が重複して登録されてしまいます。 + * when playing by {@link #getSequencer()}, + * set system property javax.sound.midi.Sequencer "#Real Time Sequencer" + * unless if "Java MIDI(MFi/SMAF) ADPCM Sequencer" become + * default sequencer, listeners get by {@link #getMetaEventListener()} are + * registered duplicate. *

    */ public static Sequencer getSequencer() @@ -77,11 +77,11 @@ public static Sequencer getSequencer() return (Sequencer) device; } } - // TODO なければ他のプロバイダを探すべき + // TODO should search other providers when not found throw new MfiUnavailableException("no sequencer available"); } - /** MIDI シーケンサに付加するリスナを取得します。 */ + /** Gets a listener to add MIDI sequencer. */ public static javax.sound.midi.MetaEventListener getMetaEventListener() throws MfiUnavailableException { @@ -93,11 +93,11 @@ public static javax.sound.midi.MetaEventListener getMetaEventListener() } } - // TODO なければ他のプロバイダを探すべき + // TODO should search other providers when not found throw new MfiUnavailableException("no MetaEventListener available"); } - /** デフォルトプロバイダから MIDI - MFi コンバータを取得します。 */ + /** Gets a MIDI - MFi converter from the default provider. */ public static MidiConverter getMidiConverter() throws MfiUnavailableException { @@ -108,7 +108,7 @@ public static MidiConverter getMidiConverter() return (MidiConverter) device; } } - // TODO なければ他のプロバイダを探すべき + // TODO should search other providers when not found throw new MfiUnavailableException("no midiConverter available"); } @@ -122,19 +122,18 @@ public static Sequence toMfiSequence(javax.sound.midi.Sequence sequence) } /** - * MIDI シーケンスを MFi シーケンスに変換します。 + * Convert a MIDI sequence into a MFi sequence. * @param type midi file type * @see MfiFileFormat#type */ - public static Sequence toMfiSequence(javax.sound.midi.Sequence sequence, - int type) + public static Sequence toMfiSequence(javax.sound.midi.Sequence sequence, int type) throws InvalidMidiDataException, MfiUnavailableException { MidiConverter converter = MfiSystem.getMidiConverter(); return converter.toMfiSequence(sequence, type); } - /** MFi シーケンスを MIDI シーケンスに変換します。 */ + /** Convert a MFi sequence into a MIDI sequence. */ public static javax.sound.midi.Sequence toMidiSequence(Sequence sequence) throws InvalidMfiDataException, MfiUnavailableException { @@ -143,10 +142,9 @@ public static javax.sound.midi.Sequence toMidiSequence(Sequence sequence) return converter.toMidiSequence(sequence); } - /** MFi ファイルフォーマットを取得します。 */ + /** Gets MFi file format. */ public static MfiFileFormat getMfiFileFormat(InputStream stream) - throws InvalidMfiDataException, - IOException { + throws InvalidMfiDataException, IOException { //Debug.println("readers: " + readers.length); for (MfiFileReader reader : readers) { @@ -162,26 +160,20 @@ public static MfiFileFormat getMfiFileFormat(InputStream stream) throw new InvalidMfiDataException("unsupported stream: " + stream); } - /** MFi ファイルフォーマットを取得します。 */ - public static MfiFileFormat getMfiFileFormat(File file) - throws InvalidMfiDataException, - IOException { + /** Gets MFi file format. */ + public static MfiFileFormat getMfiFileFormat(File file) throws InvalidMfiDataException, IOException { return getMfiFileFormat(new BufferedInputStream(Files.newInputStream(file.toPath()))); } - /** MFi ファイルフォーマットを取得します。 */ - public static MfiFileFormat getMfiFileFormat(URL url) - throws InvalidMfiDataException, - IOException { + /** Gets MFi file format. */ + public static MfiFileFormat getMfiFileFormat(URL url) throws InvalidMfiDataException, IOException { return getMfiFileFormat(new BufferedInputStream(url.openStream())); } - /** MFi シーケンスを取得します。 */ - public static Sequence getSequence(InputStream stream) - throws InvalidMfiDataException, - IOException { + /** Gets a MFi sequence. */ + public static Sequence getSequence(InputStream stream) throws InvalidMfiDataException, IOException { //Debug.println("readers: " + readers.length); for (MfiFileReader reader : readers) { @@ -198,23 +190,19 @@ public static Sequence getSequence(InputStream stream) throw new InvalidMfiDataException("unsupported stream: " + stream); } - /** MFi シーケンスを取得します。 */ - public static Sequence getSequence(File file) - throws InvalidMfiDataException, - IOException { + /** Gets a MFi sequence. */ + public static Sequence getSequence(File file) throws InvalidMfiDataException, IOException { return getSequence(new BufferedInputStream(Files.newInputStream(file.toPath()))); } - /** MFi シーケンスを取得します。 */ - public static Sequence getSequence(URL url) - throws InvalidMfiDataException, - IOException { + /** Gets a MFi sequence. */ + public static Sequence getSequence(URL url) throws InvalidMfiDataException, IOException { return getSequence(new BufferedInputStream(url.openStream())); } - /** サポートする MFi ファイルタイプを取得します。 */ + /** Gets supported MFi file types. */ public static int[] getMfiFileTypes() { List types = new ArrayList<>(); for (MfiFileWriter writer : writers) { @@ -232,7 +220,7 @@ public static int[] getMfiFileTypes() { return result; } - /** 指定したシーケンスに対応する MFi ファイルタイプを取得します。 */ + /** Get a MFi file type by specified sequence. */ public static int[] getMfiFileTypes(Sequence sequence) { List types = new ArrayList<>(); for (MfiFileWriter writer : writers) { @@ -250,19 +238,18 @@ public static int[] getMfiFileTypes(Sequence sequence) { return result; } - /** ファイルタイプがサポートされるかどうかを返します。 */ + /** Returns if a file type is supported or not. */ public static boolean isFileTypeSupported(int fileType) { return StreamSupport.stream(writers.spliterator(), false).anyMatch(w -> w.isFileTypeSupported(fileType)); } - /** ファイルタイプが指定したシーケンスでサポートされるかどうかを返します。 */ + /** Returns if a file type is supported or not by specified sequence. */ public static boolean isFileTypeSupported(int fileType, Sequence sequence) { return StreamSupport.stream(writers.spliterator(), false).anyMatch(w -> w.isFileTypeSupported(fileType, sequence)); } - /** MFi or MIDI で書き出します。 */ - public static int write(Sequence in, int fileType, OutputStream out) - throws IOException { + /** write MFi or MIDI */ + public static int write(Sequence in, int fileType, OutputStream out) throws IOException { for (MfiFileWriter writer : writers) { if (writer.isFileTypeSupported(fileType, in)) { @@ -273,27 +260,26 @@ public static int write(Sequence in, int fileType, OutputStream out) return 0; } - /** MFi or MIDI で書き出します。 */ - public static int write(Sequence in, int fileType, File out) - throws IOException { + /** write MFi or MIDI */ + public static int write(Sequence in, int fileType, File out) throws IOException { return write(in, fileType, new BufferedOutputStream(Files.newOutputStream(out.toPath()))); } - //------------------------------------------------------------------------- + //---- - /** all プロバイダ */ + /** all providers */ private static ServiceLoader providers; - /** all リーダ */ + /** all readers */ private static ServiceLoader readers; - /** all ライタ */ + /** all writers */ private static ServiceLoader writers; - /** default プロバイダ */ + /** default provider */ private static MfiDeviceProvider provider; /* - * default は MfiSystem.properties で指定します。 + * default is specified by MfiSystem.properties. *
  • vavi.sound.mfi.spi.MfiDeviceProvider */ static { @@ -321,5 +307,3 @@ public static int write(Sequence in, int fileType, File out) } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MfiUnavailableException.java b/src/main/java/vavi/sound/mfi/MfiUnavailableException.java index 7973dcf..8f6f030 100644 --- a/src/main/java/vavi/sound/mfi/MfiUnavailableException.java +++ b/src/main/java/vavi/sound/mfi/MfiUnavailableException.java @@ -30,5 +30,3 @@ public MfiUnavailableException(Throwable t) { super(t); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/MidiConverter.java b/src/main/java/vavi/sound/mfi/MidiConverter.java index a30ea68..94dbda5 100644 --- a/src/main/java/vavi/sound/mfi/MidiConverter.java +++ b/src/main/java/vavi/sound/mfi/MidiConverter.java @@ -11,7 +11,7 @@ /** * MidiConverter. - *
  • javax.sound.midi パッケージにはない。(MFi オリジナル) + *
  • not in javax.sound.midi package (MFi original) * * @author Naohide Sano (nsano) * @version 0.00 030819 nsano initial version
    @@ -19,18 +19,16 @@ */ public interface MidiConverter extends MfiDevice { - /** */ + /** Converts to a MFi sequence from a MIDI sequence. */ @Deprecated Sequence toMfiSequence(javax.sound.midi.Sequence sequence) throws InvalidMidiDataException; - /** */ + /** Converts to a MFi sequence from a MIDI sequence. */ Sequence toMfiSequence(javax.sound.midi.Sequence sequence, int type) throws InvalidMidiDataException; - /** */ + /** Converts to a MFi sequence from a MIDI sequence. */ javax.sound.midi.Sequence toMidiSequence(Sequence sequence) throws InvalidMfiDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/NoteMessage.java b/src/main/java/vavi/sound/mfi/NoteMessage.java index f28283b..5cb89e2 100644 --- a/src/main/java/vavi/sound/mfi/NoteMessage.java +++ b/src/main/java/vavi/sound/mfi/NoteMessage.java @@ -7,7 +7,7 @@ package vavi.sound.mfi; /** - * 音符を表すメッセージです. + * Represent note message. * * @author Naohide Sano (nsano) * @version 0.10 020627 nsano MFi2 compliant
    @@ -18,16 +18,16 @@ */ public class NoteMessage extends MfiMessage implements ChannelMessage { - /** 音階 0 ~ 0x3e */ + /** note 0 ~ 0x3e */ private int note; /** voice No. 0 ~ 3 */ private int voice; - /** 音長 (delta) */ + /** length (delta) */ private int gateTime; - /** 音強 0 ~ 63 */ + /** velocity 0 ~ 63 */ private int velocity; /** - * オクターブシフト + * Octave shift. *
          * 01 up 1 octave
          * 00 no shift
    @@ -64,7 +64,7 @@ public NoteMessage(int delta, int status, int data) {
     
         /**
          * Creates a note message for MFi2.
    -     * note = 1 の場合
    +     * when note = 1.
          *
          * @param delta delta time
          * @param status see below
    @@ -103,8 +103,8 @@ protected NoteMessage() {
         }
     
         /**
    -     * 音階を取得します.
    -     * @return 音階
    +     * Gets note.
    +     * @return note
          */
         public int getNote() {
             switch (shift) {
    @@ -122,8 +122,8 @@ public int getNote() {
         }
     
         /**
    -     * 音階を設定します.
    -     * @param note MFi の音階
    +     * Sets note.
    +     * @param note MFi note
          */
         public void setNote(int note) {
             if (note >= 0x3f) {
    @@ -146,8 +146,8 @@ public void setNote(int note) {
         }
     
         /**
    -     * ボイスナンバを取得します.
    -     * @return ボイスナンバ
    +     * Gets voice number.
    +     * @return voice number
          */
         @Override
         public int getVoice() {
    @@ -155,8 +155,8 @@ public int getVoice() {
         }
     
         /**
    -     * ボイスナンバを設定します.
    -     * @param voice ボイスナンバ
    +     * Sets voice number.
    +     * @param voice voice number
          */
         @Override
         public void setVoice(int voice) {
    @@ -165,16 +165,16 @@ public void setVoice(int voice) {
         }
     
         /**
    -     * 音長を取得します.
    -     * @return 音長
    +     * Gets note length.
    +     * @return note length
          */
         public int getGateTime() {
             return gateTime;
         }
     
         /**
    -     * 音長を設定します.
    -     * @param gateTime 音長
    +     * Sets note length.
    +     * @param gateTime note length
          */
         public void setGateTime(int gateTime) {
             this.gateTime = gateTime;
    @@ -182,23 +182,23 @@ public void setGateTime(int gateTime) {
         }
     
         /**
    -     * 音強を取得します.
    -     * @return 音強
    +     * Gets note velocity.
    +     * @return note velocity
          */
         public int getVelocity() {
             return velocity;
         }
     
         /**
    -     * 音強を設定します.
    -     * @param velocity 音強
    +     * Sets note velocity.
    +     * @param velocity note velocity
          */
         public void setVelocity(int velocity) {
             this.velocity = velocity & 0x3f;
             this.data[3] = (byte) ((this.data[3] & 0x03) | (this.velocity << 2));
         }
     
    -    /** */
    +    @Override
         public String toString() {
             return "Note:" +
                 " delta="    + String.format("%02x", data[0])  +
    @@ -208,5 +208,3 @@ public String toString() {
                 " velocity=" + String.format("%02x", velocity);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/Sequence.java b/src/main/java/vavi/sound/mfi/Sequence.java
    index e5cc6a8..5f838fd 100644
    --- a/src/main/java/vavi/sound/mfi/Sequence.java
    +++ b/src/main/java/vavi/sound/mfi/Sequence.java
    @@ -54,5 +54,3 @@ public Track[] getTracks() {
             return ts;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/Sequencer.java b/src/main/java/vavi/sound/mfi/Sequencer.java
    index 741a5de..5ab2025 100644
    --- a/src/main/java/vavi/sound/mfi/Sequencer.java
    +++ b/src/main/java/vavi/sound/mfi/Sequencer.java
    @@ -42,11 +42,9 @@ void setSequence(InputStream stream)
         /** */
         boolean isRunning();
     
    -    /** {@link MetaEventListener Listener} を登録します。 */
    +    /** Adds a {@link MetaEventListener Listener}. */
         void addMetaEventListener(MetaEventListener l);
     
    -    /** {@link MetaEventListener Listener} を削除します。 */
    +    /** Removes a {@link MetaEventListener Listener}. */
         void removeMetaEventListener(MetaEventListener l);
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/ShortMessage.java b/src/main/java/vavi/sound/mfi/ShortMessage.java
    index d44b259..d1e92e8 100644
    --- a/src/main/java/vavi/sound/mfi/ShortMessage.java
    +++ b/src/main/java/vavi/sound/mfi/ShortMessage.java
    @@ -8,9 +8,9 @@
     
     
     /**
    - * ShortMessage を表すクラスです。
    + * Represents short message.
      * 

    - * MFi 仕様の"拡張ステータス B"を表します。 + * Represents MFi specs. "Extended Status B". *

    * @author Naohide Sano (nsano) * @version 0.10 020627 nsano refine
    @@ -35,8 +35,8 @@ public abstract class ShortMessage extends MfiMessage { * * @param delta * @param status - * @param data1 拡張ステータス番号 - * @param data2 機能の値 + * @param data1 extended status number + * @param data2 function number */ public ShortMessage(int delta, int status, int data1, int data2) { super(new byte[] { @@ -57,5 +57,3 @@ public int getData() { return data[3] & 0xff; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/Synthesizer.java b/src/main/java/vavi/sound/mfi/Synthesizer.java index a6824fb..0606579 100644 --- a/src/main/java/vavi/sound/mfi/Synthesizer.java +++ b/src/main/java/vavi/sound/mfi/Synthesizer.java @@ -42,5 +42,3 @@ public interface Synthesizer extends MfiDevice { /** @see javax.sound.midi.Synthesizer#getReceiver() */ Receiver getReceiver() throws MidiUnavailableException; } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/SysexMessage.java b/src/main/java/vavi/sound/mfi/SysexMessage.java index 3d69f24..af57af7 100644 --- a/src/main/java/vavi/sound/mfi/SysexMessage.java +++ b/src/main/java/vavi/sound/mfi/SysexMessage.java @@ -12,7 +12,7 @@ /** * System exclusive message. *

    - * MFi 仕様の"拡張情報"を表します。 + * Represents MFi specs. "Extended Status Information". *

    * @author Naohide Sano (nsano) * @version 0.00 020703 nsano initial version
    @@ -25,5 +25,3 @@ protected SysexMessage(byte[] message) { super(message); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/Track.java b/src/main/java/vavi/sound/mfi/Track.java index dab6c09..eb724d8 100644 --- a/src/main/java/vavi/sound/mfi/Track.java +++ b/src/main/java/vavi/sound/mfi/Track.java @@ -55,5 +55,3 @@ public int size() { // TODO public long ticks() } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/spi/MfiDeviceProvider.java b/src/main/java/vavi/sound/mfi/spi/MfiDeviceProvider.java index b05ea15..18bd19a 100644 --- a/src/main/java/vavi/sound/mfi/spi/MfiDeviceProvider.java +++ b/src/main/java/vavi/sound/mfi/spi/MfiDeviceProvider.java @@ -14,19 +14,18 @@ * * @author Naohide Sano (nsano) * @version 0.00 020629 nsano initial version
    + * @see javax.sound.midi.spi.MidiDeviceProvider */ public abstract class MfiDeviceProvider { - /** */ + /** @see javax.sound.midi.spi.MidiDeviceProvider#isDeviceSupported(javax.sound.midi.MidiDevice.Info) */ public boolean isDeviceSupported(MfiDevice.Info info) { return false; } - /** */ + /** @see javax.sound.midi.spi.MidiDeviceProvider#getDeviceInfo() */ public abstract MfiDevice.Info[] getDeviceInfo(); - /** */ + /** @see javax.sound.midi.spi.MidiDeviceProvider#getDevice(javax.sound.midi.MidiDevice.Info) */ public abstract MfiDevice getDevice(MfiDevice.Info info); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/spi/MfiFileReader.java b/src/main/java/vavi/sound/mfi/spi/MfiFileReader.java index e2d8788..9161c3d 100644 --- a/src/main/java/vavi/sound/mfi/spi/MfiFileReader.java +++ b/src/main/java/vavi/sound/mfi/spi/MfiFileReader.java @@ -22,38 +22,31 @@ * @author Naohide Sano (nsano) * @version 0.00 020627 nsano initial version
    * 0.01 020704 nsano midi compliant
    + * @see javax.sound.midi.spi.MidiFileReader */ public abstract class MfiFileReader { - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getMidiFileFormat(InputStream) */ public abstract MfiFileFormat getMfiFileFormat(InputStream stream) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getMidiFileFormat(File) */ public abstract MfiFileFormat getMfiFileFormat(File file) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getMidiFileFormat(URL) */ public abstract MfiFileFormat getMfiFileFormat(URL url) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getSequence(InputStream) */ public abstract Sequence getSequence(InputStream stream) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getSequence(File) */ public abstract Sequence getSequence(File file) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; - /** */ + /** @see javax.sound.midi.spi.MidiFileReader#getSequence(URL) */ public abstract Sequence getSequence(URL url) - throws InvalidMfiDataException, - IOException; + throws InvalidMfiDataException, IOException; } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/spi/MfiFileWriter.java b/src/main/java/vavi/sound/mfi/spi/MfiFileWriter.java index f19f3f6..bbd447e 100644 --- a/src/main/java/vavi/sound/mfi/spi/MfiFileWriter.java +++ b/src/main/java/vavi/sound/mfi/spi/MfiFileWriter.java @@ -20,36 +20,29 @@ * @version 0.00 020629 nsano initial version
    * 0.01 020704 nsano midi compliant
    * 0.02 030817 nsano add isFileTypeSupported
    + * @see javax.sound.midi.spi.MidiFileWriter */ public abstract class MfiFileWriter { - /** */ + /** @see javax.sound.midi.spi.MidiFileWriter#getMidiFileTypes() */ public abstract int[] getMfiFileTypes(); - /** */ + /** @see javax.sound.midi.spi.MidiFileWriter#getMidiFileTypes(javax.sound.midi.Sequence) */ public abstract int[] getMfiFileTypes(Sequence sequence); - /** */ + /** @see javax.sound.midi.spi.MidiFileWriter#isFileTypeSupported(int) */ public boolean isFileTypeSupported(int fileType) { return false; } - /** TODO */ + /** @see javax.sound.midi.spi.MidiFileWriter#isFileTypeSupported(int, javax.sound.midi.Sequence) */ public boolean isFileTypeSupported(int fileType, Sequence sequence) { return false; } - /** */ - public abstract int write(Sequence in, - int fileType, - OutputStream out) - throws IOException; - - /** */ - public abstract int write(Sequence in, - int fileType, - File out) - throws IOException; -} + /** @see javax.sound.midi.spi.MidiFileWriter#write(javax.sound.midi.Sequence, int, OutputStream) */ + public abstract int write(Sequence in, int fileType, OutputStream out) throws IOException; -/* */ + /** @see javax.sound.midi.spi.MidiFileWriter#write(javax.sound.midi.Sequence, int, File) */ + public abstract int write(Sequence in, int fileType, File out) throws IOException; +} diff --git a/src/main/java/vavi/sound/mfi/vavi/AudioDataMessage.java b/src/main/java/vavi/sound/mfi/vavi/AudioDataMessage.java index 3905565..30370e9 100644 --- a/src/main/java/vavi/sound/mfi/vavi/AudioDataMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/AudioDataMessage.java @@ -49,10 +49,10 @@ * length 2 * data L *
    - *
  • {@link #data} には header, sub chunk 部分は含まれていません。内容は純粋な ADPCM っぽい - *
  • {@link #length} は AudioData Chunk すべての長さ - *
  • TODO extends {@link MfiMessage} いるの? AudioDataChunk じゃないの? - *
  • TODO このクラスそのまま {@link vavi.sound.mfi.Track} に入れたらよくないのでは? → extends {@link MetaMessage}? + *
  • {@link #data} doesn't contain header, sub chunk part. it seems to be pure ADPCM data. + *
  • {@link #length} is total length of AudioData Chunk + *
  • TODO "extends {@link MfiMessage}" is needed? that should be AudioDataChunk isn't it? + *
  • TODO this class should be merge into {@link vavi.sound.mfi.Track}? → extends {@link MetaMessage}? * @author Naohide Sano (nsano) * @version 0.00 050721 nsano initial version
    * @since MFi 4.0 @@ -63,7 +63,7 @@ public class AudioDataMessage extends MfiMessage /** {@value} */ public static final String TYPE = "adat"; - /** "adat" の index */ + /** index of "adat" */ private int audioDataNumber; /** @@ -80,10 +80,10 @@ public class AudioDataMessage extends MfiMessage *
          * 76543 2 1 0
          * ~~~~~ ~ ~ ~
    -     *     | | | +- 音程変化制御識別子 (0: 音程変化に影響されない, 1: 音程変化に影響される)
    -     *     | | +--- テンポ変化制御識別子 (0: テンポ変化に影響されない, 1: テンポ変化に影響される)
    -     *     | +----- 3D 識別子 (0: 3D 処理していない, 1: 3D 処理している)
    -     *     +------- 予約 (0 固定)
    +     *     | | | +- pitch change control identifier (0: not affected by pitch changes, 1: affected by pitch changes)
    +     *     | | +--- tempo change control identifier (0: not affected by tempo changes, 1: affected by tempo changes)
    +     *     | +----- 3D identifier (0: not 3D processed, 1: 3D 3D processed)
    +     *     +------- reserved (0 fixed)
          * 
    */ private int attribute; @@ -159,9 +159,9 @@ public void writeTo(OutputStream os) } /** - * @after {@link #length} が設定されます、AudioData Chunk すべての長さ - * @after {@link #data} が設定されます、ヘッダ部、サブチャンクは含まれない - * @throws InvalidMfiDataException is の始まりが {@link #TYPE} で始まっていない場合 + * @after {@link #length} will be set (total length of AudioData Chunk) + * @after {@link #data} will be set, not contains header, sub chunks + * @throws InvalidMfiDataException beginning of is is not {@link #TYPE} */ public void readFrom(InputStream is) throws InvalidMfiDataException, @@ -197,7 +197,7 @@ public void readFrom(InputStream is) // data int dataLength = audioDataLength - (headerLength + 1 + 1); // + format + attribute - data = new byte[dataLength]; // TODO 全部のデータ含めるべき + data = new byte[dataLength]; // TODO while data should be included dis.readFully(data, 0, dataLength); Debug.println(Level.FINE, "adat length[" + audioDataNumber + "]: " + dataLength + " bytes\n" + StringUtil.getDump(data, 16)); @@ -206,8 +206,8 @@ public void readFrom(InputStream is) } /** - * ヘッダ、サブチャンク除く。(純粋な ADPCM) - * データインターリーブは行わず L R の順にまとめて格納する + * excludes header, sub chunks (pure ADPCM) + * data is stored in L R order without interleaving. *
  • TODO Chunk interface */ public void setData(byte[] data) { @@ -228,8 +228,8 @@ public void setData(byte[] data) { } /** - * ヘッダ、サブチャンク除く。 (純粋な ADPCM) - * データインターリーブは行わず L R の順にまとめて格納されている + * excludes header, sub chunks (pure ADPCM) + * data is stored in L R order without interleaving. *
  • TODO Chunk interface */ public byte[] getData() { @@ -255,7 +255,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -279,5 +279,3 @@ public void sequence() throws InvalidMfiDataException { engine.setData(id, -1, samplingRate, samplingBits, channels, data, false); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/HeaderChunk.java b/src/main/java/vavi/sound/mfi/vavi/HeaderChunk.java index d230811..82c4cca 100644 --- a/src/main/java/vavi/sound/mfi/vavi/HeaderChunk.java +++ b/src/main/java/vavi/sound/mfi/vavi/HeaderChunk.java @@ -36,15 +36,15 @@ class HeaderChunk { /** = ({@link #majorType} + {@link #minorType} + {@link #tracksCount}) */ public static final int HEADER_LENGTH = 3; - /** 着信メロディデータ */ + /** ringtone data */ public static final int MAJOR_TYPE_RING_TONE = 0x01; - /** 音楽データ */ + /** music data */ public static final int MAJOR_TYPE_MUSIC = 0x02; - /** {@link #majorType} が {@link #MAJOR_TYPE_RING_TONE} の場合、全曲データ */ + /** when {@link #majorType} is {@link #MAJOR_TYPE_RING_TONE}, all music data */ public static final int MINOR_TYPE_ALL = 0x01; - /** {@link #majorType} が {@link #MAJOR_TYPE_RING_TONE} の場合、部分データ */ + /** when {@link #majorType} is {@link #MAJOR_TYPE_RING_TONE}, part of music data */ public static final int MINOR_TYPE_PART = 0x02; - /** {@link #majorType} が {@link #MAJOR_TYPE_MUSIC} の場合、固定 */ + /** when {@link #majorType} is {@link #MAJOR_TYPE_MUSIC}, fixed */ public static final int MINOR_TYPE_MUSIC = 0x00; /** MFi data length ({@link #TYPE} + {@link #mfiDataLength} are excluded) */ @@ -58,10 +58,10 @@ class HeaderChunk { /** */ private int minorType = -1; - /** 最大 4 やって */ + /** max 4 */ private int tracksCount; - /** ヘッダ・サブチャンク */ + /** header, sub chunks */ private Map subChunks = new LinkedHashMap<>(); /** */ @@ -70,8 +70,8 @@ class HeaderChunk { /** */ public interface Support { /** - * {@link #support} から {@link SubMessage} を取り出します。 - * {@link SubMessage} は {@link Sequence#getTracks()}[0] の先頭にあるのが仕様 + * Gets {@link SubMessage} from {@link #support}. + * Specs says {@link SubMessage} is located at top of {@link Sequence#getTracks()}[0]. */ void init(Map subChunks); int getAudioDataLength(); @@ -80,13 +80,13 @@ public interface Support { } /** - * 読み込み用 + * for reading */ private HeaderChunk() { } /** - * 書き出し用 + * for writing */ public HeaderChunk(Support support) { this.support = support; @@ -95,14 +95,14 @@ public HeaderChunk(Support support) { } /** - * MFi データの長さ (type, length は除く) + * MFi data length (except type, length) */ public int getMfiDataLength() { return mfiDataLength; } /** - * Chunk データの長さ (type, length は除く) + * Chunk data length (except type, length) *
  • TODO -> interface Chunk */ public int getDataLength() { @@ -147,7 +147,7 @@ public Map getSubChunks() { } /** - * ヘッダサブチャンクの長さを取得します。 + * Gets header chunk length. *
  • TODO scope */ public int getSubChunksLength() { @@ -169,11 +169,11 @@ private boolean isValid() { } /** - * @throws InvalidMfiDataException 最低限の {@link SubMessage} + * @throws InvalidMfiDataException throws when minimum {@link SubMessage}s * { {@link VaviMfiFileFormat#setSorc(int) "sorc"}, * {@link VaviMfiFileFormat#setTitle(String) "titl"}, * {@link VaviMfiFileFormat#setVersion(String) "vers"} } - * が設定されていない場合スローされます + * are not set */ public void writeTo(OutputStream os) throws InvalidMfiDataException, @@ -220,7 +220,7 @@ public void writeTo(OutputStream os) } /** - * @throws InvalidMfiDataException 最初の 4 bytes が {@link #TYPE} で無い場合 + * @throws InvalidMfiDataException first 4 bytes are not {@link #TYPE} */ public static HeaderChunk readFrom(InputStream is) throws InvalidMfiDataException, @@ -268,5 +268,3 @@ public static HeaderChunk readFrom(InputStream is) return headerChunk; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MetaEventAdapter.java b/src/main/java/vavi/sound/mfi/vavi/MetaEventAdapter.java index 4335221..9dbb647 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MetaEventAdapter.java +++ b/src/main/java/vavi/sound/mfi/vavi/MetaEventAdapter.java @@ -57,7 +57,7 @@ public void open() { } /** - * {@link MfiMessageStore} を使用した再生機構を実装しています。 + * Implements a player using {@link MfiMessageStore}. * @see MachineDependentMessage#getMidiEvents(MidiContext) * @see vavi.sound.mfi.vavi.header.CopyMessage#getMidiEvents(MidiContext) * @see vavi.sound.mfi.vavi.header.ProtMessage#getMidiEvents(MidiContext) @@ -68,7 +68,7 @@ public void open() { public void meta(javax.sound.midi.MetaMessage message) { //Debug.println("type: " + message.getType()); switch (MetaEvent.valueOf(message.getType())) { - case META_MACHINE_DEPEND: // シーケンサ固有のメタイベント + case META_MACHINE_DEPEND: // sequencer specific meta event try { processSpecial(message); } catch (InvalidMfiDataException e) { @@ -81,13 +81,13 @@ public void meta(javax.sound.midi.MetaMessage message) { throw e; } break; - case META_TEXT_EVENT: // テキスト・イベント - case META_COPYRIGHT: // 著作権表示 - case META_NAME: // シーケンス名またはトラック名 + case META_TEXT_EVENT: // text event + case META_COPYRIGHT: // copyright + case META_NAME: // sequence name or track name Debug.println(Level.FINE, "meta " + message.getType() + ": " + MidiUtil.getDecodedMessage(message.getData())); break; - case META_END_OF_TRACK: // トラックの終わり - case META_TEMPO: // テンポ設定 + case META_END_OF_TRACK: // end of track + case META_TEMPO: // tempo was set Debug.println(Level.FINE, "this handler ignore meta: " + message.getType()); break; default: @@ -184,5 +184,3 @@ private void processSpecial_Vavi_Mfi4(javax.sound.midi.MetaMessage message) sequencer.sequence(); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MetaSupport.java b/src/main/java/vavi/sound/mfi/vavi/MetaSupport.java index 6581e34..53b965d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MetaSupport.java +++ b/src/main/java/vavi/sound/mfi/vavi/MetaSupport.java @@ -15,7 +15,7 @@ /** - * MetaEvent 機構のユーティリティクラスです. + * Utility class for MetaEvent mechanism. * * @author Naohide Sano (nsano) * @version 0.00 010820 nsano initial version
    @@ -25,22 +25,20 @@ class MetaSupport implements Serializable { /** The metaEvent listeners */ private List listeners = new ArrayList<>(); - /** {@link MetaEventListener} を追加します. */ + /** Adds {@link MetaEventListener}. */ public void addMetaEventListener(MetaEventListener l) { listeners.add(l); } - /** {@link MetaEventListener} を削除します. */ + /** Removes {@link MetaEventListener}. */ public void removeMetaEventListener(MetaEventListener l) { listeners.remove(l); } - /** meta message を発行します. */ + /** Fires a meta message. */ public void fireMeta(MetaMessage meta) { for (MetaEventListener listener : listeners) { listener.meta(meta); } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MfiContext.java b/src/main/java/vavi/sound/mfi/vavi/MfiContext.java index 4e60fdc..775c86d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MfiContext.java +++ b/src/main/java/vavi/sound/mfi/vavi/MfiContext.java @@ -7,6 +7,7 @@ package vavi.sound.mfi.vavi; import java.util.ArrayList; +import java.util.Arrays; import java.util.BitSet; import java.util.Comparator; import java.util.List; @@ -41,7 +42,7 @@ */ public class MfiContext { - /** MFi のトラック数の最大値 */ + /** max MFi track number */ public static final int MAX_MFI_TRACKS = 4; //---- @@ -60,7 +61,7 @@ public void setType(int type) { this.type = type; } - /** TODO 今のところ {@link Sequence#getResolution()} */ + /** TODO currently {@link Sequence#getResolution()} */ private int timeBase; /** */ @@ -70,7 +71,7 @@ public int getTimeBase() { //---- - /** index は MFi Track No., 使用されていれば true */ + /** index is MFi Track No., when that's used this returns true */ private boolean[] trackUsed = new boolean[MAX_MFI_TRACKS]; /** @@ -108,7 +109,7 @@ public boolean isEofSet(int mfiTrackNumber) { //---- /** - * tick の倍率 + * magnification of tick * @see vavi.sound.mfi.vavi.track.TempoMessage */ private double scale = 1.0d; @@ -130,13 +131,11 @@ public boolean isScaleChanged() { //---- - /** 直前の tick, index は MFi Track No. */ + /** previous tick, index is MFi Track No. */ private long[] previousTicks = new long[MAX_MFI_TRACKS]; /* initializing */ { - for (int i = 0; i < MAX_MFI_TRACKS; i++) { - previousTicks[i] = 0; - } + Arrays.fill(previousTicks, 0); } /** @@ -160,15 +159,15 @@ public void incrementPreviousTick(int mfiTrackNumber, long tick) { this.previousTicks[mfiTrackNumber] += tick; } - /** @return 補正あり Δタイム */ + /** @return with correction Δ time */ public int retrieveAdjustedDelta(int mfiTrackNumber, long currentTick) { return getAdjustedDelta(mfiTrackNumber, (currentTick - previousTicks[mfiTrackNumber]) / scale); } - /** Math#round() で丸められた誤差 */ - private double[] roundedSum = new double[MAX_MFI_TRACKS]; + /** errors rounded by Math#round() */ + private final double[] roundedSum = new double[MAX_MFI_TRACKS]; - /** Math#round() で丸められた誤差が整数値より大きくなった場合の補正 */ + /** Gets adjustment when sum of errors rounded by Math#round() become larger than 1 */ private int getAdjustedDelta(int mfiTrackNumber, double doubleDelta) { int delta = (int) Math.round(doubleDelta); double rounded = doubleDelta - delta; @@ -188,9 +187,8 @@ private int getAdjustedDelta(int mfiTrackNumber, double doubleDelta) { //---- /** - * 一つ前の NoteOn からの時間 (currentTick - beforeTicks[track]) に - * いくつΔが入るか(整数値、あまり切り捨て)を求め、その個数分挿入する - * NopMessage の配列を返します。 + * Finds how many Δs(integer value, truncating too much) can be included in the time since the previous NoteOn + * (currentTick - beforeTicks[track]) and returns an array of NopMessages to be inserted for that number. *
          *     event    index    process
          *   |
    @@ -208,7 +206,7 @@ private int getAdjustedDelta(int mfiTrackNumber, double doubleDelta) {
          *   |
          * --+-
          * 
    - * 上記図だと 1 つの NopMessage が挿入される。 + * case of above, one NopMessage will be inserted * * @return null current event is MetaMessage or SysexMessage or delta not supported. */ @@ -238,7 +236,7 @@ public MfiEvent[] getIntervalMfiEvents(int mfiTrackNumber) { return null; } if (interval < 0) { - // ありえないはず + // it shouldn't be possible Debug.println(Level.WARNING, "interval: " + interval + ", " + midiEventIndex + ", " + MidiUtil.paramString(midiMessage)); interval = 0; } @@ -250,7 +248,7 @@ public MfiEvent[] getIntervalMfiEvents(int mfiTrackNumber) { for (int i = 0; i < nopLength; i++) { NopMessage mfiMessage = new NopMessage(255, 0); mfiEvents[i] = new MfiEvent(mfiMessage, 0L); // TODO 0l - // 255 Δ 分後ろにずらしていく + // shift backward by 255Δ incrementPreviousTick(mfiTrackNumber, Math.round(255 * scale)); } @@ -259,9 +257,8 @@ public MfiEvent[] getIntervalMfiEvents(int mfiTrackNumber) { } /** - * 前のデータ(MIDI NoteOn)が実行されてからのΔ(時間)を取得します。 - * 必ず事前に {@link #getIntervalMfiEvents(int)} を実行してΔを 255 以下を - * 返すようにしておいて下さい。 + * Gets the Δ(time) since the previous data (MIDI NoteOn) was executed. + * Be sure to execute {@link #getIntervalMfiEvents(int)} in advance to return Δ less than 255. */ public int getDelta(int mfiTrackNumber) { @@ -274,14 +271,14 @@ public int getDelta(int mfiTrackNumber) { delta = retrieveAdjustedDelta(mfiTrackNumber, midiEvent.getTick()); } else if (midiMessage instanceof MetaMessage && ((MetaMessage) midiMessage).getType() == 81) { // tempo - delta = retrieveAdjustedDelta(mfiTrackNumber, midiEvent.getTick()); // TODO 0 でいいのか? + delta = retrieveAdjustedDelta(mfiTrackNumber, midiEvent.getTick()); // TODO is 0 ok? //Debug.println("[" + midiEventIndex + "] delta for tempo, " + mfiTrackNumber + "ch: " + delta); } else { Debug.println(Level.WARNING, "no delta defined for: " + MidiUtil.paramString(midiMessage)); } if (delta > 255) { - // getIntervalMfiEvents で処理されているはずなのでありえない + // this is impossible because it should be handled by getIntervalMfiEvents Debug.println(Level.SEVERE, "Δ: " + delta + ", " + (delta % 256)); } return delta % 256; @@ -290,7 +287,7 @@ public int getDelta(int mfiTrackNumber) { //---- /** - * 補正された MFi Pitch を取得します。 + * Gets the corrected MFi pitch. *

    * sound -45, percussion -35 *

    @@ -300,7 +297,7 @@ public int retrievePitch(int channel, int pitch) { } /** - * MFi Voice No. を取得します。 + * Gets the MFi Voice No. * @param channel MIDI channel */ public int retrieveVoice(int channel) { @@ -308,7 +305,7 @@ public int retrieveVoice(int channel) { } /** - * MFi Track を取得します。 + * Gets the MFi Track. * @param channel MIDI channel */ public int retrieveMfiTrack(int channel) { @@ -317,10 +314,10 @@ public int retrieveMfiTrack(int channel) { //---- - /** MIDI イベントの単一シーケンス */ - private List midiEvents = new ArrayList<>(); + /** a single sequence of MIDI events */ + private final List midiEvents = new ArrayList<>(); - /** MIDI イベントの単一シーケンスを設定します。 */ + /** Sets a single sequence of MIDI events. */ public void setMidiSequence(Sequence midiSequence) { this.timeBase = midiSequence.getResolution(); @@ -402,19 +399,19 @@ public MidiEvent getMidiEvent(int midiEventIndex) { return midiEvents.get(midiEventIndex); } - /** 現在の MIDI イベントのインデックス値 */ + /** current MIDI event index */ private int midiEventIndex; - /** 現在の MIDI イベントのインデックス値を取得します。 */ + /** Gets current MIDI event index. */ int getMidiEventIndex() { return midiEventIndex; } /** - * 同じ channel で次の {@link ShortMessage} である MIDI イベントを取得します。 + * Get the next {@link ShortMessage} MIDI event on the same channel. * - * @throws NoSuchElementException 次の MIDI イベントがない - * @throws IllegalStateException 現在のイベントは {@link ShortMessage} ではない + * @throws NoSuchElementException when no next MIDI event + * @throws IllegalStateException current event is not {@link ShortMessage} */ public MidiEvent getNoteOffMidiEvent() throws NoSuchElementException { @@ -450,13 +447,11 @@ public MidiEvent getNoteOffMidiEvent() throws NoSuchElementException { throw new NoSuchElementException(channel + "ch, " + data1); } - /** すでに消費されたかどうか */ + /** whether it has already been consumed */ private BitSet noteOffEventUsed; - /** すでに消費されたかどうかを取得します。 */ + /** Gets whether it has already been consumed. */ public boolean isNoteOffEventUsed() { return noteOffEventUsed.get(midiEventIndex); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MfiConvertible.java b/src/main/java/vavi/sound/mfi/vavi/MfiConvertible.java index f21c081..ff2f301 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MfiConvertible.java +++ b/src/main/java/vavi/sound/mfi/vavi/MfiConvertible.java @@ -38,5 +38,3 @@ MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) PrefixedPropertiesFactory factory = new PrefixedClassPropertiesFactory<>("/vavi/sound/mfi/vavi/vavi.properties", "midi."); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MidiContext.java b/src/main/java/vavi/sound/mfi/vavi/MidiContext.java index 5ec75d0..04fea19 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MidiContext.java +++ b/src/main/java/vavi/sound/mfi/vavi/MidiContext.java @@ -299,5 +299,3 @@ public int getResolution(Track[] mfiTracks) return 48; // MFi default time base } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/MidiConvertible.java b/src/main/java/vavi/sound/mfi/vavi/MidiConvertible.java index 9f5cf86..6f20a50 100644 --- a/src/main/java/vavi/sound/mfi/vavi/MidiConvertible.java +++ b/src/main/java/vavi/sound/mfi/vavi/MidiConvertible.java @@ -23,5 +23,3 @@ public interface MidiConvertible { MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/SubMessage.java b/src/main/java/vavi/sound/mfi/vavi/SubMessage.java index 3881f6d..abb1cb0 100644 --- a/src/main/java/vavi/sound/mfi/vavi/SubMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/SubMessage.java @@ -40,11 +40,11 @@ * |00 ff fd|LL LL|7f|XX XX XX XX|DD DD ... * +--+--+--+--+--+--+--+--+--+--+--+- *
  • - *
  • {@link #getLength()} はデータ + 10 ({@link MetaMessage#HEADER_LENGTH meta header} + - * {@link #SUB_TYPE_LENGTH type の文字長分}) を返します。 - *
  • TODO {@link MetaMessage} である必要があるのか? (MIDI っぽくはなってるが) - *
  • ↑ {@link vavi.sound.mfi.Track}[0] の最初に入れるのは {@link MetaMessage} とまとめられる - *
  • ↑ そうすると {@link vavi.sound.mfi.vavi.AudioDataMessage} は {@link MetaMessage} のサブクラスであるべき + *
  • {@link #getLength()} returns data + 10 ({@link MetaMessage#HEADER_LENGTH meta header} + + * {@link #SUB_TYPE_LENGTH type's string length}). + *
  • TODO does it have to be {@link MetaMessage}? (although it looks like MIDI) + *
  • TODO ↑ the first thing to put in {@link vavi.sound.mfi.Track}[0] is summarized as {@link MetaMessage} + *
  • TODO ↑ then {@link vavi.sound.mfi.vavi.AudioDataMessage} should be a subclass of {@link MetaMessage} * @author Naohide Sano (nsano) * @version 0.00 030819 nsano out source from {@link VaviMfiFileFormat}
    * 0.10 030825 nsano merge {@link SubMessage}
    @@ -61,7 +61,7 @@ public abstract class SubMessage extends MetaMessage { /** "port".length */ protected static final int SUB_TYPE_LENGTH = 4; - /** シーケンサ固有のメタイベント */ + /** sequencer specific meta event */ public static final int META_TYPE = 0x7f; /** @@ -115,24 +115,24 @@ protected byte[] getSubMessage(String subType, byte[] data, int length) { } /** - * @return subType 文字列 (ex. "prot") + * @return subType string (ex. "prot") */ public String getSubType() { return new String(this.data, HEADER_LENGTH, SUB_TYPE_LENGTH); } /** - * データ部分のみ。{@link #getSubType() subType} 文字列も含みません。 + * Data part only. It also does not include the {@link #getSubType() subType} string. * @return {@link #getLength()} - 10 ({@link MetaMessage#HEADER_LENGTH meta header} + - * {@link #SUB_TYPE_LENGTH type の文字長分}) + * {@link #SUB_TYPE_LENGTH type string length}) */ public int getDataLength() { return getLength() - (HEADER_LENGTH + SUB_TYPE_LENGTH); } /** - * データ部分のみ。{@link #getSubType() subType} 文字列も含みません。 - * @return コピー + * Data part only. It also does not include the {@link #getSubType() subType} string. + * @return copied data */ @Override public byte[] getData() { @@ -144,8 +144,8 @@ public byte[] getData() { } /** - * データ部分のみ、長さが変わった場合正しく処理される。 - * @param data {@link #getSubType() subType} 文字列を含めない + * Only the data part will be processed correctly if the length changes. + * @param data not included {@link #getSubType() subType} string */ public void setData(byte[] data) throws InvalidMfiDataException { @@ -235,7 +235,7 @@ public static SubMessage readFrom(InputStream is) //---- - /** {@link SubMessage} のコンストラクタ集 */ + /** {@link SubMessage} constructors */ private static Map> subChunkConstructors = new HashMap<>(); static { @@ -275,5 +275,3 @@ public static SubMessage readFrom(InputStream is) } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/TrackMessage.java b/src/main/java/vavi/sound/mfi/vavi/TrackMessage.java index 044c2be..aa837e6 100644 --- a/src/main/java/vavi/sound/mfi/vavi/TrackMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/TrackMessage.java @@ -32,9 +32,9 @@ /** * TrackMessage. *

    - * {@link #getLength()} は Track Chunk すべての長さ + * {@link #getLength()} is total length of Track Chunk. *

    - *
  • TODO extends {@link MfiMessage} いるの? TrackChunk じゃないの? + *
  • TODO extends {@link MfiMessage} is really needed? is it TrackChunk, isn't it? * @author Naohide Sano (nsano) * @version 0.00 030825 nsano initial version
    * 0.01 030826 nsano refactoring
    @@ -50,10 +50,10 @@ public class TrackMessage extends MfiMessage { /** */ private int trackNumber; - /** 読み込み用 */ + /** for reading */ private int noteLength = -1; - /** 読み込み用 */ + /** for writing */ private int exst = -1; /** */ @@ -77,8 +77,8 @@ public void setExst(int exst) { } /** - * {@link Track}[0] の不必要なデータは省かれます。 - * @see VaviMfiFileFormat#isIgnored(MfiMessage) 依存関係がいまいちかも + * Unnecessary data in {@link Track}[0] will be removed. + * @see VaviMfiFileFormat#isIgnored(MfiMessage) dependencies may be lacking */ public void writeTo(OutputStream os) throws IOException { @@ -98,9 +98,9 @@ public void writeTo(OutputStream os) throws IOException { } /** - * 書き出し用 - * {@link Track}[0] の不必要なデータは省かれます。 - * @see VaviMfiFileFormat#isIgnored(MfiMessage) 依存関係がいまいちかも + * for writing + * Unnecessary data in {@link Track}[0] will be removed. + * @see VaviMfiFileFormat#isIgnored(MfiMessage) dependencies may be lacking */ public int getDataLength() { int trackLength = 0; @@ -123,11 +123,11 @@ public int getDataLength() { } /** - * @before {@link #noteLength}, {@link #exst} が設定されていること - * @after {@link #length} が設定される Track Chunk の長さ - * @throws IllegalStateException {@link vavi.sound.mfi.vavi.header.NoteMessage} の長さ - * もしくは {@link #exst} が設定されていない場合 - * @throws InvalidMfiDataException is の始まりが {@link #TYPE} で始まっていない場合 + * @before {@link #noteLength}, {@link #exst} are must be set + * @after {@link #length} will be set as Track Chunk length + * @throws IllegalStateException {@link vavi.sound.mfi.vavi.header.NoteMessage} length or + * {@link #exst} is not set + * @throws InvalidMfiDataException at the beginning of is is not {@link #TYPE} */ public void readFrom(InputStream is) throws InvalidMfiDataException, @@ -169,7 +169,7 @@ public void readFrom(InputStream is) /** * Reads a message from stream - * TODO MfiMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO it seems like MfiMessage#readFrom, but the dependency with the vavi package is not good enough... */ private MfiMessage getMessage(DataInputStream dis) throws IOException { @@ -183,7 +183,7 @@ private MfiMessage getMessage(DataInputStream dis) case MfiMessage.STATUS_CLASS_C: // Class C (0xbf) case MfiMessage.STATUS_NORMAL: // Normal (0xff) return getClassOrNormalMessage(delta, status, dis); - default: // ノートメッセージ + default: // note message return NoteMessageFactory.getMessage(delta, status, dis, noteLength); } } @@ -193,24 +193,21 @@ private MfiMessage getMessage(DataInputStream dis) * @see "vavi.properties" * @param status 0x3f: Class A, 0x7f: Class B, 0xbf: Class C, 0xff: Normal * @param dis data1 ~ - * TODO MfiMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO it seems like MfiMessage#readFrom, but the dependency with the vavi package is not good enough... */ - private MfiMessage getClassOrNormalMessage(int delta, - int status, - DataInputStream dis) - throws IOException { + private MfiMessage getClassOrNormalMessage(int delta, int status, DataInputStream dis) throws IOException { - int data1 = dis.readUnsignedByte(); // 拡張ステータス + int data1 = dis.readUnsignedByte(); // extended status MfiMessage message; if (data1 >= 0x00 && data1 <= 0x7f) { - // 拡張ステータス A ... LongMessage + // Extended Status A ... LongMessage message = LongMessageFactory.getMessage(delta, status, data1, dis, exst); } else if (data1 >= 0x80 && data1 <= 0xef) { - // 拡張ステータス B ... ShortMessage + // Extended Status B ... ShortMessage message = ShortMessageFactory.getMessage(delta, status, data1, dis); } else { - // 拡張情報 0xf# ... SysexMessage + // Extended Information 0xf# ... SysexMessage message = SysexMessageFactory.getMessage(delta, status, data1, dis); } @@ -238,7 +235,7 @@ private static class NoteMessageFactory { * 0xc0 ~ 0xfe *
  • * @param dis data1 ~ - * TODO NoteMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO seems should be located at NoteMessage#readFrom, but it makes relationship with vavi package wrong... */ public static MfiMessage getMessage(int delta, int status, @@ -266,10 +263,10 @@ public static MfiMessage getMessage(int delta, } } - /** ノート {@link NoteMessage} オブジェクトのインスタンスを取得するコンストラクタ 1 */ + /** A constructor that creates {@link NoteMessage} object instance. 1 */ private static Constructor noteMessageConstructor1; - /** ノート {@link NoteMessage} オブジェクトのインスタンスを取得するコンストラクタ 2 */ + /** A constructor that creates {@link NoteMessage} object instance. 2 */ private static Constructor noteMessageConstructor2; static { @@ -300,13 +297,13 @@ public static MfiMessage getMessage(int delta, private static class SysexMessageFactory { /** - * 拡張情報 0xf# ~ 0xf# + * Extended Information 0xf# ~ 0xf# *
              *  length = dis.readShort();
              *  data ...
              * 
    * @param dis data2 ~ - * TODO SysexMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO it seems like SysexMessage#readFrom, but the dependency with the vavi package is not good enough... */ public static MfiMessage getMessage(int delta, int status, @@ -337,8 +334,8 @@ public static MfiMessage getMessage(int delta, } } - /** 拡張ステータス A {@link SysexMessage} オブジェクトのインスタンスを取得するメソッド集 */ - private static Map sysexMessageInstantiators = new HashMap<>(); + /** methods for creates Extended Status A {@link SysexMessage} objects instance */ + private static final Map sysexMessageInstantiators = new HashMap<>(); static { try { @@ -370,13 +367,13 @@ public static MfiMessage getMessage(int delta, private static class ShortMessageFactory { /** - * 拡張ステータス B (0x80 ~ 0xef) + * Extended Status B (0x80 ~ 0xef) *
              *  length 1 fixed
              *  data 1 byte
              * 
    * @param dis data2 ~ - * TODO ShortMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO it seems like ShortMessage#readFrom, but the dependency with the vavi package is not good enough... */ public static MfiMessage getMessage(int delta, int status, @@ -403,8 +400,8 @@ public static MfiMessage getMessage(int delta, } } - /** 拡張ステータス B {@link ShortMessage} オブジェクトのインスタンスを取得するコンストラクタ集 */ - private static Map> shortMessageConstructors = new HashMap<>(); + /** constructors for Extended Status B {@link ShortMessage} object instance */ + private static final Map> shortMessageConstructors = new HashMap<>(); static { try { @@ -438,14 +435,14 @@ public static MfiMessage getMessage(int delta, private static class LongMessageFactory { /** - * 拡張ステータス A (0x00 ~ 0x7f) + * Extended Status A (0x00 ~ 0x7f) *
              *  length is 'exst'
              *  data ...
              * 
    * @param dis data2 ~ * @see #exst - * TODO LongMessage#readFrom のような気もするのだが vavi パッケージとの依存関係がいまいちか... + * TODO it seems like LongMessage#readFrom, but the dependency with the vavi package is not good enough... */ public static MfiMessage getMessage(int delta, int status, @@ -474,7 +471,7 @@ public static MfiMessage getMessage(int delta, } } - /** 拡張情報 {@link LongMessage} オブジェクトのインスタンスを取得するコンストラクタ集 */ + /** constructors for creating Extended Information {@link LongMessage} object instance */ private static Map> longMessageConstructors = new HashMap<>(); static { @@ -562,5 +559,3 @@ public static MfiMessage getMessage(int delta, } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviMfiDeviceProvider.java b/src/main/java/vavi/sound/mfi/vavi/VaviMfiDeviceProvider.java index 596dea3..d301087 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviMfiDeviceProvider.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviMfiDeviceProvider.java @@ -114,5 +114,3 @@ public static MfiDevice getMfiDevice(MfiDevice.Info mfiDeviceInfo) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileFormat.java b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileFormat.java index 111c597..b2ce2b8 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileFormat.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileFormat.java @@ -49,7 +49,7 @@ * offset to tracks 08 02 * major type 0A 01 see below * minor type 0B 01 see below - * number of tracks 0C 01 01:4和音, 02:8和音(MFi2), 04:16和音(MFi2) + * number of tracks 0C 01 01:4 voices, 02:8 voices(MFi2), 04:16 voices(MFi2) * * 2. data information * type 00 04 see below *1 @@ -82,7 +82,7 @@ public class VaviMfiFileFormat extends MfiFileFormat { /** - * MIDI ファイルタイプ + * MIDI file type * @see "vavi/sound/midi/package.html" */ public static final int FILE_TYPE = 0x88; @@ -98,19 +98,19 @@ public Sequence getSequence() { return sequence; } - /** 読み込み用 */ + /** for reading */ private VaviMfiFileFormat() { super(FILE_TYPE, -1); this.sequence = new Sequence(); } - /** 書き込み用 */ + /** for writing */ public VaviMfiFileFormat(Sequence sequence) { super(FILE_TYPE, -1); this.sequence = sequence; - // ヘッダ情報の取り出し + // retrieve header information this.headerChunk = new HeaderChunk(new HeaderChunk.Support() { @Override public void init(Map subChunks) { @@ -145,11 +145,11 @@ public int getAudioDataLength() { // 3. track int trackChunksLength = getTracksLength(); - // 要するにファイル全部 + // whole file in brief this.byteLength = headerChunkLength + audioChunksLength + trackChunksLength; } - /** すべてのトラックチャンクの合計の長さを取得します。 */ + /** Gets the total length of all track chunks. */ private int getTracksLength() { Track[] tracks = sequence.getTracks(); int tracksLength = 0; @@ -161,7 +161,7 @@ private int getTracksLength() { } /** - * すべてのオーディオデータチャンクの合計の長さを取得します。 + * Gets the total length of all audio data chunks. * @since MFi 4.0 */ private int getAudioDataLength() { @@ -179,7 +179,7 @@ private int getAudioDataLength() { } /** - * すべてのオーディオデータチャンクを取得します。 + * Gets all audio data chunks. * @since MFi 4.0 */ private List getAudioDatum() { @@ -195,22 +195,22 @@ private List getAudioDatum() { return result; } - /** {@link Track}[0] で書き出し時省かれるメッセージの型 */ + /** types of messages omitted when exporting with {@link Track}[0] */ static boolean isIgnored(MfiMessage message) { - // TODO MetaMessage だけを省くのが理想? + // TODO is it ideal to omit just MetaMessage? return message instanceof SubMessage || message instanceof AudioDataMessage; } /** - * ストリームに書き込みます。事前にシーケンスを設定しておくこと。 - * @after {@link #byteLength} が設定されます - * @after os は {@link java.io.OutputStream#flush() flush} されます - * @throws IllegalStateException シーケンスが設定されていない場合スローされます - * @throws InvalidMfiDataException 最低限の {@link SubMessage} + * Write to the stream. Set the sequence in advance. + * @after {@link #byteLength} will be set + * @after os will be {@link java.io.OutputStream#flush() flush} + * @throws IllegalStateException when sequence is not set + * @throws InvalidMfiDataException minimum {@link SubMessage} * { {@link #setSorc(int) "sorc"}, * {@link #setTitle(String) "titl"}, * {@link #setVersion(String) "vers"} } - * が設定されていない場合スローされます + * are not set */ public void writeTo(OutputStream os) throws InvalidMfiDataException, @@ -235,19 +235,17 @@ public void writeTo(OutputStream os) track.writeTo(os); } - os.flush(); // TODO いる? + os.flush(); // TODO is this needed? } /** - * ストリームから {@link MfiFileFormat} オブジェクトを取得します。 - * {@link Sequence} が作成されるので {@link #getSequence()} で取り出して使用します。 - * @param is - * @return {@link VaviMfiFileFormat} オブジェクト - * @throws InvalidMfiDataException 最初の 4 bytes が {@link HeaderChunk#TYPE} で無い場合 + * Gets a {@link MfiFileFormat} object from the stream. + * {@link Sequence} will be created, so use {@link #getSequence()} to retrieve it and use it. + * @param is MFi stream + * @return {@link VaviMfiFileFormat} object + * @throws InvalidMfiDataException at the beginning of 4 bytes is not {@link HeaderChunk#TYPE} */ - public static VaviMfiFileFormat readFrom(InputStream is) - throws InvalidMfiDataException, - IOException { + public static VaviMfiFileFormat readFrom(InputStream is) throws InvalidMfiDataException, IOException { VaviMfiFileFormat mff = new VaviMfiFileFormat(); @@ -287,7 +285,7 @@ public static VaviMfiFileFormat readFrom(InputStream is) doSpecial(headerSubChunks, audioDataChunks, track); } - // 通常処理 + // normal process TrackMessage trackChunk = new TrackMessage(trackNumber, track); trackChunk.setNoteLength(noteLength); trackChunk.setExst(exst); @@ -302,8 +300,8 @@ public static VaviMfiFileFormat readFrom(InputStream is) } /** - * {@link Track} 0 に対する特別な処理。 - * TODO こういう分離あまり好きくない... + * Special process to {@link Track} 0. + * TODO i don't like separation like this... * @param headerSubChunks source 1 * @param audioDataChunks source 2 * @param track dest, must be track 0 and empty @@ -311,15 +309,15 @@ public static VaviMfiFileFormat readFrom(InputStream is) private static void doSpecial(Map headerSubChunks, List audioDataChunks, Track track) { - // Track 0 の先頭に SubMessage を押し込む - // TODO HeaderChunk ですべき予感??? + // insert SubMessage at top of Track 0 + // TODO it seems to be done in HeaderChunk??? for (SubMessage headerSubChunk : headerSubChunks.values()) { track.add(new MfiEvent(headerSubChunk, 0L)); } - // Track 0 の header sub chunks の次に AudioDataMessage を押し込む + // insert AudioDataMessage at next header sub chunks of Track 0 for (AudioDataMessage audioDataChunk : audioDataChunks) { - // TODO {@link MetaMessage} に変換??? + // TODO convert to {@link MetaMessage}??? track.add(new MfiEvent(audioDataChunk, 0L)); } } @@ -494,7 +492,7 @@ public void setProt(String prot) } /** - * 拡張ステータス A の長さを取得します。 + * Gets Extended Status A length. * @see ExstMessage */ public int getExst() { @@ -507,7 +505,7 @@ public int getExst() { } /** - * 拡張ステータス A の長さを設定します。 + * Sets Extended Status A length. * @see ExstMessage */ public void setExst(int exst) @@ -522,7 +520,7 @@ public void setExst(int exst) } /** - * AudioDataChunk の数を取得します。 + * Gets AudioDataChunk count. * @see AinfMessage * @since MFi 4.0 */ @@ -536,7 +534,7 @@ public int getAudioDataChunkCount() { } /** - * AudioDataChunk のみで構成されているかどうか。 + * Whether does it consist of AudioDataChunk only? * @see AinfMessage * @since MFi 4.0 */ @@ -549,5 +547,3 @@ public boolean isAudioDataOnly() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileReader.java b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileReader.java index 8068302..592dc13 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileReader.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileReader.java @@ -21,7 +21,7 @@ /** * MfiFileReader implemented by vavi. - *
  • TODO 特殊命令の実装 + *
  • TODO implementing special instructions * @author Naohide Sano (nsano) * @version 0.10 020627 nsano midi compliant
    * 0.11 030618 nsano add vibrato related
    @@ -86,5 +86,3 @@ public Sequence getSequence(URL url) return getSequence(is); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileWriter.java b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileWriter.java index 11543eb..ef67dec 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileWriter.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviMfiFileWriter.java @@ -56,7 +56,7 @@ public int[] getMfiFileTypes() { @Override public int[] getMfiFileTypes(Sequence sequence) { - // sequence を無視しているけど MFi Sequence 一つしか型ないからいい + // ignoring sequence, but there's only one type of MFi sequence, so that's fine. return types; } @@ -72,20 +72,18 @@ public boolean isFileTypeSupported(int fileType) { @Override public boolean isFileTypeSupported(int fileType, Sequence sequence) { - // sequence を無視しているけど MFi Sequence 一つしか型ないからいい + // ignoring sequence, but there's only one type of MFi sequence, so that's fine. return isFileTypeSupported(fileType); } /** - * @param in {@link Sequence#getTracks() Sequence#tracks}[0] に - * 各種 {@link SubMessage} を設定することで - * ヘッダチャンクの内容を指定することが出来ます。 - * @return 0: fileType がサポートされていない場合、書き込みデータにエラーがある場合 - * else: 書き込んだバイト数 + * @param in You can specify the contents of the header chunk by setting + * various {@link SubMessage} to {@link Sequence#getTracks() Sequence#tracks}[0]. + * @return 0: if fileType is not supported, if there is an error in the write data + * else: number of bytes written */ @Override - public int write(Sequence in, int fileType, OutputStream out) - throws IOException { + public int write(Sequence in, int fileType, OutputStream out) throws IOException { if (!isFileTypeSupported(fileType)) { Debug.println(Level.WARNING, "unsupported fileType: " + fileType); @@ -94,7 +92,7 @@ public int write(Sequence in, int fileType, OutputStream out) VaviMfiFileFormat ff = new VaviMfiFileFormat(in); - // header (最低限必要なものはデフォルトを設定) + // header (set the defaults for the minimum requirements) try { // sorc try { ff.getSorc(); } @@ -111,8 +109,8 @@ public int write(Sequence in, int fileType, OutputStream out) // note length ff.setNoteLength(1); } catch (InvalidMfiDataException e) { - // TODO IOException でいいのか? - throw (IOException) new IOException(e); + // TODO is IOException ok? + throw new IOException(e); } int type = ff.getMajorType(); @@ -186,5 +184,3 @@ public int write(Sequence in, int fileType, File out) } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviMidiConverter.java b/src/main/java/vavi/sound/mfi/vavi/VaviMidiConverter.java index ea927a6..3ffc085 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviMidiConverter.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviMidiConverter.java @@ -277,7 +277,6 @@ private void addEventToTrack(MfiContext mfiContext, long tick, Track mfiTrack, i mfiMessage); mfiTrack.add(mfiEvent); } - //---- /** Converts mfi sequence to midi sequence */ @@ -340,5 +339,3 @@ protected Sequence convert(vavi.sound.mfi.Sequence mfiSequence) return midiSequence; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviNoteMessage.java b/src/main/java/vavi/sound/mfi/vavi/VaviNoteMessage.java index 060ceab..c933351 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviNoteMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviNoteMessage.java @@ -35,17 +35,16 @@ public VaviNoteMessage(int delta, int status, int data) { super(delta, status, data); } - /** MFi2 note = 1 の場合 */ + /** case of MFi2 note = 1 */ public VaviNoteMessage(int delta, int status, int data1, int data2) { super(delta, status, data1, data2); } /** for {@link MfiConvertible}, note = 1 */ - public VaviNoteMessage() { // TODO public ぐぬぬ... + public VaviNoteMessage() { // TODO public mhh... super(); } - /* */ @Override public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataException { @@ -79,9 +78,9 @@ public MidiEvent[] getMidiEvents(MidiContext context) } /** - * TODO Δタイムが、直前の同ボイス、同キーの NoteMessage の - * ゲートタイムより小さい場合は直前の NoteMessage からの継続音とする - * TODO 次の音まで余裕があったら伸ばして、無かったら切る?(未実装) + * TODO if the Δ time is smaller than the gate time of the previous NoteMessage of the same voice and same key, + * it will be the continuation sound from the previous NoteMessage. + * TODO if there is room for the next note, do you extend it, and if there is not, cut it? (unimplemented) */ @Override public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) @@ -95,7 +94,7 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) //Debug.println(midiEvent.getTick() + ", " + channel + ", " + command + ", " + (context.retrievePitch(channel, data1) + 45) + ", " + (data2 / 2)); if (command == ShortMessage.NOTE_OFF || - // note on で velocity 0 の場合 + // note on with velocity 0 (command == ShortMessage.NOTE_ON && data2 == 0)) { if (!context.isNoteOffEventUsed()) { @@ -180,5 +179,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/VaviSequencer.java b/src/main/java/vavi/sound/mfi/vavi/VaviSequencer.java index da41d2c..6f7b9b9 100644 --- a/src/main/java/vavi/sound/mfi/vavi/VaviSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/VaviSequencer.java @@ -255,5 +255,3 @@ public Receiver getReceiver() throws MidiUnavailableException { return midiSynthesizer.getReceiver(); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/audio/AdpmMessage.java b/src/main/java/vavi/sound/mfi/vavi/audio/AdpmMessage.java index 7c620fc..c491b4b 100644 --- a/src/main/java/vavi/sound/mfi/vavi/audio/AdpmMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/audio/AdpmMessage.java @@ -10,24 +10,24 @@ /** - * ADPCM 情報 MFi Audio Sub Chunk. + * ADPCM information MFi Audio Sub Chunk. * *
      *  "adpm" 3 bytes
      *  0: sampling rate 0 ~ 255 kHz
    - *   {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2} の場合
    - *    32, 16, 8 のみ使用可能
    + *   in case of {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2},
    + *    only 32, 16, 8 are available
      *  1: sampling bits 0 ~ 255 bits
    - *   {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2} の場合
    - *    2, 4 のみ使用可能
    + *   in cace of {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2},
    + *    only 2, 4 are available
      *  2: .... 3 210
      *          ~ ~~~
      *          | +- channels 1: mono, 2: stereo, else: reserved
      *          +- 0: non interleave, 1: interleave
      *
    - *    channels が 1 の場合 interleave は 0
    - *   {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2} の場合
    - *    channels が 2 の場合 interleave は 0
    + *    when channels is 1, interleave is 0
    + *   in case of {@link vavi.sound.mfi.vavi.AudioDataMessage#FORMAT_ADPCM_TYPE2},
    + *    when channels is 2, interleave is 0
      * 
    * * @author Naohide Sano (nsano) @@ -89,5 +89,3 @@ public String toString() { getChannels(); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/audio/CommonAudioMessage.java b/src/main/java/vavi/sound/mfi/vavi/audio/CommonAudioMessage.java index 901d701..94a0d19 100644 --- a/src/main/java/vavi/sound/mfi/vavi/audio/CommonAudioMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/audio/CommonAudioMessage.java @@ -172,5 +172,3 @@ private static List getAudioEventsType2(byte[] data, int sampleRate, i return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/audio/FuetrekAudioMessage.java b/src/main/java/vavi/sound/mfi/vavi/audio/FuetrekAudioMessage.java index ed8e115..28b3548 100644 --- a/src/main/java/vavi/sound/mfi/vavi/audio/FuetrekAudioMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/audio/FuetrekAudioMessage.java @@ -113,5 +113,3 @@ public static int getDelta(float time) { return Math.round(time / aDelta); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/audio/RohmAudioMessage.java b/src/main/java/vavi/sound/mfi/vavi/audio/RohmAudioMessage.java index b9fa86f..571a5e0 100644 --- a/src/main/java/vavi/sound/mfi/vavi/audio/RohmAudioMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/audio/RohmAudioMessage.java @@ -55,5 +55,3 @@ public static int getDelta(float time) { return Math.round(time / aDelta); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/audio/YamahaAudioMessage.java b/src/main/java/vavi/sound/mfi/vavi/audio/YamahaAudioMessage.java index 2e101ff..4d6b8f7 100644 --- a/src/main/java/vavi/sound/mfi/vavi/audio/YamahaAudioMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/audio/YamahaAudioMessage.java @@ -55,5 +55,3 @@ public static int getDelta(float time) { return Math.round(time / aDelta); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/header/AinfMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/AinfMessage.java index 9523e3f..f4d1fc7 100644 --- a/src/main/java/vavi/sound/mfi/vavi/header/AinfMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/header/AinfMessage.java @@ -17,7 +17,7 @@ /** - * オーディオチャンク情報 MFi Header Sub Chunk. + * MFi Header Sub Chunk for audio chunk information. *
      *  0: 7 6 543210
      *       ^ ~~~~~~
    @@ -159,5 +159,3 @@ public String toString() {
             return sb.toString();
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/AuthMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/AuthMessage.java
    index 216673e..132e95a 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/AuthMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/AuthMessage.java
    @@ -12,7 +12,7 @@
     
     
     /**
    - * 著作権管理情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for copyright control information.
      * 
  • TODO use {@link CodeMessage} * @author Naohide Sano (nsano) * @version 0.00 030822 nsano initial version
    @@ -48,5 +48,3 @@ public String toString() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/header/CodeMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/CodeMessage.java index 06c8001..d6ef51c 100644 --- a/src/main/java/vavi/sound/mfi/vavi/header/CodeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/header/CodeMessage.java @@ -11,7 +11,7 @@ /** - * 文字コード情報 MFi Header Sub Chunk. + * MFi Header Sub Chunk for character code information. *
      *  "code" 4 bytes: code
      * 
    @@ -72,5 +72,3 @@ public String toString() { return TYPE + ": " + getDataLength() + ": " + getCode(); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/header/CopyMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/CopyMessage.java index aa79e44..a8ad03e 100644 --- a/src/main/java/vavi/sound/mfi/vavi/header/CopyMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/header/CopyMessage.java @@ -25,7 +25,7 @@ /** - * Copyright 情報 MFi Header Sub Chunk. + * MFi Header Sub Chunk for copyright information. *
      *  "copy" n bytes: copyright
      *  MIDI {@link MidiConstants.MetaEvent#META_COPYRIGHT META_COPYRIGHT (0x02)}
    @@ -97,5 +97,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) throws I
             };
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/DateMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/DateMessage.java
    index 33aba88..3f0eb42 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/DateMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/DateMessage.java
    @@ -12,7 +12,7 @@
     
     
     /**
    - * 日付情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for date information.
      *
      * 
      *  "date" 8 bytes: date created
    @@ -49,5 +49,3 @@ public String toString() {
             return "date: " + length + ": " + new String(data);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/ExstMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/ExstMessage.java
    index 33adec9..e5fbe7b 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/ExstMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/ExstMessage.java
    @@ -11,7 +11,7 @@
     
     
     /**
    - * 拡張ステータス A メッセージ長 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for "Extended Status A" message length.
      *
      * 
      *  "exst" 2 bytes: extended status data length
    @@ -57,10 +57,8 @@ public void setExst(int data)
             });
         }
     
    -    /** */
    +    @Override
         public String toString() {
             return TYPE + ": " + getDataLength() + ": " + getExst();
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/NoteMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/NoteMessage.java
    index e1ae568..f71966f 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/NoteMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/NoteMessage.java
    @@ -10,7 +10,7 @@
     
     
     /**
    - * ノートメッセージ長情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for note message length information.
      *
      * 
      *  "note" 2 bytes: note length (1 for 4byte)
    @@ -59,5 +59,3 @@ public String toString() {
             return "note: " + getDataLength() + ": " + getNoteLength();
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/ProtMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/ProtMessage.java
    index 8de3fee..9f24773 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/ProtMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/ProtMessage.java
    @@ -23,7 +23,7 @@
     
     
     /**
    - * データ管理及び保護情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for data management and data protection information.
      * 
      *  "prot" n bytes: data managing
      *  MIDI {@link MidiConstants.MetaEvent#META_TEXT_EVENT META_TEXT_EVENT (0x01)}
    @@ -104,5 +104,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context)
             };
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/SorcMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/SorcMessage.java
    index b439c83..762b4f2 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/SorcMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/SorcMessage.java
    @@ -10,7 +10,7 @@
     
     
     /**
    - * 再配布不可識別子 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for non-redistributable identifier.
      *
      * 
      *
    @@ -65,5 +65,3 @@ public String toString() {
             return String.format("sorc: %d: 0x%02x", getDataLength(), getSorc());
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/SuptMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/SuptMessage.java
    index 132e239..8220305 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/SuptMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/SuptMessage.java
    @@ -12,7 +12,7 @@
     
     
     /**
    - * サポート情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for support information.
      *
      * @author Naohide Sano (nsano)
      * @version 0.00 030822 nsano initial version 
    @@ -48,5 +48,3 @@ public String toString() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/header/ThrdMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/ThrdMessage.java index f377a36..8403e20 100644 --- a/src/main/java/vavi/sound/mfi/vavi/header/ThrdMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/header/ThrdMessage.java @@ -10,7 +10,7 @@ /** - * 3D 情報 MFi Header Sub Chunk. + * MFi Header Sub Chunk for 3D information. *
      *  "thrd"  bytes:
      * 
    @@ -31,5 +31,3 @@ public ThrdMessage(String type, byte[] data) { super(TYPE, data); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/header/TitlMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/TitlMessage.java index 489011c..a3d1130 100644 --- a/src/main/java/vavi/sound/mfi/vavi/header/TitlMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/header/TitlMessage.java @@ -25,7 +25,7 @@ /** - * タイトル情報 MFi Header Sub Chunk. + * MFi Header Sub Chunk for title information. *
      *  "titl" n byte: mld title, < 16 bytes expected, SJIS encoded
      *  MIDI {@link MidiConstants.MetaEvent#META_NAME META_NAME (0x03)}
    @@ -93,7 +93,7 @@ public MidiEvent[] getMidiEvents(MidiContext context)
     
             MetaMessage metaMessage = new MetaMessage();
     
    -        metaMessage.setMessage(MetaEvent.META_NAME.number(),    // シーケンス名/トラック名
    +        metaMessage.setMessage(MetaEvent.META_NAME.number(),    // sequence name/track name
                                    getData(),
                                    getDataLength());
     
    @@ -115,5 +115,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context)
             };
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/header/VersMessage.java b/src/main/java/vavi/sound/mfi/vavi/header/VersMessage.java
    index 2400043..87ace82 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/header/VersMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/header/VersMessage.java
    @@ -13,7 +13,7 @@
     
     
     /**
    - * バージョン情報 MFi Header Sub Chunk.
    + * MFi Header Sub Chunk for version information.
      *
      * 
      *  "vers" 4 bytes: mld version
    @@ -74,5 +74,3 @@ public String toString() {
                    ": " + getVersion();
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function1.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function1.java
    index adef361..22087d6 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function1.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function1.java
    @@ -44,9 +44,7 @@ public void process(MachineDependentMessage message)
             int voice     = (data[7] & 0xc0) >> 6;  // 0 ~ 3
             int pitchBend =  data[7] & 0x3f;        // -32 ~ 31
             pitchBend *= (data[7] & 0x20) != 0 ? -1 : 0;
    -        // pitchBend * Pitch Bend Range * 100 / 32 [セント]
    +        // pitchBend * Pitch Bend Range * 100 / 32 [cent]
     Debug.printf(Level.FINE, "Pitch Bend: %02x %d\n", voice, pitchBend);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function129.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function129.java
    index ddda567..e8c9859 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function129.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function129.java
    @@ -72,5 +72,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function130.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function130.java
    index 10b0e1f..468f2b2 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function130.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function130.java
    @@ -72,5 +72,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function131.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function131.java
    index f87c305..0cc9622 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function131.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function131.java
    @@ -25,16 +25,16 @@
      */
     public class Function131 implements MachineDependentFunction {
     
    -    /** すぐにデータを利用せずに、一時的に保存しておく */
    +    /** not use data immediately, store temporarily */
         public static final int MODE_STORE = 0;
    -    /** すぐにデータを利用する */
    +    /** use data immediately */
         public static final int MODE_SET = 1;
    -    /** リサイクルモード wave size = 0 */
    +    /** recycle mode wave size = 0 */
         public static final int MODE_RECYCLE = 2;
    -    /** 予約 */
    +    /** reserved */
         public static final int MODE_RESERVED = 3;
     
    -    /** このデータのヘッダ分長さ */
    +    /** header length of this data */
         public static final int HEADER_LENGTH = 10;
     
         /**
    @@ -90,7 +90,7 @@ public void process(MachineDependentMessage message)
             play();
         }
     
    -    /** mode 別に再生します。 */
    +    /** Plays by mode. */
         protected void play() {
     
             AudioEngine player = MitsubishiSequencer.getAudioEngine();
    @@ -114,16 +114,16 @@ protected void play() {
         protected int packetId;
         /** @see #MODE_RECYCLE MODE_* */
         protected int mode = MODE_SET;
    -    /** サンプリングレート {4k, 8k, 16k, 32k} */
    +    /** sampling rate {4k, 8k, 16k, 32k} */
         protected int sampleRate = 16000;
    -    /** adpcm の最小単位 {2bit, 4bit} */
    +    /** adpcm minimum unit {2bit, 4bit} */
         protected int bits = 4;
         /** */
         protected boolean continued = false;
    -    /** ADPCM のバッファ */
    +    /** ADPCM buffer */
         protected byte[] adpcm;
     
    -    /** サンプリングレートを取得します。 */
    +    /** Gets sampling rate. */
         protected int getSamplingRateInternal(int format1) {
             int sampleRate = 8000;
             switch (format1) {
    @@ -146,7 +146,7 @@ protected int getSamplingRateInternal(int format1) {
             return sampleRate;
         }
     
    -    /** サンプリングビット数を取得します。 */
    +    /** Get sampling bits. */
         protected int getSamplingBitsInternal(int format2) {
             int bits = 4;
             switch (format2) {
    @@ -163,7 +163,7 @@ protected int getSamplingBitsInternal(int format2) {
             return bits;
         }
     
    -    //-------------------------------------------------------------------------
    +    //----
     
         /** ADPCM channel */
         public void setChannel(int channel) {
    @@ -235,9 +235,9 @@ protected int getSamplingBitsInternal()  {
         }
     
         /**
    -     * 事前に {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)},
    -     * {@link #setSamplingBits(int)} を用いてフィールドを設定しておいて下さい。
    -     * 
  • wav2mld は continued のとき mode が MODE_STORE で、最後に MODE_RECYCLE + * Set fields {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)}, + * using {@link #setSamplingBits(int)} in advance. + *
  • wav2mld: when continued, mode is MODE_STORE, and at last MODE_RECYCLE */ public byte[] getMessage() throws InvalidMfiDataException { @@ -262,5 +262,3 @@ public byte[] getMessage() throws InvalidMfiDataException { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function132.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function132.java index ea60188..a63844c 100644 --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function132.java +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function132.java @@ -24,14 +24,14 @@ */ public class Function132 extends Function131 { - /** このデータのヘッダ分長さ */ + /** header length of this data */ @SuppressWarnings("hiding") public static final int HEADER_LENGTH = 14; /** * 0x84 Wave Packet Data3 MFi2, MFi3 *

    - * TODO playSize の反映 + * TODO reflect playSize *

    * @param message see below *
    @@ -80,15 +80,15 @@ public void process(MachineDependentMessage message)
         protected int length;
     
         /**
    -     * @param length 一番最初のチャンクに後続全てを足した長さ、それ以外は 0 を指定してください。
    +     * @param length specify the length of the first chunk plus all subsequent chunks, and 0 for other chunks.
          */
         public void setLength(int length) {
             this.length = length;
         }
     
         /**
    -     * 事前に {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)},
    -     * {@link #setSamplingBits(int)} を用いてフィールドを設定しておいて下さい。
    +     * set fields {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)},
    +     * using {@link #setSamplingBits(int)} in advance
          */
         @Override
         public byte[] getMessage() throws InvalidMfiDataException {
    @@ -119,5 +119,3 @@ public byte[] getMessage() throws InvalidMfiDataException {
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function143.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function143.java
    index bba4735..bcf2c5e 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function143.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function143.java
    @@ -25,7 +25,7 @@
      */
     public class Function143 implements MachineDependentFunction {
     
    -    /** このデータのヘッダ分長さ */
    +    /** header length of this data */
         private static final int HEADER_LENGTH = 7;
     
         /**
    @@ -175,5 +175,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function16.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function16.java
    index ea98b8e..2bb4661 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function16.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function16.java
    @@ -46,5 +46,3 @@ public void process(MachineDependentMessage message)
     Debug.printf(Level.FINE, "0x10: %02x %02x\n", channel, f2);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function17.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function17.java
    index c96c070..72a1b1c 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function17.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function17.java
    @@ -46,5 +46,3 @@ public void process(MachineDependentMessage message)
     Debug.printf(Level.FINE, "0x11: %02x %02x\n", channel, f2);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function2.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function2.java
    index 860b748..6f829b7 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function2.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function2.java
    @@ -46,5 +46,3 @@ public void process(MachineDependentMessage message)
     Debug.printf(Level.FINE, "Pitch Bend Range: %02x %02x\n", voice, pitchBendRange);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function3.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function3.java
    index 36d8ad3..daefa6a 100755
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function3.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/Function3.java
    @@ -46,5 +46,3 @@ public void process(MachineDependentMessage message)
     Debug.printf(Level.FINE, "Vibrato: %d %02x\n", voice, modulation);
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiMessage.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiMessage.java
    index 998ce9b..52f9053 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiMessage.java
    @@ -22,7 +22,7 @@
     /**
      * Mitsubishi System exclusive message.
      * 

    - * TODO 機能ごとに FunctionXXX に移す + * TODO move each function to FunctionXXX *

    * @author Naohide Sano (nsano) * @version 0.00 030711 nsano initial version
    @@ -42,7 +42,7 @@ public final class MitsubishiMessage extends FuetrekAudioMessage { /** * 0x83 *

    - * TODO 時間指定ない場合 + * TODO if no time is specified *

    * @param pcm wave (PCM), 16bit * @param sampleRate 4k, 8k, 16k, 32k are available @@ -221,13 +221,11 @@ public static MfiEvent getSettingEvent(int sampleRate, int bits, int channels) t function.setMaxSample(sampleRate); // 0x89 function.setMaxSampleCue(sampleRate); - // 0x83 要は 16kHz, 4bit mono の時 = 4, 8kHz, 4bit mono の時に 2 - function.setMaxParallel(sampleRate * (bits / 2) * channels); // TODO bit 適当 - // 0x8B 要は 16kHz, 4bit mono の時 = 4, 8kHz, 4bit mono の時に 2 - function.setMaxParallelCue(sampleRate * (bits / 2) * channels); // TODO bit 適当 + // 0x83 Briefly when "16kHz, 4bit mono" is 4, when "8kHz, 4bit mono" is 2 + function.setMaxParallel(sampleRate * (bits / 2) * channels); // TODO bit sloppy + // 0x8B Briefly when "16kHz, 4bit mono" is 4, when "8kHz, 4bit mono" is 2 + function.setMaxParallelCue(sampleRate * (bits / 2) * channels); // TODO bit sloppy message.setMessage(0x00, function.getMessage()); return new MfiEvent(message, 0L); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiSequencer.java b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiSequencer.java index 1088b15..5cea042 100644 --- a/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/mitsubishi/MitsubishiSequencer.java @@ -67,5 +67,3 @@ static AudioEngine getAudioEngine() { private static MachineDependentFunction.Factory factory = new MachineDependentFunction.Factory("/vavi/sound/mfi/vavi/mitsubishi/mitsubishi.properties"); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_240_7.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_240_7.java index d13775f..cd192e4 100755 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_240_7.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_240_7.java @@ -17,7 +17,7 @@ /** * NEC System exclusive message function 0x01, 0xf0, 0x07 processor. - * (拡張ストリーム波形制御情報) + * (extended stream wave control information) * * @author Naohide Sano (nsano) * @version 0.00 030827 nsano initial version
    @@ -25,11 +25,11 @@ */ public class Function1_240_7 implements MachineDependentFunction { - /** このデータのヘッダ分長さ */ + /** header length of this data */ public static final int HEADER_LENGTH = 13; /** - * 0x01, 0xf0, 0x07 拡張ストリーム波形制御情報 + * 0x01, 0xf0, 0x07 extended stream wave control information * * @param message see below *
    @@ -61,8 +61,8 @@ public void process(MachineDependentMessage message)
     
             this.streamNumber = data[ 9] & 0xff;            // stream number 0 ~ 31
             this.mono =        (data[10] & 0x80) == 0;      // 0: mono, 1: stereo
    -        this.format =      (data[10] & 0x03) >> 1;      // 0: 4bit ADPCM (0db Center 固定), 1: 4bit ADPCM
    -        this.sampleRate =  ((data[11] & 0xff) << 8) + (data[12] & 0xff);  // 4000 ~ 16000 (stereo 時は半分)
    +        this.format =      (data[10] & 0x03) >> 1;      // 0: 4bit ADPCM (0db Center fixed), 1: 4bit ADPCM
    +        this.sampleRate =  ((data[11] & 0xff) << 8) + (data[12] & 0xff);  // 4000 ~ 16000 (make it half when stereo)
     
             int adpcmLength = data.length - HEADER_LENGTH;
     Debug.println(Level.FINE, "ADPCM: No." + streamNumber + ", " + sampleRate + "Hz, " + adpcmLength + " bytes, " + (mono ? "mono" : "stereo") + ", " + format);
    @@ -78,9 +78,9 @@ public void process(MachineDependentMessage message)
         private int streamNumber;
         /** 0: mono, 1: stereo */
         private boolean mono;
    -    /** 0: 4bit ADPCM (0db Center 固定), 1: 4bit ADPCM */
    +    /** 0: 4bit ADPCM (0db Center fixed), 1: 4bit ADPCM */
         private int format;
    -    /** 4000 ~ 16000 (stereo 時は半分) */
    +    /** 4000 ~ 16000 (make it half when stereo) */
         private int sampleRate;
         /** little endian */
         private byte[] adpcm;
    @@ -93,7 +93,7 @@ public void setAdpcm(byte[] adpcm) {
         }
     
         /**
    -     * @param format 0: 4bit ADPCM (0db Center 固定), 1: 4bit ADPCM (wav2mld use 1)
    +     * @param format 0: 4bit ADPCM (0db Center fixed), 1: 4bit ADPCM (wav2mld use 1)
          */
         public void setFormat(int format) {
             this.format = format & 0x03;
    @@ -117,8 +117,8 @@ public void setSamplingRate(int samplingRate) {
         }
     
         /**
    -     * 事前に #setPcm(InputStream), #setSamplingRate(int)
    -     * を用いてフィールドを設定しておいて下さい。
    +     * set fields using #setPcm(InputStream), #setSamplingRate(int)
    +     * in advance.
          */
         public byte[] getMessage()
             throws InvalidMfiDataException {
    @@ -141,5 +141,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_3.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_3.java
    index 38af87e..65af971 100755
    --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_3.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_3.java
    @@ -96,5 +96,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_4.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_4.java
    index b1e9df9..827516f 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_4.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_4.java
    @@ -96,5 +96,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_5.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_5.java
    index 772c07d..8ee4186 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_5.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_5.java
    @@ -84,5 +84,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_6.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_6.java
    index f55766d..cb614d3 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_6.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_241_6.java
    @@ -93,5 +93,3 @@ public byte[] getMessage()
             return tmp;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_3.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_3.java
    index 128aac2..d5c9b1e 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_3.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_3.java
    @@ -16,7 +16,7 @@
     
     /**
      * NEC System exclusive message function 0x01, 0xf3, 0x03 processor.
    - * (MaxGain 設定)
    + * (MaxGain setting)
      *
      * @author Naohide Sano (nsano)
      * @version 0.00 051113 nsano initial version 
    @@ -59,7 +59,7 @@ public void process(MachineDependentMessage message) /** 0 ~ 96 (-96db), default 24 */ public void setMaxGain(int maxGain) { - this.maxGain = Math.min(maxGain, 96); // TODO minus が通るよ + this.maxGain = Math.min(maxGain, 96); // TODO minus accepted } /** */ @@ -75,5 +75,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_4.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_4.java index 0bc6e74..b6aac30 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_4.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function1_243_4.java @@ -16,7 +16,7 @@ /** * NEC System exclusive message function 0x01, 0xf3, 0x04 processor. - * (ストリーム数指定) + * (specifying stream count) * * @author Naohide Sano (nsano) * @version 0.00 051113 nsano initial version
    @@ -76,5 +76,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function240_1.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function240_1.java index c3e9f76..abbb9f6 100755 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function240_1.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function240_1.java @@ -49,5 +49,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.FINEST, "data:\n" + StringUtil.getDump(data, 32)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function240_2.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function240_2.java index 8304517..58d7d4e 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function240_2.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function240_2.java @@ -25,7 +25,7 @@ */ public class Function240_2 implements MachineDependentFunction { - /** このデータのヘッダ分長さ */ + /** header length of this data */ private static final int HEADER_LENGTH = 10; /** @@ -121,5 +121,3 @@ public byte[] getMessage() throws InvalidMfiDataException { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_0.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_0.java index 79b03fa..5503319 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_0.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_0.java @@ -79,5 +79,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_1.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_1.java index 38a93d1..529c7dc 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_1.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_1.java @@ -50,5 +50,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.FINEST, "\n" + StringUtil.getDump(data, 32)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_2.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_2.java index 4bbdbd7..61937bd 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function241_2.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function241_2.java @@ -50,5 +50,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.FINEST, StringUtil.getDump(data)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_1.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_1.java index 36e0611..5bf0800 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_1.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_1.java @@ -71,5 +71,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_4.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_4.java index 93261e2..1969e72 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_4.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_4.java @@ -51,5 +51,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.FINEST, StringUtil.getDump(data)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_5.java b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_5.java index 43b2658..1404ff1 100755 --- a/src/main/java/vavi/sound/mfi/vavi/nec/Function242_5.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/Function242_5.java @@ -51,5 +51,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.FINE, StringUtil.getDump(data)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/NecMessage.java b/src/main/java/vavi/sound/mfi/vavi/nec/NecMessage.java index 4bb690f..f12a2b3 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/NecMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/NecMessage.java @@ -309,7 +309,7 @@ public static MfiEvent getPanEvent(int channel, int streamNumber, int pan) throw //---- /** - * Creates adpcm data message. (original pure stereo, TODO 鳴らん...) + * Creates adpcm data message. (original pure stereo, TODO cannot play...) *
          * 0x01 0xf0 0x_7
          * 
    @@ -397,5 +397,3 @@ public static List getAdpcmEventsEx(byte[] pcm, float time, int sample return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/nec/NecSequencer.java b/src/main/java/vavi/sound/mfi/vavi/nec/NecSequencer.java index ffd6079..bf42f56 100644 --- a/src/main/java/vavi/sound/mfi/vavi/nec/NecSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/nec/NecSequencer.java @@ -92,5 +92,3 @@ static AudioEngine getAudioEngine() { private static MachineDependentFunction.Factory factory = new MachineDependentFunction.Factory("/vavi/sound/mfi/vavi/nec/nec.properties"); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/AudioDataSequencer.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/AudioDataSequencer.java index 810a18b..dcc3d98 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/AudioDataSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/AudioDataSequencer.java @@ -63,5 +63,3 @@ private Factory() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentFunction.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentFunction.java index c1188cb..8cc20f2 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentFunction.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentFunction.java @@ -67,5 +67,3 @@ public MachineDependentFunction getFunction(String key) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencer.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencer.java index 8ca75ee..e4f8f5e 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencer.java @@ -35,5 +35,3 @@ void sequence(MachineDependentMessage message) PrefixedPropertiesFactory factory = new PrefixedClassPropertiesFactory<>("/vavi/sound/mfi/vavi/vavi.properties", "sequencer.vendor."); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/MfiMessageStore.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/MfiMessageStore.java index 85dc701..da28993 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/MfiMessageStore.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/MfiMessageStore.java @@ -15,7 +15,7 @@ /** * temporary store. *

    - * TODO 何とかして撲滅したい -> ThreadLocal ? + * TODO I want to remove this class somehow -> ThreadLocal? *

    * * @author Naohide Sano (nsano) @@ -33,7 +33,7 @@ private MfiMessageStore() { } /** - * @return {@link javax.sound.midi.MetaMessage} で使用される id + * @return id used by {@link javax.sound.midi.MetaMessage} */ public static /* synchronized */ int put(MfiMessage message) { try { @@ -49,5 +49,3 @@ public static MfiMessage get(int id) { return stores.get(id); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/UndefinedFunction.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/UndefinedFunction.java index 360905a..329dc54 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/UndefinedFunction.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/UndefinedFunction.java @@ -55,5 +55,3 @@ public void process(MachineDependentMessage message) Debug.println(Level.INFO, StringUtil.getDump(message.getMessage(), 128)); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sequencer/UnknownVenderSequencer.java b/src/main/java/vavi/sound/mfi/vavi/sequencer/UnknownVenderSequencer.java index d498890..3740945 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sequencer/UnknownVenderSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/sequencer/UnknownVenderSequencer.java @@ -26,5 +26,3 @@ public void sequence(MachineDependentMessage message) mdf.process(message); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/Function129.java b/src/main/java/vavi/sound/mfi/vavi/sharp/Function129.java index 6be4b7e..c34a601 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/Function129.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/Function129.java @@ -77,5 +77,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/Function130.java b/src/main/java/vavi/sound/mfi/vavi/sharp/Function130.java index e50af8b..8660e0d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/Function130.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/Function130.java @@ -77,5 +77,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/Function131.java b/src/main/java/vavi/sound/mfi/vavi/sharp/Function131.java index e0ada53..e6b7b35 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/Function131.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/Function131.java @@ -25,16 +25,16 @@ */ public class Function131 implements MachineDependentFunction { - /** すぐにデータを利用せずに、一時的に保存しておく */ + /** not use data immediately, store temporarily */ public static final int MODE_STORE = 0; - /** すぐにデータを利用する */ + /** use data immediately */ public static final int MODE_SET = 1; - /** リサイクルモード wave size = 0 */ + /** recycle mode wave size = 0 */ public static final int MODE_RECYCLE = 2; - /** 予約 */ + /** reserved */ public static final int MODE_RESERVED = 3; - /** このデータのヘッダ分長さ */ + /** header length of this data */ public static final int HEADER_LENGTH = 10; /** @@ -90,7 +90,7 @@ public void process(MachineDependentMessage message) play(); } - /** mode 別に再生します。 */ + /** Play by mode. */ protected void play() { AudioEngine player = SharpSequencer.getAudioEngine(); @@ -114,16 +114,16 @@ protected void play() { protected int packetId; /** @see #MODE_RECYCLE MODE_* */ protected int mode = MODE_SET; - /** サンプリングレート {4k, 8k, 16k, 32k} */ + /** sampling rate {4k, 8k, 16k, 32k} */ protected int sampleRate = 16000; - /** adpcm の最小単位 {2bit, 4bit} */ + /** adpcm minimum unit {2bit, 4bit} */ protected int bits = 4; /** */ protected boolean continued = false; - /** ADPCM のバッファ */ + /** ADPCM buffer */ protected byte[] adpcm; - /** サンプリングレートを取得します。 */ + /** Gets sampling rate. */ protected int getSamplingRateInternal(int format1) { int sampleRate = 8000; switch (format1) { @@ -146,7 +146,7 @@ protected int getSamplingRateInternal(int format1) { return sampleRate; } - /** サンプリングビット数を取得します。 */ + /** Gets sampling bits. */ protected int getSamplingBitsInternal(int format2) { int bits = 4; switch (format2) { @@ -235,9 +235,9 @@ protected int getSamplingBitsInternal() { } /** - * 事前に {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)}, - * {@link #setSamplingBits(int)} を用いてフィールドを設定しておいて下さい。 - *
  • TODO wav2mld は continued のとき mode が MODE_STORE で、最後に MODE_RECYCLE + * Set fields using {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)}, + * {@link #setSamplingBits(int)} in advance. + *
  • TODO wav2mld: when continued, mode is MODE_STORE and MODE_RECYCLE at last */ public byte[] getMessage() throws InvalidMfiDataException { @@ -262,5 +262,3 @@ public byte[] getMessage() throws InvalidMfiDataException { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/Function132.java b/src/main/java/vavi/sound/mfi/vavi/sharp/Function132.java index 1f48c84..74e488a 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/Function132.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/Function132.java @@ -23,7 +23,7 @@ */ public class Function132 extends Function131 { - /** このデータのヘッダ分長さ */ + /** header length of this data */ @SuppressWarnings("hiding") public static final int HEADER_LENGTH = 14; @@ -89,15 +89,15 @@ public void process(MachineDependentMessage message) protected int length; /** - * @param length 一番最初のチャンクに後続全てを足した長さ、それ以外は 0 を指定してください。 + * @param length specify the length of the first chunk plus all subsequent chunks, and 0 for other chunks. */ public void setLength(int length) { this.length = length; } /** - * 事前に {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)}, - * {@link #setSamplingBits(int)} を用いてフィールドを設定しておいて下さい。 + * set fields using {@link #setAdpcm(byte[])}, {@link #setSamplingRate(int)}, + * {@link #setSamplingBits(int)} in advance. */ @Override public byte[] getMessage() throws InvalidMfiDataException { @@ -128,5 +128,3 @@ public byte[] getMessage() throws InvalidMfiDataException { return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/Function143.java b/src/main/java/vavi/sound/mfi/vavi/sharp/Function143.java index 8602f28..1303a26 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/Function143.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/Function143.java @@ -26,7 +26,7 @@ */ public class Function143 implements MachineDependentFunction { - /** このデータのヘッダ分長さ */ + /** header length of this data */ private static final int HEADER_LENGTH = 7; /** @@ -167,5 +167,3 @@ public byte[] getMessage() return tmp; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/SharpMessage.java b/src/main/java/vavi/sound/mfi/vavi/sharp/SharpMessage.java index 0b0c8a3..13b734b 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/SharpMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/SharpMessage.java @@ -206,13 +206,11 @@ public static MfiEvent getSettingEvent(int sampleRate, int bits, int channels) t function.setMaxSample(sampleRate); // 0x89 function.setMaxSampleCue(sampleRate); - // 0x83 要は 16kHz, 4bit mono の時 = 4, 8kHz, 4bit mono の時に 2 - function.setMaxParallel(sampleRate * (sampleRate / 8000) * channels); // TODO 適当 - // 0x8B 要は 16kHz, 4bit mono の時 = 4, 8kHz, 4bit mono の時に 2 - function.setMaxParallelCue(sampleRate * (sampleRate / 8000) * channels); // TODO 適当 + // 0x83 Briefly when "16kHz, 4bit mono" is 4, when "8kHz, 4bit mono" is 2 + function.setMaxParallel(sampleRate * (sampleRate / 8000) * channels); // TODO sloppy + // 0x8B Briefly when "16kHz, 4bit mono" is 4, when "8kHz, 4bit mono" is 2 + function.setMaxParallelCue(sampleRate * (sampleRate / 8000) * channels); // TODO sloppy message.setMessage(0x00, function.getMessage()); return new MfiEvent(message, 0L); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/sharp/SharpSequencer.java b/src/main/java/vavi/sound/mfi/vavi/sharp/SharpSequencer.java index c5346be..5567d80 100644 --- a/src/main/java/vavi/sound/mfi/vavi/sharp/SharpSequencer.java +++ b/src/main/java/vavi/sound/mfi/vavi/sharp/SharpSequencer.java @@ -65,5 +65,3 @@ static AudioEngine getAudioEngine() { private static MachineDependentFunction.Factory factory = new MachineDependentFunction.Factory("/vavi/sound/mfi/vavi/sharp/sharp.properties"); } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelPanpotMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelPanpotMessage.java index 98eb23b..091c940 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelPanpotMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelPanpotMessage.java @@ -102,7 +102,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -116,5 +116,3 @@ public void sequence() throws InvalidMfiDataException { // TODO Auto-generated method stub } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelVolumeMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelVolumeMessage.java index b387d58..b145197 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelVolumeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/AudioChannelVolumeMessage.java @@ -100,7 +100,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -114,5 +114,3 @@ public void sequence() throws InvalidMfiDataException { // TODO Auto-generated method stub } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/AudioPlayMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/AudioPlayMessage.java index c522406..d1927c3 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/AudioPlayMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/AudioPlayMessage.java @@ -104,7 +104,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -122,5 +122,3 @@ public void sequence() throws InvalidMfiDataException { engine.start(id); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/AudioStopMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/AudioStopMessage.java index 8cd9ecf..7c3b27d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/AudioStopMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/AudioStopMessage.java @@ -95,7 +95,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -113,5 +113,3 @@ public void sequence() throws InvalidMfiDataException { engine.stop(id); } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ChangeBankMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ChangeBankMessage.java index 079cace..0f8a588 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ChangeBankMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ChangeBankMessage.java @@ -18,7 +18,7 @@ /** * ChangeBankMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel    true
      *  delta    ?
      * 
    @@ -105,5 +105,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ChangeVoiceMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ChangeVoiceMessage.java index 2b524cd..9d643d8 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ChangeVoiceMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ChangeVoiceMessage.java @@ -22,7 +22,7 @@ /** * ChangeVoiceMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   ?
      * 
    @@ -145,5 +145,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ChannelChangeMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ChannelChangeMessage.java index c70663d..7217750 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ChannelChangeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ChannelChangeMessage.java @@ -18,7 +18,7 @@ /** * ChannelChangeMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   ?
      * 
    @@ -88,5 +88,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ChannelConfigurationMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ChannelConfigurationMessage.java index d2bbc15..7d6d461 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ChannelConfigurationMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ChannelConfigurationMessage.java @@ -35,7 +35,7 @@ public class ChannelConfigurationMessage extends ShortMessage /** * for {@link vavi.sound.mfi.vavi.TrackMessage} * @param delta delta time - * @param status + * @param status unused 0xff fixed * @param data1 0xba * @param data2
          *  .6543 210 LSB
    @@ -71,8 +71,8 @@ public String toString() {
         //----
     
         /**
    -     * コンテキストのチャンネルコンフィグレーションを設定します。
    -     * @return 何も返しません
    +     * Sets the context channel configuration.
    +     * @return nothing
          */
         @Override
         public MidiEvent[] getMidiEvents(MidiContext context) {
    @@ -83,5 +83,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) {
             return null;    // TODO
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/mfi/vavi/track/CuePointMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/CuePointMessage.java
    index 6a05c05..710d180 100644
    --- a/src/main/java/vavi/sound/mfi/vavi/track/CuePointMessage.java
    +++ b/src/main/java/vavi/sound/mfi/vavi/track/CuePointMessage.java
    @@ -19,7 +19,7 @@
     /**
      * CuePointMessage.
      * 
    - *  0xff, 0xd# 演奏管理情報
    + *  0xff, 0xd# Play Control Information
      *  channel false
      *  delta   ?
      * 
    @@ -70,8 +70,8 @@ public String toString() { //---- /** - * TODO {@link javax.sound.midi.MetaMessage} に 0x07 キューポイントってあるよ - * @return 何も返しません + * TODO {@link javax.sound.midi.MetaMessage} has 0x07 cue point + * @return return nothing */ @Override public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataException { @@ -99,7 +99,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce String text = start ? "start" : "stop"; - metaMessage.setMessage(MetaEvent.META_QUE_POINT.number(), // キューポイント + metaMessage.setMessage(MetaEvent.META_QUE_POINT.number(), // cue point text.getBytes(), text.getBytes().length); return new MidiEvent[] { @@ -107,5 +107,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/EndOfTrackMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/EndOfTrackMessage.java index 96bb283..f696f3a 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/EndOfTrackMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/EndOfTrackMessage.java @@ -19,7 +19,7 @@ /** * EndOfTrackMessage. *
    - *  0xff, 0xd# 演奏管理情報
    + *  0xff, 0xd# Play Control Information
      *  channel false
      *  delta   true
      * 
    @@ -80,8 +80,8 @@ public MidiEvent[] getMidiEvents(MidiContext context) { } /** - * @return このメソッドの戻り値のみ MFi トラック 0 ~ 3 の EndOfTrackMessage の - * MfiEvent になる。トラックがない場合は null が入っている + * @return The only return value of this method is the MfiEvent of EndOfTrackMessage for MFi tracks 0 ~ 3. + * Contains null if there is no track. */ @Override public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) { @@ -105,5 +105,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) { return mfiEvents; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ExpressionMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ExpressionMessage.java index 0d73193..296956a 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ExpressionMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ExpressionMessage.java @@ -22,7 +22,7 @@ /** * ExpressionMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -102,7 +102,7 @@ public String toString() { //---- - /** TODO エクスプレッションとみなしたけどいいの? */ + /** TODO i considered it an expression, but is that okay? */ @Override public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataException { @@ -116,20 +116,20 @@ public MidiEvent[] getMidiEvents(MidiContext context) // ShortMessage shortMessage = new ShortMessage(); // shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, // channel, -// 7, // メインボリューム MSB +// 7, // main volume MSB // context.getVolume(channel) * 2); // events[0] = new MidiEvent(shortMessage, context.getCurrent()); // shortMessage = new ShortMessage(); // shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, // channel, -// 39, // メインボリューム LSB +// 39, // main volume LSB // 0); // events[1] = new MidiEvent(shortMessage, context.getCurrent()); MidiEvent[] events = new MidiEvent[1]; ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, channel, - 11, // エクスプレッション MSB + 11, // expression MSB getVolume() < 0 ? getVolume() * 2 + 128 : getVolume() * 2); events[0] = new MidiEvent(shortMessage, context.getCurrent()); @@ -158,5 +158,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ExtendedEditMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ExtendedEditMessage.java index 16700a1..03adc63 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ExtendedEditMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ExtendedEditMessage.java @@ -36,7 +36,7 @@ protected ExtendedEditMessage(byte[] message) { /** * for {@link vavi.sound.mfi.vavi.TrackMessage} - * @param is 実際のデータ (ヘッダ無し) + * @param is actual data (without header) */ public static ExtendedEditMessage readFrom(int delta, int status, int data1, InputStream is) throws InvalidMfiDataException, @@ -59,5 +59,3 @@ public String toString() { return "ExtendedEdit:"; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/LoopPointMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/LoopPointMessage.java index 00ccef3..dd43472 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/LoopPointMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/LoopPointMessage.java @@ -17,7 +17,7 @@ /** * LoopPointMessage. *
    - *  0xff, 0xd# 演奏管理情報
    + *  0xff, 0xd# Play Control Information
      *  channel false
      *  delta   ?
      * 
    @@ -61,12 +61,12 @@ public LoopPointMessage(int delta, int status, int data1, int data2) { this.start = data2 & 0x03; } - /** ループID */ + /** loop ID */ public int getNest() { return nest; } - /** ループ回数 0: 無限回 */ + /** loop count, 0: infinity */ public int getTimes() { return times; } @@ -92,5 +92,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/MachineDependentMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/MachineDependentMessage.java index a38183e..fc73247 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/MachineDependentMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/MachineDependentMessage.java @@ -53,7 +53,7 @@ public MachineDependentMessage() { } /** - * メッセージを設定します。データは6バイト目からのもの(実際のデータ)を指定します。 + * Set the message. Specify the data starting from the 6th byte (actual data). * @param delta delta time * @param message data from 6th byte */ @@ -77,7 +77,7 @@ public void setMessage(int delta, byte[] message) /** * for {@link vavi.sound.mfi.vavi.TrackMessage} - * @param is 実際のデータ (ヘッダ無し, data2 ~) + * @param is actual data (without header, data2 ~) */ public static MachineDependentMessage readFrom(int delta, int status, int data1, InputStream is) throws InvalidMfiDataException, @@ -95,7 +95,7 @@ public static MachineDependentMessage readFrom(int delta, int status, int data1, data[1] = (byte) 0xff; // normal 0xff data[2] = (byte) 0xff; // machine depend 0xff data[3] = (byte) ((length / 0x100) & 0xff); // length LSB - data[4] = (byte) ((length % 0x100) & 0xff); // lenght MSB + data[4] = (byte) ((length % 0x100) & 0xff); // length MSB dis.readFully(data, 5, length); @@ -127,17 +127,16 @@ public String toString() { /** *

    - * この {@link MachineDependentMessage} のインスタンスに対応する - * MIDI メッセージとして Meta type 0x7f の {@link MetaMessage} を作成する。 - * {@link MetaMessage} の実データとして {@link MfiMessageStore} - * にこの {@link MachineDependentMessage} のインスタンスをストアして採番された id を - * 2 bytes big endian で格納する。 + * Create {@link MetaMessage} of Meta type 0x7f as a MIDI message + * corresponding to this instance of {@link MachineDependentMessage}. + * Store this {@link MachineDependentMessage} instance in {@link MfiMessageStore} + * as the actual data of {@link MetaMessage} + * and store the numbered ID in 2 bytes big endian. *

    *

    - * 再生の場合は {@link javax.sound.midi.MetaEventListener} で Meta type 0x7f を - * リッスンして対応する id のメッセージを {@link MfiMessageStore} から見つける。 - * それを {@link vavi.sound.mfi.vavi.sequencer.MachineDependentSequencer} にかけて再生処理を - * 行う。 + * For playback, listen to Meta type 0x7f with {@link javax.sound.midi.MetaEventListener} + * and find the message with the corresponding id from {@link MfiMessageStore}. + * Playback is performed by applying it to {@link vavi.sound.mfi.vavi.sequencer.MachineDependentSequencer}. *

    *

    * see also {@code vavi.sound.mfi.vavi.MetaEventAdapter} for playing functionality. @@ -147,22 +146,22 @@ public String toString() { * +--+--+--+--+--+--+--+--+--+--+--+- * |ff|7f|LL|ID|DD DD ... * +--+--+--+--+--+--+--+--+--+--+--+- - * 0x7f シーケンサー固有メタイベント - * LL ホンマに 1 byte ? - * ID メーカーID + * 0x7f sequencer specific meta event + * LL is really 1 byte? + * ID manufacturer ID *

    *
    -     * 現状
    +     * Current Spec.
          * +--+--+--+--+--+--+--+
          * |ff|7f|LL|5f|01|DH DL|
          * +--+--+--+--+--+--+--+
    -     *  0x5f 勝手につけたメーカ ID
    -     *  0x01 {@link MachineDependentMessage} データであることを表す
    -     *  DH DL 採番された id
    +     *  0x5f manufacturer ID added arbitrarily
    +     *  0x01 indicates {@link MachineDependentMessage} data
    +     *  DH DL numbered id
          * 
    *

    - * デフォルトの MIDI シーケンサを使用するため、メタイベントしかフックできないので - * メタイベントに変換している。 + * Since the default MIDI sequencer is used, only meta-events can be hooked, + * so they are converted to meta-events. *

    * @see vavi.sound.midi.VaviMidiDeviceProvider#MANUFACTURER_ID * @see MachineDependentSequencer#META_FUNCTION_ID_MACHINE_DEPEND @@ -180,7 +179,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -189,5 +188,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/MasterVolumeMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/MasterVolumeMessage.java index c239afb..989ed42 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/MasterVolumeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/MasterVolumeMessage.java @@ -80,5 +80,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/MfiConvertibleMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/MfiConvertibleMessage.java index f700f09..6828ce2 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/MfiConvertibleMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/MfiConvertibleMessage.java @@ -66,10 +66,10 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) // MfiMessage mfiMessage = null; switch (data1) { - case 0: // バンクセレクト MSB + case 0: // bank select MSB bankMSB[channel] = data2; break; - case 32: // バンクセレクト LSB + case 32: // bank select LSB bankLSB[channel] = data2; break; case 98: // NRPN LSB @@ -84,7 +84,7 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) case 101: // RPN MSB rpnMSB[channel] = data2; break; -// case 6: // データエントリー MSB +// case 6: // data entry MSB // int rpn = rpnLSB[channel] & | (rpnMSB[channel] << 8); // switch (rpn) { // case RPN_PITCH_BEND_SENSITIVITY: @@ -103,5 +103,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/ModulationDepthMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/ModulationDepthMessage.java index 77c16ea..3f79dc6 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/ModulationDepthMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/ModulationDepthMessage.java @@ -22,7 +22,7 @@ /** * ModulationDepthMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -108,13 +108,13 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, channel, - 1, // モジュレーション・デプス MSB + 1, // modulation depth MSB getModulationDepth() * 2); events[0] = new MidiEvent(shortMessage, context.getCurrent()); // shortMessage = new ShortMessage(); // shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, // channel, -// 33, // モジュレーション・デプス LSB +// 33, // modulation depth LSB // 0); // events[1] = new MidiEvent(shortMessage, context.getCurrent()); return events; @@ -143,5 +143,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/Nop2Message.java b/src/main/java/vavi/sound/mfi/vavi/track/Nop2Message.java index 86d5e16..c9e2f97 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/Nop2Message.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/Nop2Message.java @@ -18,7 +18,7 @@ /** * Nop2Message. *
    - *  0xff, 0xd# 演奏管理情報
    + *  0xff, 0xd# Play Control Information
      *  channel false
      *  delta   true
      * 
    @@ -71,5 +71,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/NopMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/NopMessage.java index 86d8413..50345b0 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/NopMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/NopMessage.java @@ -16,7 +16,7 @@ /** * NopMessage. *
    - *  0xff, 0xd# 演奏管理情報
    + *  0xff, 0xd# Play Control Information
      *  channel false
      *  delta   true
      * 
    @@ -64,5 +64,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/PanpotMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/PanpotMessage.java index de77ce3..2565ff7 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/PanpotMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/PanpotMessage.java @@ -22,7 +22,7 @@ /** * PanpotMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -109,13 +109,13 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, channel, - 10, // パンポット MSB + 10, // pan pot MSB getPanpot() * 2); events[0] = new MidiEvent(shortMessage, context.getCurrent()); // shortMessage = new ShortMessage(); // shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, // channel, -// 42, // パンポット LSB +// 42, // pan pot LSB // 0); // events[1] = new MidiEvent(shortMessage, context.getCurrent()); return events; @@ -144,5 +144,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/PitchBendMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/PitchBendMessage.java index afeadf7..dc79ef7 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/PitchBendMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/PitchBendMessage.java @@ -22,7 +22,7 @@ /** * PitchBendMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -95,7 +95,7 @@ public String toString() { // ---- /** - * PsmPlayer がこう変換していたからしょうがない。 + * because PsmPlayer converted it like this. */ @Override public MidiEvent[] getMidiEvents(MidiContext context) @@ -110,7 +110,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.PITCH_BEND, channel, - 0, // LSB + 0, // LSB getPitchBend() * 2); // MSB return new MidiEvent[] { new MidiEvent(shortMessage, context.getCurrent()) @@ -140,5 +140,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/PitchBendRangeMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/PitchBendRangeMessage.java index c731195..cd5de67 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/PitchBendRangeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/PitchBendRangeMessage.java @@ -22,7 +22,7 @@ /** * PitchBendRangeMessage. *
    - *  0xff, 0xe# 音源制御情報
    + *  0xff, 0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -154,5 +154,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/TempoMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/TempoMessage.java index d17cf07..33601dd 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/TempoMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/TempoMessage.java @@ -25,7 +25,7 @@ /** - * テンポメッセージを表すクラスです. + * Represents tempo message. *
      *  0xff, 0xc#
      * 
    @@ -38,12 +38,12 @@ public class TempoMessage extends ShortMessage implements MidiConvertible, MfiConvertible { - /** 4 分音符の分解能 @see #timeBaseTable */ + /** quarter note resolution @see #timeBaseTable */ private int timeBase; - /** 1 分間の 4 分音符の数 20 ~ 125 ~ 255 */ + /** quarter note count per minute 20 ~ 125 ~ 255 */ private int tempo; - /** 4 分音符の分解能 @index 0xc0 ~ 0xcf */ + /** quarter note resolutions @index 0xc0 ~ 0xcf */ private static final int[] timeBaseTable = { 6, 12, 24, 48, 96, 192, 384, -1, 15, 30, 60, 120, 240, 480, 960, -1 @@ -80,7 +80,7 @@ public int getTimeBase() { /** */ public void setTimeBase(int timeBase) { this.timeBase = timeBase; - // TODO -1 が通るぞ + // TODO accepts -1 for (int i = 0; i < timeBaseTable.length; i++) { if (timeBase == timeBaseTable[i]) { if (timeBase < 0) { @@ -119,7 +119,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) int tempo = getTempo(); int timeBase = getTimeBase(); - // 四分音符の長さをμsecで指定 TODO round でいいのか?, TODO 48??? (ホンマは 60 * 10^6 / tempo) + // quarter note length in μsec TODO is round OK?, TODO 48??? (actually 60 * 10^6 / tempo) int l = (int) Math.round(60d * 1000000d / ((48d / timeBase) * tempo)); //Debug.println(this); //Debug.println(l + " = " + @@ -153,7 +153,7 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) (data[2] & 0xff); //Debug.println("(CALC) timeBase: " + timeBase + ", tempo: " + tempo + ", l; " + l); - // TODO 一回スケール変更したら変えない? + // TODO no more change if scale is changed once? if (context.isScaleChanged()) { timeBase = getNearestTimeBase((int) (context.getTimeBase() / context.getScale())); tempo = (int) Math.round(60d * 1000000d / ((48d / timeBase) * l)); @@ -210,5 +210,3 @@ public static int getNearestTimeBase(int timeBase) { return timeBaseTable[table.get(0).index]; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/UndefinedMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/UndefinedMessage.java index 212a334..8c5134d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/UndefinedMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/UndefinedMessage.java @@ -65,5 +65,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/VoiceEditMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/VoiceEditMessage.java index f030922..6475c1d 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/VoiceEditMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/VoiceEditMessage.java @@ -33,7 +33,7 @@ protected VoiceEditMessage(byte[] message) { /** * for {@link vavi.sound.mfi.vavi.TrackMessage} - * @param is 実際のデータ (ヘッダ無し) + * @param is actual data (without header) */ public static VoiceEditMessage readFrom(int delta, int status, int data1, InputStream is) throws InvalidMfiDataException, @@ -47,5 +47,3 @@ public String toString() { return "VoiceEdit:"; } } - -/* */ diff --git a/src/main/java/vavi/sound/mfi/vavi/track/VolumeMessage.java b/src/main/java/vavi/sound/mfi/vavi/track/VolumeMessage.java index ba39dd5..afdbf1f 100644 --- a/src/main/java/vavi/sound/mfi/vavi/track/VolumeMessage.java +++ b/src/main/java/vavi/sound/mfi/vavi/track/VolumeMessage.java @@ -22,7 +22,7 @@ /** * VolumeMessage. *
    - *  0xe# 音源制御情報
    + *  0xe# Sound Source Control Information
      *  channel true
      *  delta   true
      * 
    @@ -109,13 +109,13 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, channel, - 7, // メインボリューム MSB + 7, // main volume MSB context.getVolume(channel) * 2); events[0] = new MidiEvent(shortMessage, context.getCurrent()); // shortMessage = new ShortMessage(); // shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, // channel, -// 39, // メインボリューム LSB +// 39, // main volume LSB // 0); // events[1] = new MidiEvent(shortMessage, context.getCurrent()); return events; @@ -145,5 +145,3 @@ public MfiEvent[] getMfiEvents(MidiEvent midiEvent, MfiContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/BasicMidiFileReader.java b/src/main/java/vavi/sound/midi/BasicMidiFileReader.java index 426cbc3..c0f333b 100644 --- a/src/main/java/vavi/sound/midi/BasicMidiFileReader.java +++ b/src/main/java/vavi/sound/midi/BasicMidiFileReader.java @@ -91,5 +91,3 @@ public Sequence getSequence(URL url) return getSequence(is); } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/BasicMidiFileWriter.java b/src/main/java/vavi/sound/midi/BasicMidiFileWriter.java index eda9c1d..b4d1bfa 100644 --- a/src/main/java/vavi/sound/midi/BasicMidiFileWriter.java +++ b/src/main/java/vavi/sound/midi/BasicMidiFileWriter.java @@ -31,5 +31,3 @@ public final int write(Sequence in, int fileType, File out) return write(in, fileType, Files.newOutputStream(out.toPath())); } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/MidiConstants.java b/src/main/java/vavi/sound/midi/MidiConstants.java index 4114bdf..33c8127 100644 --- a/src/main/java/vavi/sound/midi/MidiConstants.java +++ b/src/main/java/vavi/sound/midi/MidiConstants.java @@ -29,242 +29,219 @@ private MidiConstants() { /** instrument names */ private static Properties props = new Properties(); - /** */ + /** */ public static String getInstrumentName(int index) { return props.getProperty("midi.inst.gm." + index); } //------------------------------------------------------------------------- - // メタ・イベント + // Meta Event // - // ここでは、いくつかのメタ・イベントについて定義がなされる。すべてのプロ - // グラムがすべてのメタ・イベントをサポートしなければならないということで - // はない。最初に定義されたメタ・イベントには以下のものがある。 + // Here, some meta-events are defined. + // Not all programs have to support all meta events. + // The first meta-events defined are public enum MetaEvent { /** *
    -         * FF 00 02 ssss  [シーケンス・ナンバー]
    +         * FF 00 02 ssss  [sequence number]
              * 
    - * このオプション・イベントは、トラックの冒頭、任意の 0 でないデルタ・タイ - * ムの前で、かつ任意の転送可能な MIDI イベントの前に置かれなければならず - * 、これがシーケンスのナンバーを特定する。このトラック中のナンバーは - * 1987 年夏の MMA ミーティングで協議された新 Cue メッセージの中のシーケンス - * ・ナンバーに対応する。これは、フォーマット 2 の MIDI ファイルにおいては - * 、各々の「パターン」を識別することによって、Cue メッセージを用いている - * 「ソング」シーケンスがパターンを参照できるようにするために用いられる。 - * ID ナンバーが省略されているときは、そのシーケンスのファイル中での位置 - * [訳注:先頭から何番目のシーケンスか]がデフォールトとして用いられる。 - * フォーマット 0 または 1 の MIDI ファイルにおいては、1つのシーケンスしか - * 含まれないため、このナンバーは第 1 の(つまり唯一の)トラックに含まれ - * ることになる。いくつかのマルチトラック・シーケンスの転送が必要な場合は - * 、各々が異なるシーケンス・ナンバーを持つフォーマット1のファイルのグル - * ープとして行われなければならない。 + * This optional event must be placed at the beginning of the track, before any non-zero delta time, + * and before any transportable MIDI event, which specifies the number of the sequence. + * The numbers in this track correspond to the sequence numbers in the new Cue messages discussed + * at the Summer 1987 MMA meeting. This is used in Format 2 MIDI files to identify each "pattern" + * so that "song" sequences using cue messages can reference the patterns. + * If the ID number is omitted, the sequence's position in the file is used as the default. + * In a format 0 or 1 MIDI file, there is only one sequence, so this number will be on the first + * (and thus only) track. If the transfer of several multi-track sequences is required, + * it must be done as a group of format 1 files, each with a different sequence number. */ META_SEQUENCE_NO(0x00), /** *
    -         * FF 01 len text  [テキスト・イベント]
    +         * FF 01 len text  [text event]
              * 
    - * 任意の大きさおよび内容のテキスト。トラックのいちばん初めに、トラック名 - * 、意図するオーケストレイション、その他ユーザがそこに置きたいと思う情報 - * を書いておくと良い。テキスト・イベントは、トラック中でその他の時に入れ - * て歌詞やキュー・ポイントの記述として用いることもできる。このイベント中 - * のテキストは、最大限の互換性を確保するために、印刷可能なアスキー・キャ - * ラクタでなければならない。しかし、高位ビットを用いる他のキャラクタ・コ - * ード(訳注:漢字コードのような 2 バイト・コードなど)も、拡張されたキャ - * ラクタ・セットをサポートする同じコンピュータ上の異なるプログラム間でフ - * ァイルを交換するために用いることができる。非アスキー・キャラクタをサポ - * ートしない機種上のプログラムは、このようなコードを無視しなければならな - * い。 - * - * (0.06 での追加事項) メタ・イベントのタイプ 01 から 0F までは様々なタ - * イプのテキスト・イベントのために予約されている。この各々は上記のテキス - * ト・イベントの特性と重複しているが、以下のように、異なる目的のために用 - * いられる。 + * Text of any size and content. It's a good idea to write the track name, intended orchestration, + * and any other information you want there at the beginning of the track. Text events can also be + * included at other times in a track to describe lyrics or cue points. The text in this event + * must be printable ASCII characters to ensure maximum compatibility. However, other character codes + * that use high-order bits can also be used to exchange files between different programs on the same computer + * that support extended character sets. Can be used. Programs on machines that do not support non-ASCII + * characters must ignore such codes. + *

    + * (Added in 0.06) Meta event types 01 through 0F are reserved for various types of text events. + * Each of these overlaps with the text event characteristics described above, but is used for + * different purposes, as follows: */ META_TEXT_EVENT(0x01), /** *

    -         * FF 02 len text  [著作権表示]
    +         * FF 02 len text  [show copyright]
              * 
    - * 著作権表示を、印刷可能なアスキー・テキストとして持つ。この表示には(C) - * の文字と、著作物発行年と、著作権所有者名とが含まれなければならない。ひ - * とつの MIDI ファイルに幾つかの楽曲がある時には、すべての著作権表示をこ - * のイベントに置いて、それがファイルの先頭に来るようにしなければならない - * 。このイベントは第1トラック・ブロックの最初のイベントとして、デルタ・ - * タイム = 0 で置かれなければならない。 + * Contains the copyright notice as printable ASCII text. This notice must include the letter (C), + * the year of publication of the work, and the name of the copyright owner. When you have several + * pieces of music in one MIDI file, you must place all copyright notices in this event so that + * they appear at the beginning of the file. This event must be placed as the first event in the + * first track block with delta time = 0. */ META_COPYRIGHT(0x02), /** *
    -         * FF 03 len text  [シーケンス名またはトラック名]
    +         * FF 03 len text  [sequence name or track name]
              * 
    - * フォーマット 0 のトラック、もしくはフォーマット 1 のファイルの第 1 トラッ - * クにおいては、シーケンスの名称。その他の場合は、トラックの名称。 + * For format 0 tracks or the first track of a format 1 file, the name of the sequence. + * Otherwise, the name of the track. */ META_NAME(0x03), /** *
    -         * FF 04 len text  [楽器名]
    +         * FF 04 len text  [instrument name]
              * 
    - * そのトラックで用いられるべき楽器編成の種類を記述する。 MIDI の冒頭に置 - * かれるメタ・イベントとともに用いて、どの MIDI チャネルにその記述が適用 - * されるかを特定することもある。あるいは、チャネルをこのイベント中のテキ - * ストで特定しても良い。 + * Describes the type of instrumentation that should be used on the track. It may also be used in + * conjunction with a meta-event placed at the beginning of a MIDI statement to specify which + * MIDI channel the description applies to. Alternatively, the channel may be identified by text in this event. */ META_INSTRUMENT(0x04), /** *
    -         * FF 05 len text  [歌詞]
    +         * FF 05 len text  [lyrics]
              * 
    - * 歌詞。一般的には、各音節がそのイベントのタイムから始まる独立した歌詞イ - * ベントとなる。 + * lyrics. Generally, each syllable is an independent lyric event starting at the time of that event. */ META_LYRICS(0x05), /** *
    -         * FF 06 len text  [マーカー]
    +         * FF 06 len text  [marker]
              * 
    - * 通常フォーマット 0 のトラック、もしくはフォーマット 1 のファイルの第1ト - * ラックにある。リハーサル記号やセクション名のような、シーケンスのその時 - * 点の名称。(「First Verse」等) + * Usually located on a format 0 track or the first track of a format 1 file. The name of the current point + * in the sequence, such as a rehearsal mark or section name. (“First Verse” etc.) */ META_MARKER(0x06), /** *
    -         * FF 07 len text  [キュー・ポイント]
    +         * FF 07 len text  [queue point]
              * 
    - * スコアのその位置において、フィルム、ヴィデオ・スクリーン、あるいはステ - * ージ上で起こっていることの記述。(「車が家に突っ込む」「幕が開く」「女 - * は男に平手打ちを食わせる」等) + * A description of what is happening on film, on a video screen, or on stage at that point in the score. + * (“A car crashes into a house,” “The curtain opens,” “A woman makes a man slap her,” etc.) */ META_QUE_POINT(0x07), /** *
    -         * FF 2F 00  [トラックの終わり]
    +         * FF 2F 00  [end of track]
              * 
    - * このイベントは省略することができない。これがあることによってトラックの - * 正しい終結点が明確になり、トラックが正確な長さを持つようになる。これは - * トラックがループになっていたり連結されていたりする時に必要である。 + * This event cannot be omitted. This ensures that the correct end of the track is clear and the track + * has the correct length. This is necessary when tracks are looped or concatenated. */ META_END_OF_TRACK(0x2f), // 47 /** *
    -         * FF 51 03 tttttt  [テンポ設定(単位は μsec / MIDI 四分音符)]
    +         * FF 51 03 tttttt  [tempo (unit is μsec / MIDI quoter note)]
              * 
    - * このイベントはテンポ・チェンジを指示する。「μsec / MIDI 四分音符」は - * 言い換えれば「(μsec / MIDI クロック)の 24 分の 1」である。テンポを - * 「拍 / 時間」ではなく「時間 / 拍」によって与えることで、 SMPTE タイム・ - * コードや MIDI タイム・コードのような実時間ベースの同期プロトコルを用い - * て、絶対的に正確な長時間同期を得ることができる。このテンポ設定で得られ - * る正確さは、120 拍 / 分で 4 分の曲を終わった時に誤差が 500 μsec 以内 - * にとどまる、というものである。理想的には、これらのイベントは Cue の - * 上で MIDI クロックがある位置にのみ、おかれるべきである。このことは、ほか - * の同期デバイスとの互換性を保証しよう、少なくとも、その見込みを増やそう - * 、というもので、この結果、この形式で保存された拍子記号やテンポ・マップ - * は容易にほかのデバイスへ転送できることになる。 + * This event indicates a tempo change. In other words, "μsec / MIDI quarter note" is "1/24 of + * (μsec / MIDI clock)". By giving tempo in terms of time/beats rather than beats/time, + * you can achieve absolutely accurate long-term synchronization using real-time based synchronization + * protocols such as SMPTE time code or MIDI time code. Obtainable. The accuracy achieved with this tempo + * setting is such that at 120 beats per minute he can complete a 4 minute song with an error of less + * than 500 microseconds. Ideally, these events should only be placed on cues where there is a MIDI clock. + * This is intended to ensure, or at least increase the likelihood of, compatibility with other synchronizing + * devices, so that time signatures and tempo maps saved in this format can easily be transferred to other + * devices. It will be possible to transfer. */ META_TEMPO(0x51), // 81 /** *
    -         * FF 54 05 hr mn se fr ff  [SMPTE オフセット(0.06 での追加 - SMPTE フォーマットの記述)]
    +         * FF 54 05 hr mn se fr ff  [SMPTE offset (added 0.06 - SMPTE format description)]
              * 
    - * このイベントは、もしあれば、トラック・ブロックがスタートすることになっ - * ている SMPTE タイムを示す。これは、トラックの冒頭に置かれなければなら - * ない。すなわち、任意の 0 でないデルタ・タイムの前で、かつ任意の転送可能 - * な MIDI イベントの前である。時間は、 MIDI タイム・コードと全く同様に - * SMPTE フォーマットでエンコードされなければならない。フォーマット 1 のフ - * ァイルにおいては、 SMPTE オフセットはテンポ・マップとともにストアされ - * る必要があり、他のトラックにあっては意味をなさない。デルタ・タイムのた - * めに異なるフレーム分解能を指定している SMPTE ベースのトラックにおいて - * も、ff のフィールドは細分化されたフレーム(100 分の 1 フレーム単位)を - * 持っている。 + * This event indicates the SMPTE time, if any, that the track block is to start. This must be placed at + * the beginning of the track. That is, before any non-zero delta time and before any transportable MIDI + * event. Time must be encoded in SMPTE format, just like MIDI time code. In format 1 files, SMPTE offsets + * must be stored with the tempo map and have no meaning on other tracks. Even in SMPTE-based tracks that + * specify different frame resolutions for delta time, the ff field has subdivided frames + * (in hundredths of a frame). */ META_SMPTE_OFFSERT(0x54), // 84 /** *
    -         * FF 58 04 nn dd cc bb  [拍子記号]
    +         * FF 58 04 nn dd cc bb  [time signature]
              * 
    - * 拍子記号は、4 つの数字で表現される。nn と dd は、記譜する時のように、拍子 - * 記号の分子と分母を表す。分母は 2 のマイナス乗である。すなわち、2 は四分 - * 音符を表し、3 は八分音符を表す、等々。パラメータ cc は、1 メトロノーム・ - * クリックあたりの MIDI クロック数を表現している。パラメータ bb は、 MIDI - * 四分音符(24 MIDI クロック)の中に記譜上の三十二分音符がいくつ入るかを - * 表現している。このパラメータは、 MIDI 上の四分音符(24 クロック)を他 - * のものとして記譜し、あるいは表現上他の音符に対応させるようユーザ定義で - * きるプログラムが既に数多く存在することから加えられた。 - * - * 従って、6 / 8 拍子で、メトロノームは八分音符 3 つ毎に刻むけれども四分音 - * 符 24 クロックで、1 小節あたりでは 72 クロックになる拍子は、16 進で次 - * のようになる。 - * - * FF 58 04 06 03 24 08 - * - * これは、8 分の 6 拍子で(8 は 2 の 3 乗なので、06 03となる)、付点四分音 - * 符あたり 36 MIDI クロック(16進で24!)[*2]で、 MIDI 四分音符に記 - * 譜上の三十二分音符が 8 つ対応するということを示している。 + * A time signature is represented by four numbers. nn and dd represent the numerator and denominator of the + * time signature, as in notation. The denominator is 2 to the negative power. That is, 2 represents a quarter + * note, 3 represents an eighth note, and so on. The parameter cc represents the number of MIDI clocks per + * metronome click. The parameter bb represents how many notated thirty-second notes fit into a MIDI quarter + * note (24 MIDI clocks). This parameter was added because there are already a number of programs that allow + * the user to define MIDI quarter notes (24 clocks) to be notated as something else, or to correspond + * expressively to other notes. + *

    + * Therefore, in 6/8 time, the metronome ticks every third eighth note, but with 24 quarter note clocks and + * 72 clocks per measure, the time signature in hexadecimal is as follows: + *

    + * FF 58 04 06 03 24 08 + *

    + * This is a 6/8 time signature (8 is 2 to the power of 3, so 06 03), 36 MIDI clocks per dotted quarter note + * (24 in hex!) [*2], and a MIDI quarter note. This shows that there are eight thirty-second notes in musical + * notation. */ META_58(0x58), // 88 /** *

    -         * FF 59 02 sf mi  [調号]
    -         *   sf = -7  フラット7つ
    -         *   sf = -1  フラット1つ
    -         *   sf = 0   ハ調
    -         *   sf = 1   シャープ1つ
    -         *   sf = 7   シャープ7つ
    +         * FF 59 02 sf mi  [key signature]
    +         *   sf = -7  7 flats
    +         *   sf = -1  1 flat
    +         *   sf = 0   C key
    +         *   sf = 1   1 sharp
    +         *   sf = 7   7 sharps
              *
    -         *   mi = 0   長調
    -         *   mi = 1   短調
    +         *   mi = 0   major key
    +         *   mi = 1   minor key
              * 
    */ META_59(0x59), // 89 /** *
    -         * FF 7F len data  [シーケンサー特定メタ・イベント]
    +         * FF 7F len data  [sequencer specific meta events]
              * 
    - * 特定のシーケンサーのための特別な要求にこのイベント・タイプを用いること - * ができる。データ・バイトの最初の1バイトはメーカーIDである。しかしな - * がら、これは交換用フォーマットなのであるから、このイベント・タイプの使 - * 用よりもスペック本体の拡張の方が望ましい。このタイプのイベントは、これ - * を唯一のファイル・フォーマットとして用いることを選択したシーケンサーに - * よって使用されるかもしれない。仕様詳細のフォーマットが確定したシーケン - * サーにおいては、このフォーマットを用いるにあたって標準仕様を守るべきで - * あろう。 + * This event type can be used for special needs for a particular sequencer. The first data byte is the + * manufacturer ID. However, since this is an interchange format, extending the spec body is preferable + * to using this event type. This type of event may be used by sequencers that choose to use this as their + * only file format. For sequencers that have a fixed specification format, the standard specifications + * should be followed when using this format. */ META_MACHINE_DEPEND(0x7f), // 127 META_UNDEFINED(-1); int number; + public int number() { return number; } + MetaEvent(int number) { this.number = number; } + public static MetaEvent valueOf(int number) { try { return Arrays.stream(values()).filter(e -> e.number == number).findFirst().get(); } catch (NoSuchElementException e) { META_UNDEFINED.number = number; // TODO evil and not thread safe. -Debug.println(Level.WARNING, "undefined meta: " + number); + Debug.println(Level.WARNING, "undefined meta: " + number); return META_UNDEFINED; } } + @Override public String toString() { if (ordinal() == META_UNDEFINED.ordinal()) { @@ -275,53 +252,52 @@ public String toString() { } } - //------------------------------------------------------------------------- + //---- /** - * 01H〜1FH - * 00H 00H 01H〜00H 1FH 7FH + * 01H ~ 1FH + * 00H 00H 01H ~ 00H 1FH 7FH */ public static final int SYSEX_MAKER_ID_American = 0x01; /** - * 20H〜3FH - * 00H 20H 00H〜00H 3FH 7FH + * 20H ~ 3FH + * 00H 20H 00H ~ 00H 3FH 7FH */ public static final int SYSEX_MAKER_ID_European = 0x20; /** - * 40H〜5FH - * 00H 40H 00H〜00H 5FH 7FH + * 40H ~ 5FH + * 00H 40H 00H ~ 00H 5FH 7FH */ public static final int SYSEX_MAKER_ID_Japanese = 0x40; /** - * 60H〜7CH - * 00H 60H 00H〜00H 7FH 7FH + * 60H ~ 7CH + * 00H 60H 00H ~ 00H 7FH 7FH */ public static final int SYSEX_MAKER_ID_Other = 0x60; /** - * 7DH〜7FH + * 7DH ~ 7FH */ public static final int SYSEX_MAKER_ID_Special = 0x70; // 7DH - // メーカー ID の 7DH は、学校教育機関などでの研究用に使用される ID で、 - // 非営利目的でのみ使用できます。 + // Manufacturer ID 7DH is an ID used for research in schools and educational institutions, + // and can only be used for non-commercial purposes. // // 7EH - // 7EH はノンリアルタイムユニバーサルシステムエクスクルーシブです。 - // エクスクルーシブのうち、メーカーや機種を超えてやり取りできると - // 便利なデータ転送に使用されます。なお、7EHは実時間に関係のないデータ転送に使用されます。 + // 7EH is a non-real-time universal system exclusive. Exclusive is used for data transfer, + // which is convenient if it can be exchanged across manufacturers and models. + // Note that 7EH is used for data transfers that are not related to real time. // // 7FH - // 7FH はリアルタイムユニバーサルシステムエクスクルーシブです。 - // 7EH のノンリアルタイムユニバーサルシステムエクスクルーシブと同様に、 - // メーカーや機種を超えてデータをやり取りするときに使用され、 - // 7FHでは実時間に関係のあるデータ転送に利用されます。 + // 7FH is a real-time universal system exclusive. Similar to 7EH's non-real-time universal system exclusive, + // it is used when exchanging data across manufacturers and models, and in 7FH it is used for data transfer + // related to real time. - //------------------------------------------------------------------------- + //---- /* */ static { @@ -329,10 +305,8 @@ public String toString() { final Class clazz = MidiConstants.class; props.load(clazz.getResourceAsStream("midi.properties")); } catch (IOException e) { -Debug.println(e); + Debug.println(e); throw new IllegalStateException(e); } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/MidiUtil.java b/src/main/java/vavi/sound/midi/MidiUtil.java index fc85772..1e8131b 100644 --- a/src/main/java/vavi/sound/midi/MidiUtil.java +++ b/src/main/java/vavi/sound/midi/MidiUtil.java @@ -162,12 +162,12 @@ public static void writeVarInt(DataOutput output, int value) throws IOException /** */ private static String decodingEncoding = "JISAutoDetect"; - /** MIDI データで先頭が 0xff の場合対応 (エンコードされている) */ + /** compatible with MIDI data starting with 0xff (encoded) */ public static String getDecodedMessage(byte[] data) { return getDecodedMessage(data, decodingEncoding); } - /** MIDI データで先頭が 0xff の場合対応 (エンコードされている) */ + /** compatible with MIDI data starting with 0xff (encoded) */ public static String getDecodedMessage(byte[] data, String encoding) { int start = 0; int length = data.length; @@ -325,7 +325,7 @@ public static Synthesizer getDefaultSynthesizer(Class self) { @@ -379,5 +379,3 @@ public static Sequencer getDefaultSequencer(Class } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/VaviMidiDeviceProvider.java b/src/main/java/vavi/sound/midi/VaviMidiDeviceProvider.java index 983b1ad..dec8a19 100644 --- a/src/main/java/vavi/sound/midi/VaviMidiDeviceProvider.java +++ b/src/main/java/vavi/sound/midi/VaviMidiDeviceProvider.java @@ -38,7 +38,7 @@ public MidiDevice.Info[] getDeviceInfo() { } /** - * ADPCM 再生機構を付加した MIDI シーケンサを返します。 + * Returns a MIDI sequencer with an ADPCM playback mechanism. * @throws IllegalArgumentException info is not suitable for this provider */ @Override @@ -55,5 +55,3 @@ public MidiDevice getDevice(MidiDevice.Info info) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/VaviSequence.java b/src/main/java/vavi/sound/midi/VaviSequence.java index 5071c7c..105a809 100644 --- a/src/main/java/vavi/sound/midi/VaviSequence.java +++ b/src/main/java/vavi/sound/midi/VaviSequence.java @@ -20,5 +20,3 @@ public interface VaviSequence { /** */ MetaEventListener getMetaEventListener(); } - -/* */ diff --git a/src/main/java/vavi/sound/midi/VaviSequencer.java b/src/main/java/vavi/sound/midi/VaviSequencer.java index 80f2ca1..1df211e 100644 --- a/src/main/java/vavi/sound/midi/VaviSequencer.java +++ b/src/main/java/vavi/sound/midi/VaviSequencer.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; +import java.util.Properties; import java.util.logging.Level; import javax.sound.midi.ControllerEventListener; @@ -33,7 +34,23 @@ */ class VaviSequencer implements Sequencer { - private static final String version = "1.0.10"; + static { + try { + try (InputStream is = VaviSequencer.class.getResourceAsStream("/META-INF/maven/vavi/vavi-sound/pom.properties")) { + if (is != null) { + Properties props = new Properties(); + props.load(is); + version = props.getProperty("version", "undefined in pom.properties"); + } else { + version = System.getProperty("vavi.test.version", "undefined"); + } + } + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private static final String version; /** the device information */ protected static final MidiDevice.Info info = @@ -343,5 +360,3 @@ public String toString() { return "VaviSequencer: wrapped: " + sequencer.getClass().getName(); } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/mfi/MfiMidiFileReader.java b/src/main/java/vavi/sound/midi/mfi/MfiMidiFileReader.java index 6d3fdcb..20a9255 100644 --- a/src/main/java/vavi/sound/midi/mfi/MfiMidiFileReader.java +++ b/src/main/java/vavi/sound/midi/mfi/MfiMidiFileReader.java @@ -77,5 +77,3 @@ public Sequence getSequence(InputStream is) } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/mfi/MfiMidiFileWriter.java b/src/main/java/vavi/sound/midi/mfi/MfiMidiFileWriter.java index b925f64..7125e5c 100644 --- a/src/main/java/vavi/sound/midi/mfi/MfiMidiFileWriter.java +++ b/src/main/java/vavi/sound/midi/mfi/MfiMidiFileWriter.java @@ -23,7 +23,7 @@ /** * MfiMidiFileWriter implemented by vavi. * - * @caution MidiSystem は使っちゃだめ! + * @caution don't use MidiSystem in this class! * * @author Naohide Sano (nsano) * @version 0.00 030817 nsano initial version
    @@ -43,7 +43,7 @@ public int[] getMidiFileTypes(Sequence sequence) { return MfiSystem.getMfiFileTypes(); } - /** @param fileType 0x88:MFi (vavi) をサポートします */ + /** @param fileType supports 0x88:MFi (vavi) */ @Override public boolean isFileTypeSupported(int fileType) { Debug.println(Level.FINE, "(1): fileType: " + fileType); @@ -51,8 +51,8 @@ public boolean isFileTypeSupported(int fileType) { } /** - * @param fileType 0x88:MFi (vavi) をサポートします - * TODO sequence を無視している + * @param fileType supports 0x88:MFi (vavi) + * TODO ignoring sequence */ @Override public boolean isFileTypeSupported(int fileType, Sequence sequence) { @@ -63,8 +63,8 @@ public boolean isFileTypeSupported(int fileType, Sequence sequence) { /** * @param in MIDI Sequence - * @param fileType {@link #isFileTypeSupported(int)}, - * {@link #isFileTypeSupported(int, Sequence)} が true のもののみ + * @param fileType only {@link #isFileTypeSupported(int)}, + * {@link #isFileTypeSupported(int, Sequence)} are true */ @Override public int write(Sequence in, int fileType, OutputStream out) @@ -85,5 +85,3 @@ public int write(Sequence in, int fileType, OutputStream out) } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/mfi/MfiVaviSequence.java b/src/main/java/vavi/sound/midi/mfi/MfiVaviSequence.java index af51a63..1f23df5 100644 --- a/src/main/java/vavi/sound/midi/mfi/MfiVaviSequence.java +++ b/src/main/java/vavi/sound/midi/mfi/MfiVaviSequence.java @@ -42,5 +42,3 @@ public MetaEventListener getMetaEventListener() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/smaf/SmafMidiFileReader.java b/src/main/java/vavi/sound/midi/smaf/SmafMidiFileReader.java index d14d163..77f7383 100644 --- a/src/main/java/vavi/sound/midi/smaf/SmafMidiFileReader.java +++ b/src/main/java/vavi/sound/midi/smaf/SmafMidiFileReader.java @@ -76,5 +76,3 @@ public Sequence getSequence(InputStream is) } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/smaf/SmafMidiFileWriter.java b/src/main/java/vavi/sound/midi/smaf/SmafMidiFileWriter.java index 8beddf0..076e392 100644 --- a/src/main/java/vavi/sound/midi/smaf/SmafMidiFileWriter.java +++ b/src/main/java/vavi/sound/midi/smaf/SmafMidiFileWriter.java @@ -23,7 +23,7 @@ /** * SmafMidiFileWriter. * - * @caution MidiSystem は使っちゃだめ! + * @caution don't use MidiSystem in this class! * * @author Naohide Sano (nsano) * @version 0.00 041222 nsano initial version
    @@ -41,15 +41,15 @@ public int[] getMidiFileTypes(Sequence sequence) { return new int[] { SmafFileFormat.FILE_TYPE }; } - /** @param fileType 0x84:SMAF をサポートします */ + /** @param fileType supports 0x84:SMAF */ @Override public boolean isFileTypeSupported(int fileType) { return fileType == SmafFileFormat.FILE_TYPE; } /** - * @param fileType 0x84:SMAF をサポートします - * TODO sequence を無視している + * @param fileType supports 0x84:SMAF + * TODO ignoring sequence */ @Override public boolean isFileTypeSupported(int fileType, Sequence sequence) { @@ -58,7 +58,7 @@ public boolean isFileTypeSupported(int fileType, Sequence sequence) { /** * @param in MIDI Sequence - * @param fileType #isFileTypeSupported が true のもののみ + * @param fileType only #isFileTypeSupported is true */ @Override public int write(Sequence in, int fileType, OutputStream out) @@ -79,5 +79,3 @@ public int write(Sequence in, int fileType, OutputStream out) } } } - -/* */ diff --git a/src/main/java/vavi/sound/midi/smaf/SmafVaviSequence.java b/src/main/java/vavi/sound/midi/smaf/SmafVaviSequence.java index 82c441e..a29ac11 100644 --- a/src/main/java/vavi/sound/midi/smaf/SmafVaviSequence.java +++ b/src/main/java/vavi/sound/midi/smaf/SmafVaviSequence.java @@ -42,5 +42,3 @@ public MetaEventListener getMetaEventListener() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/AudioEngine.java b/src/main/java/vavi/sound/mobile/AudioEngine.java index 0d6296e..1424e80 100644 --- a/src/main/java/vavi/sound/mobile/AudioEngine.java +++ b/src/main/java/vavi/sound/mobile/AudioEngine.java @@ -154,5 +154,3 @@ public static byte[] concatenate(byte[] monoL, byte[] monoR) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/BasicAudioEngine.java b/src/main/java/vavi/sound/mobile/BasicAudioEngine.java index 0e0fc2a..f1eb8af 100644 --- a/src/main/java/vavi/sound/mobile/BasicAudioEngine.java +++ b/src/main/java/vavi/sound/mobile/BasicAudioEngine.java @@ -201,5 +201,3 @@ public byte[] encode(int bits, int channels, byte[] pcm) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/FuetrekAudioEngine.java b/src/main/java/vavi/sound/mobile/FuetrekAudioEngine.java index 9d26520..1d64f62 100644 --- a/src/main/java/vavi/sound/mobile/FuetrekAudioEngine.java +++ b/src/main/java/vavi/sound/mobile/FuetrekAudioEngine.java @@ -107,5 +107,3 @@ protected OutputStream getOutputStream(OutputStream os) { return new G721OutputStream(os, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/PcmAudioEngine.java b/src/main/java/vavi/sound/mobile/PcmAudioEngine.java index 4eb6584..550f102 100644 --- a/src/main/java/vavi/sound/mobile/PcmAudioEngine.java +++ b/src/main/java/vavi/sound/mobile/PcmAudioEngine.java @@ -175,5 +175,3 @@ public void start(int streamNumber) { } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/RohmAudioEngine.java b/src/main/java/vavi/sound/mobile/RohmAudioEngine.java index 2c47390..7d57694 100644 --- a/src/main/java/vavi/sound/mobile/RohmAudioEngine.java +++ b/src/main/java/vavi/sound/mobile/RohmAudioEngine.java @@ -87,5 +87,3 @@ protected OutputStream getOutputStream(OutputStream os) { return new RohmOutputStream(os, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/mobile/YamahaAudioEngine.java b/src/main/java/vavi/sound/mobile/YamahaAudioEngine.java index e0ffcc1..33b3cab 100644 --- a/src/main/java/vavi/sound/mobile/YamahaAudioEngine.java +++ b/src/main/java/vavi/sound/mobile/YamahaAudioEngine.java @@ -92,5 +92,3 @@ protected OutputStream getOutputStream(OutputStream os) { return new MaOutputStream(os, ByteOrder.LITTLE_ENDIAN); } } - -/* */ diff --git a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRC.java b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRC.java index 2732c2c..c8a6a1f 100644 --- a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRC.java +++ b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRC.java @@ -1197,7 +1197,7 @@ int resample(ReadableByteChannel fpi, WritableByteChannel fpo) throws IOExceptio iza = I0Bessel.value(alp); //System.err.printf("iza %f, alp: %f\n", iza, alp); // OK - n2y = fs2 / fs1; // 0でないサンプルがfs2で何サンプルおきにあるか? + n2y = fs2 / fs1; // how many samples are there in fs2 that is not 0? n2x = n2 / n2y + 1; f2order = new int[n2y]; @@ -2595,5 +2595,3 @@ void io(ReadableByteChannel fpi, WritableByteChannel fpo, int length, int nch, i } } } - -/* */ diff --git a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCInputStream.java b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCInputStream.java index 1448da0..81ca167 100644 --- a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCInputStream.java +++ b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCInputStream.java @@ -71,5 +71,3 @@ private static InputStream init(InputStream in, int ch, int iFrq, int iBps, int return Channels.newInputStream(pipe.source()); } } - -/* */ diff --git a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCSampleRateConversionProvider.java b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCSampleRateConversionProvider.java index 002869f..15db268 100755 --- a/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCSampleRateConversionProvider.java +++ b/src/main/java/vavi/sound/pcm/resampling/ssrc/SSRCSampleRateConversionProvider.java @@ -12,7 +12,6 @@ import javax.sound.sampled.spi.FormatConversionProvider; - /** * SSRCSampleRateConversionProvider. * diff --git a/src/main/java/vavi/sound/sampled/FilterChain.java b/src/main/java/vavi/sound/sampled/FilterChain.java index 61135c8..b21cc34 100644 --- a/src/main/java/vavi/sound/sampled/FilterChain.java +++ b/src/main/java/vavi/sound/sampled/FilterChain.java @@ -23,7 +23,7 @@ public class FilterChain { /** */ - private List inputFilters = new ArrayList<>(); + private final List inputFilters = new ArrayList<>(); /** */ public AudioInputStream doFilter(AudioInputStream audioInputStream) throws IOException, UnsupportedAudioFileException { @@ -37,5 +37,3 @@ public AudioInputStream doFilter(AudioInputStream audioInputStream) throws IOExc // TODO implement } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/InputFilter.java b/src/main/java/vavi/sound/sampled/InputFilter.java index ee6acf3..f77bd17 100644 --- a/src/main/java/vavi/sound/sampled/InputFilter.java +++ b/src/main/java/vavi/sound/sampled/InputFilter.java @@ -19,8 +19,7 @@ * @version 0.00 060124 nsano initial version
    */ public interface InputFilter { + /** */ AudioInputStream doFilter(AudioInputStream audioInputStream) throws IOException, UnsupportedAudioFileException; } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/MonauralInputFilter.java b/src/main/java/vavi/sound/sampled/MonauralInputFilter.java index 48359fc..d7ece05 100644 --- a/src/main/java/vavi/sound/sampled/MonauralInputFilter.java +++ b/src/main/java/vavi/sound/sampled/MonauralInputFilter.java @@ -48,5 +48,3 @@ public AudioInputStream doFilter(AudioInputStream sourceAis) throws IOException, return AudioSystem.getAudioInputStream(outAudioFormat, sourceAis); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/Pcm16BitMonauralWaveDivider.java b/src/main/java/vavi/sound/sampled/Pcm16BitMonauralWaveDivider.java index fa76dae..35c8797 100644 --- a/src/main/java/vavi/sound/sampled/Pcm16BitMonauralWaveDivider.java +++ b/src/main/java/vavi/sound/sampled/Pcm16BitMonauralWaveDivider.java @@ -39,8 +39,8 @@ class Pcm16BitMonauralWaveDivider implements WaveDivider { } /** - * WAVE ファイル中の PCM データを分割します。 - * PCM はモノラル 16 bit にしか対応していません。 + * Divides PCM data in WAVE file. + * only monaural 16 bit PCM is supported. * @param seconds time for divide * @param event event for each chunks */ @@ -96,5 +96,3 @@ public void divide(float seconds, Event event) throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/SimpleResamplingInputFilter.java b/src/main/java/vavi/sound/sampled/SimpleResamplingInputFilter.java index a332148..7c72627 100644 --- a/src/main/java/vavi/sound/sampled/SimpleResamplingInputFilter.java +++ b/src/main/java/vavi/sound/sampled/SimpleResamplingInputFilter.java @@ -20,12 +20,13 @@ /** * SimpleResamplingInputFilter. * - * @require tritonus_remaining-XXX.jar + * @require tritonus:tritonus-remaining * * @author Naohide Sano (nsano) * @version 0.00 060124 nsano initial version
    */ public class SimpleResamplingInputFilter implements InputFilter { + /** */ protected int outSamplingRate; @@ -53,5 +54,3 @@ public AudioInputStream doFilter(AudioInputStream sourceAis) throws IOException, return AudioSystem.getAudioInputStream(outAudioFormat, sourceAis); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/TemporaryFiledInputFilter.java b/src/main/java/vavi/sound/sampled/TemporaryFiledInputFilter.java index 2027e32..1642b4b 100644 --- a/src/main/java/vavi/sound/sampled/TemporaryFiledInputFilter.java +++ b/src/main/java/vavi/sound/sampled/TemporaryFiledInputFilter.java @@ -28,7 +28,7 @@ public class TemporaryFiledInputFilter implements InputFilter { @Override public AudioInputStream doFilter(AudioInputStream sourceAis) throws IOException, UnsupportedAudioFileException { - // 一回 temp ファイルに落とす + // once write into temp File tmpFile = File.createTempFile("temp", ".wav"); int r = AudioSystem.write(sourceAis, AudioFileFormat.Type.WAVE, tmpFile); Debug.println(Level.FINE, "RESULT: " + r); @@ -36,5 +36,3 @@ public AudioInputStream doFilter(AudioInputStream sourceAis) throws IOException, return AudioSystem.getAudioInputStream(tmpFile); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/WaveDivider.java b/src/main/java/vavi/sound/sampled/WaveDivider.java index fed0bed..2f6bb1b 100644 --- a/src/main/java/vavi/sound/sampled/WaveDivider.java +++ b/src/main/java/vavi/sound/sampled/WaveDivider.java @@ -24,17 +24,17 @@ */ public interface WaveDivider { - /** 分割された PCM データを表すクラスです。 */ + /** Represents divided PCM data */ class Chunk { - /** 順番 */ + /** Sequence number */ public int sequence; - /** サンプリングレート */ + /** sampling rate */ public int samplingRate; - /** サンプリング bits */ + /** sampling bits */ public int bits; - /** チャンネル数 */ + /** channel number */ public int channels; - /** PCM データ */ + /** PCM dara */ public byte[] buffer; /** */ Chunk(int sequence, byte[] buffer, int samplingRate, int bits, int channels) { @@ -49,7 +49,7 @@ class Chunk { /** */ class Factory { public static WaveDivider getWaveDivider(AudioInputStream audioInputStream) throws IOException, UnsupportedAudioFileException { - // TODO ちゃんとプロパティとかから選ぶ + // TODO use property if (audioInputStream.getFormat().getEncoding().equals(Encoding.PCM_SIGNED)) { if (audioInputStream.getFormat().getChannels() == 1) { return new Pcm16BitMonauralWaveDivider(audioInputStream); @@ -69,11 +69,9 @@ interface Event { } /** - * WAVE ファイル中の PCM データを分割します。 + * Divides PCM data in WAVE file. * @param seconds time for divide * @param event event for each chunks */ void divide(float seconds, Event event) throws IOException; } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/AdpcmWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/AdpcmWaveAudioFileReader.java new file mode 100644 index 0000000..a9ef61d --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/AdpcmWaveAudioFileReader.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.util.Map; +import java.util.logging.Level; +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFileFormat.Type; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.spi.AudioFileReader; + +import vavi.util.Debug; +import vavi.util.win32.Chunk; +import vavi.util.win32.WAVE; + + +/** + * Provider for some ADPCM audio files reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public abstract class AdpcmWaveAudioFileReader extends AudioFileReader { + + @Override + public AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { + try (InputStream inputStream = Files.newInputStream(file.toPath())) { + return getAudioFileFormat(new BufferedInputStream(inputStream), (int) file.length()); + } + } + + @Override + public AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException, IOException { + try (InputStream inputStream = url.openStream()) { + return getAudioFileFormat(inputStream instanceof BufferedInputStream ? inputStream : new BufferedInputStream(inputStream)); + } + } + + @Override + public AudioFileFormat getAudioFileFormat(InputStream stream) throws UnsupportedAudioFileException, IOException { + return getAudioFileFormat(stream, AudioSystem.NOT_SPECIFIED); + } + + /** + * @see "https://www.iana.org/assignments/wave-avi-codec-registry/wave-avi-codec-registry.xhtml" + */ + protected abstract int getFormatCode(); + + /** @return encoding for return */ + protected abstract AudioFormat.Encoding getEncoding(); + + /** @return size needed for wave file header analysis */ + protected int getBufferSize() { + return 512; + } + + /** @param fmt wave file header */ + protected abstract Map toProperties(WAVE.fmt fmt); + + /** */ + private static final String WAVE_DATA_NOT_LOAD_KEY = "vavi.util.win32.WAVE.data.notLoadData"; + + /** + * Returns the AudioFileFormat from the given InputStream. Implementation. + * + * @param bitStream input to decode + * @param mediaLength unused + * @return an AudioInputStream object based on the audio file data contained + * in the input stream. + * @throws UnsupportedAudioFileException if the File does not point to a + * valid audio file data recognized by the system. + * @throws IOException if an I/O exception occurs. + */ + protected AudioFileFormat getAudioFileFormat(InputStream bitStream, int mediaLength) throws UnsupportedAudioFileException, IOException { +Debug.println(Level.FINER, "enter available: " + bitStream.available() + ", " + getClass().getSimpleName()); + float sampleRate; + int channels; + AudioFormat.Encoding encoding; + Map properties; + try { + int bufferSize = getBufferSize(); + bitStream.mark(bufferSize); + System.setProperty(WAVE_DATA_NOT_LOAD_KEY, "true"); + WAVE wave = Chunk.readFrom(bitStream, WAVE.class); + WAVE.fmt fmt = wave.findChildOf(WAVE.fmt.class); + int formatCode = fmt.getFormatId(); + Debug.println(Level.FINER, "formatCode: " + formatCode); + if (formatCode != getFormatCode()) { + Debug.println(Level.FINER, "unsupported wave format code: " + formatCode); + throw new UnsupportedAudioFileException("unsupported wave format code: " + formatCode); + } + sampleRate = fmt.getSamplingRate(); + channels = fmt.getNumberChannels(); + properties = toProperties(fmt); + Debug.println(Level.FINER, "properties: " + properties); + bitStream.reset(); + } catch (IOException | IllegalArgumentException e) { +Debug.println(Level.FINER, e); + throw (UnsupportedAudioFileException) new UnsupportedAudioFileException(e.getMessage()).initCause(e); + } finally { + System.setProperty(WAVE_DATA_NOT_LOAD_KEY, "false"); + try { + bitStream.reset(); + } catch (IOException e) { + Debug.printStackTrace(e); + } +Debug.println(Level.FINER, "finally available: " + bitStream.available()); + } + AudioFormat format; + if (properties == null) { + format = new AudioFormat(getEncoding(), sampleRate, AudioSystem.NOT_SPECIFIED, channels, AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED, false); + } else { + format = new AudioFormat(getEncoding(), sampleRate, AudioSystem.NOT_SPECIFIED, channels, AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED, false, properties); + } + return new AudioFileFormat(Type.WAVE, format, AudioSystem.NOT_SPECIFIED); + } + + @Override + public AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { + InputStream inputStream = Files.newInputStream(file.toPath()); + try { + return getAudioInputStream(new BufferedInputStream(inputStream), (int) file.length()); + } catch (UnsupportedAudioFileException | IOException e) { + inputStream.close(); + throw e; + } + } + + @Override + public AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { + InputStream inputStream = url.openStream(); + try { + return getAudioInputStream(inputStream instanceof BufferedInputStream ? inputStream : new BufferedInputStream(inputStream)); + } catch (UnsupportedAudioFileException | IOException e) { + inputStream.close(); + throw e; + } + } + + @Override + public AudioInputStream getAudioInputStream(InputStream stream) throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(stream, AudioSystem.NOT_SPECIFIED); + } + + /** + * Obtains an audio input stream from the input stream provided. The stream + * must point to valid audio file data. + * + * @param inputStream the input stream from which the AudioInputStream + * should be constructed. + * @param mediaLength unused + * @return an AudioInputStream object based on the audio file data contained + * in the input stream. + * @throws UnsupportedAudioFileException if the File does not point to a + * valid audio file data recognized by the system. + * @throws IOException if an I/O exception occurs. + */ + protected AudioInputStream getAudioInputStream(InputStream inputStream, int mediaLength) throws UnsupportedAudioFileException, IOException { + try { + AudioFileFormat audioFileFormat = getAudioFileFormat(inputStream, mediaLength); + // TODO super cutting corner, should get data position in above method and set it in props and skip here + System.setProperty(WAVE_DATA_NOT_LOAD_KEY, "true"); + WAVE wave = Chunk.readFrom(inputStream, WAVE.class); + return new AudioInputStream(inputStream, audioFileFormat.getFormat(), audioFileFormat.getFrameLength()); + } finally { + System.setProperty(WAVE_DATA_NOT_LOAD_KEY, "false"); + } + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittEncoding.java index 4d19739..a776b63 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittEncoding.java @@ -37,5 +37,3 @@ public CcittEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittFileFormatType.java index 1db5d35..52d0d12 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/CcittFileFormatType.java @@ -20,7 +20,7 @@ public class CcittFileFormatType extends AudioFileFormat.Type { /** * Specifies an CCITT file. */ - public static final AudioFileFormat.Type G721 = new CcittFileFormatType("G721", "wav"); + public static final AudioFileFormat.Type G721 = new CcittFileFormatType("G721", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public CcittFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721FormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721FormatConversionProvider.java index e7b5356..1733515 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721FormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721FormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReader.java similarity index 98% rename from src/main/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReader.java rename to src/main/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReader.java index 08788a0..d7ceac7 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReader.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReader.java @@ -30,7 +30,7 @@ * @author Naohide Sano (nsano) * @version 0.00 050722 nsano initial version
    */ -public class G721AudioFileReader extends AudioFileReader { +public class G721RawAudioFileReader extends AudioFileReader { @Override public AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721ToPcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721ToPcmAudioInputStream.java index b735717..dc465d4 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721ToPcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721ToPcmAudioInputStream.java @@ -34,5 +34,3 @@ public G721ToPcmAudioInputStream(InputStream in, AudioFormat format, long length super(new G721InputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721WaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721WaveAudioFileReader.java new file mode 100644 index 0000000..74b4d8c --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/G721WaveAudioFileReader.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.ccitt; + +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.win32.WAVE.fmt; + + +/** + * Provider for G721 ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public class G721WaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x40; + } + + @Override + protected Encoding getEncoding() { + return CcittEncoding.G721; + } + + @Override + protected Map toProperties(fmt fmt) { + return null; + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/ccitt/readme.md b/src/main/java/vavi/sound/sampled/adpcm/ccitt/readme.md index 052aed9..f26fb26 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ccitt/readme.md +++ b/src/main/java/vavi/sound/sampled/adpcm/ccitt/readme.md @@ -1,5 +1,6 @@ +# vavi.sound.sampled.adpcm.ccitt -ADPCM の spi 実装のクラスを提供します. +Provides SPI implementation for G721 ADPCM ## TODO diff --git a/src/main/java/vavi/sound/sampled/adpcm/dvi/Dvi2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/dvi/Dvi2PcmAudioInputStream.java index aae0a05..0b8c9b5 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/dvi/Dvi2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/dvi/Dvi2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Dvi2PcmAudioInputStream(InputStream in, AudioFormat format, long length) super(new DviInputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviEncoding.java index b80f6aa..68920da 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviEncoding.java @@ -29,5 +29,3 @@ public DviEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFileFormatType.java index edf9bc0..93b6fe3 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFileFormatType.java @@ -20,7 +20,7 @@ public class DviFileFormatType extends AudioFileFormat.Type { /** * Specifies an DVI file. */ - public static final AudioFileFormat.Type DVI = new DviFileFormatType("DVI", "wav"); + public static final AudioFileFormat.Type DVI = new DviFileFormatType("DVI", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public DviFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFormatConversionProvider.java index 43a6ed9..6fed8a2 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/dvi/DviFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ima/Ima2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/ima/Ima2PcmAudioInputStream.java index 1895c17..f126bf4 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ima/Ima2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ima/Ima2PcmAudioInputStream.java @@ -36,5 +36,3 @@ public Ima2PcmAudioInputStream(InputStream in, AudioFormat format, long length, super(new ImaInputStream(in, samplesPerBlock, format.getChannels(), blockSize, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaEncoding.java index 864a2bf..9e4b172 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaEncoding.java @@ -29,5 +29,3 @@ public ImaEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFileFormatType.java index 3376609..8de889b 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFileFormatType.java @@ -18,9 +18,9 @@ public class ImaFileFormatType extends AudioFileFormat.Type { /** - * Specifies an DVI file. + * Specifies an IMA file. */ - public static final AudioFileFormat.Type IMA = new ImaFileFormatType("IMA", "wav"); + public static final AudioFileFormat.Type IMA = new ImaFileFormatType("IMA", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public ImaFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFormatConversionProvider.java index 234df76..82a1697 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaFormatConversionProvider.java @@ -18,8 +18,6 @@ /** * ImaFormatConversionProvider. * - * TODO read from wav - * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ @@ -57,21 +55,21 @@ public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, Audio } else { return new AudioFormat[] { new AudioFormat(targetEncoding, - sourceFormat.getSampleRate(), - -1, // sample size in bits - sourceFormat.getChannels(), - -1, // frame size - -1, // frame rate - false) // little endian + sourceFormat.getSampleRate(), + AudioSystem.NOT_SPECIFIED, // sample size in bits + sourceFormat.getChannels(), + AudioSystem.NOT_SPECIFIED, // frame size + AudioSystem.NOT_SPECIFIED, // frame rate + false) // little endian }; } } else if (sourceFormat.getEncoding() instanceof ImaEncoding && targetEncoding.equals(AudioFormat.Encoding.PCM_SIGNED)) { return new AudioFormat[] { new AudioFormat(sourceFormat.getSampleRate(), - 16, // sample size in bits + 16, // sample size in bits sourceFormat.getChannels(), - true, // signed - false) // little endian (for PCM wav) + true, // signed + false) // little endian (for PCM wav) }; } else { return new AudioFormat[0]; @@ -138,5 +136,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReader.java new file mode 100644 index 0000000..c8dfdd2 --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReader.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.ima; + +import java.util.HashMap; +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.ByteUtil; +import vavi.util.win32.WAVE; + + +/** + * Provider IMA(DVI) ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public class ImaWaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x11; + } + + @Override + protected Encoding getEncoding() { + return ImaEncoding.IMA; + } + + @Override + protected int getBufferSize() { + return super.getBufferSize() + 2 + 2; + } + + @Override + protected Map toProperties(WAVE.fmt fmt) { + Map properties = new HashMap<>(); + int samplesPerBlock = ByteUtil.readLeShort(fmt.getExtended()); + int blockSize = fmt.getBlockSize(); + properties.put("samplesPerBlock", samplesPerBlock); + properties.put("blockSize", blockSize); + return properties; + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/ma/Ma2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/ma/Ma2PcmAudioInputStream.java index 059ecd8..02a87d1 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ma/Ma2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ma/Ma2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Ma2PcmAudioInputStream(InputStream in, AudioFormat format, long length) { super(new MaInputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ma/MaEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/ma/MaEncoding.java index 62bf0c8..78fa76e 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ma/MaEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ma/MaEncoding.java @@ -29,5 +29,3 @@ public MaEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ma/MaFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/ma/MaFileFormatType.java index f968785..9a74fce 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ma/MaFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ma/MaFileFormatType.java @@ -32,5 +32,3 @@ public MaFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ma/MaFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/ma/MaFormatConversionProvider.java index d993b23..1036347 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ma/MaFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ma/MaFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ms/Ms2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/ms/Ms2PcmAudioInputStream.java index 89a66f1..533893b 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ms/Ms2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ms/Ms2PcmAudioInputStream.java @@ -36,5 +36,3 @@ public Ms2PcmAudioInputStream(InputStream in, AudioFormat format, long length, super(new MsInputStream(in, samplesPerBlock, nCoefs, iCoefs, format.getChannels(), blockSize, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ms/MsEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/ms/MsEncoding.java index fc52490..e7c3186 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ms/MsEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ms/MsEncoding.java @@ -29,5 +29,3 @@ public MsEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ms/MsFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/ms/MsFileFormatType.java index 8181fcc..a1394fd 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ms/MsFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ms/MsFileFormatType.java @@ -20,7 +20,7 @@ public class MsFileFormatType extends AudioFileFormat.Type { /** * Specifies an DVI file. */ - public static final AudioFileFormat.Type MS = new MsFileFormatType("MS", "wav"); + public static final AudioFileFormat.Type MS = new MsFileFormatType("MS", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public MsFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ms/MsFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/ms/MsFormatConversionProvider.java index 309b7ea..6853961 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/ms/MsFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/ms/MsFormatConversionProvider.java @@ -18,8 +18,6 @@ /** * MsFormatConversionProvider. * - * TODO read from wav - * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ @@ -57,21 +55,21 @@ public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, Audio } else { return new AudioFormat[] { new AudioFormat(targetEncoding, - sourceFormat.getSampleRate(), - -1, // sample size in bits - sourceFormat.getChannels(), - -1, // frame size - -1, // frame rate - false) // little endian + sourceFormat.getSampleRate(), + AudioSystem.NOT_SPECIFIED, // sample size in bits + sourceFormat.getChannels(), + AudioSystem.NOT_SPECIFIED, // frame size + AudioSystem.NOT_SPECIFIED, // frame rate + false) // little endian }; } } else if (sourceFormat.getEncoding() instanceof MsEncoding && targetEncoding.equals(AudioFormat.Encoding.PCM_SIGNED)) { return new AudioFormat[] { new AudioFormat(sourceFormat.getSampleRate(), - 16, // sample size in bits + 16, // sample size in bits sourceFormat.getChannels(), - true, // signed - false) // little endian (for PCM wav) + true, // signed + false) // little endian (for PCM wav) }; } else { return new AudioFormat[0]; @@ -142,5 +140,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReader.java new file mode 100644 index 0000000..b2066e5 --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReader.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.ms; + +import java.util.HashMap; +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.ByteUtil; +import vavi.util.win32.WAVE; + + +/** + * Provider for Microsoft ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public class MsWaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x02; + } + + @Override + protected Encoding getEncoding() { + return MsEncoding.MS; + } + + @Override + protected int getBufferSize() { + return super.getBufferSize() + 2 + 32; + } + + @Override + protected Map toProperties(WAVE.fmt fmt) { + Map properties = new HashMap<>(); + byte[] b = fmt.getExtended(); + int samplesPerBlock = ByteUtil.readLeShort(b, 0); + int nCoefs = ByteUtil.readLeShort(b, 2); + assert nCoefs < 8 : "cannot deal coefs > 7"; + int[][] iCoefs = new int[nCoefs][2]; + for (int i = 0; i < nCoefs; i++) { + for (int j = 0; j < 2; j++) { + iCoefs[i][j] = ByteUtil.readLeShort(b, 4 + (i * 2 + j) * Short.BYTES); + } + } + int blockSize = fmt.getBlockSize(); + properties.put("samplesPerBlock", samplesPerBlock); + properties.put("nCoefs", nCoefs); + properties.put("iCoefs", iCoefs); + properties.put("blockSize", blockSize); + return properties; + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/oki/Oki2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/oki/Oki2PcmAudioInputStream.java index 3110799..b83cf2b 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/oki/Oki2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/oki/Oki2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Oki2PcmAudioInputStream(InputStream in, AudioFormat format, long length) super(new OkiInputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiEncoding.java index 1c1e8a5..9d2beb6 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiEncoding.java @@ -29,5 +29,3 @@ public OkiEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFileFormatType.java index 6d42cdf..393ee5d 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFileFormatType.java @@ -20,7 +20,7 @@ public class OkiFileFormatType extends AudioFileFormat.Type { /** * Specifies an DVI file. */ - public static final AudioFileFormat.Type OKI = new OkiFileFormatType("OKI", "wav"); + public static final AudioFileFormat.Type OKI = new OkiFileFormatType("OKI", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public OkiFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFormatConversionProvider.java index 4bd0c4b..7de99dc 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/oki/OkiWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiWaveAudioFileReader.java new file mode 100644 index 0000000..f5641d4 --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/oki/OkiWaveAudioFileReader.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.oki; + +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.win32.WAVE.fmt; + + +/** + * Provider for OKI ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public class OkiWaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x10; + } + + @Override + protected Encoding getEncoding() { + return OkiEncoding.OKI; + } + + @Override + protected Map toProperties(fmt fmt) { + return null; + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/rohm/Rohm2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/rohm/Rohm2PcmAudioInputStream.java index c7c8511..4be26fb 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/rohm/Rohm2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/rohm/Rohm2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Rohm2PcmAudioInputStream(InputStream in, AudioFormat format, long length) super(new RohmInputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmEncoding.java index 12fcb67..0d57d47 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmEncoding.java @@ -29,5 +29,3 @@ public RohmEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFileFormatType.java index 6b5a706..5bc3073 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFileFormatType.java @@ -18,9 +18,9 @@ public class RohmFileFormatType extends AudioFileFormat.Type { /** - * Specifies an Rohm file. + * Specifies a Rohm file. */ - public static final AudioFileFormat.Type ROHM = new RohmFileFormatType("ROHM", "wav"); + public static final AudioFileFormat.Type ROHM = new RohmFileFormatType("ROHM", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public RohmFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFormatConversionProvider.java index 1d7b19f..91b683b 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/rohm/RohmFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/vox/Vox2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/vox/Vox2PcmAudioInputStream.java index afdac6d..8efd436 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/vox/Vox2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/vox/Vox2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Vox2PcmAudioInputStream(InputStream in, AudioFormat format, long length) super(new VoxInputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxEncoding.java index dc507d9..c5bd5e6 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxEncoding.java @@ -29,5 +29,3 @@ public VoxEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFileFormatType.java index 159f300..36f7f9a 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFileFormatType.java @@ -20,7 +20,7 @@ public class VoxFileFormatType extends AudioFileFormat.Type { /** * Specifies an VOX file. */ - public static final AudioFileFormat.Type VOX = new VoxFileFormatType("VOX", "wav"); + public static final AudioFileFormat.Type VOX = new VoxFileFormatType("VOX", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public VoxFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFormatConversionProvider.java index 81be93a..9a50a87 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/vox/VoxWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxWaveAudioFileReader.java new file mode 100644 index 0000000..ed9476a --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/vox/VoxWaveAudioFileReader.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.vox; + +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.win32.WAVE.fmt; + + +/** + * Provider for VOX ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + * @see "https://en.wikipedia.org/wiki/Dialogic_ADPCM" + */ +public class VoxWaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x17; + } + + @Override + protected Encoding getEncoding() { + return VoxEncoding.VOX; + } + + @Override + protected Map toProperties(fmt fmt) { + return null; + } +} diff --git a/src/main/java/vavi/sound/sampled/adpcm/yamaha/Yamaha2PcmAudioInputStream.java b/src/main/java/vavi/sound/sampled/adpcm/yamaha/Yamaha2PcmAudioInputStream.java index 3496e45..e161ac4 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/yamaha/Yamaha2PcmAudioInputStream.java +++ b/src/main/java/vavi/sound/sampled/adpcm/yamaha/Yamaha2PcmAudioInputStream.java @@ -34,5 +34,3 @@ public Yamaha2PcmAudioInputStream(InputStream in, AudioFormat format, long lengt super(new Ym2608InputStream(in, ByteOrder.LITTLE_ENDIAN), format, length); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaEncoding.java b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaEncoding.java index 792673f..e3c652d 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaEncoding.java +++ b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaEncoding.java @@ -29,5 +29,3 @@ public YamahaEncoding(String name) { super(name); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFileFormatType.java b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFileFormatType.java index 8c750fa..588451f 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFileFormatType.java +++ b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFileFormatType.java @@ -18,9 +18,9 @@ public class YamahaFileFormatType extends AudioFileFormat.Type { /** - * Specifies an Yamaha file. + * Specifies a Yamaha file. */ - public static final AudioFileFormat.Type YAMAHA = new YamahaFileFormatType("YAMAHA", "wav"); + public static final AudioFileFormat.Type YAMAHA = new YamahaFileFormatType("YAMAHA", "adpcm"); /** * Constructs a file type. @@ -32,5 +32,3 @@ public YamahaFileFormatType(String name, String extension) { super(name, extension); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFormatConversionProvider.java b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFormatConversionProvider.java index 4406a33..3a44942 100644 --- a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFormatConversionProvider.java +++ b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaFormatConversionProvider.java @@ -121,5 +121,3 @@ public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInput } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaWaveAudioFileReader.java b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaWaveAudioFileReader.java new file mode 100644 index 0000000..bb0c767 --- /dev/null +++ b/src/main/java/vavi/sound/sampled/adpcm/yamaha/YamahaWaveAudioFileReader.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 by Naohide Sano, All rights reserved. + * + * Programmed by Naohide Sano + */ + +package vavi.sound.sampled.adpcm.yamaha; + +import java.util.Map; +import javax.sound.sampled.AudioFormat.Encoding; + +import vavi.sound.sampled.adpcm.AdpcmWaveAudioFileReader; +import vavi.util.win32.WAVE.fmt; + + +/** + * Provider for YAMAHA ADPCM audio file reading services. This implementation can parse + * the format information from WAVE audio file, and can produce audio input + * streams from files of this type. + * + * @author Naohide Sano (nsano) + * @version 0.00 240316 nsano initial version
    + */ +public class YamahaWaveAudioFileReader extends AdpcmWaveAudioFileReader { + + @Override + protected int getFormatCode() { + return 0x20; + } + + @Override + protected Encoding getEncoding() { + return YamahaEncoding.YAMAHA; + } + + @Override + protected Map toProperties(fmt fmt) { + return null; + } +} diff --git a/src/main/java/vavi/sound/sampled/mfi/DividedMfiWithVoiceMaker.java b/src/main/java/vavi/sound/sampled/mfi/DividedMfiWithVoiceMaker.java index a5a4020..1501242 100644 --- a/src/main/java/vavi/sound/sampled/mfi/DividedMfiWithVoiceMaker.java +++ b/src/main/java/vavi/sound/sampled/mfi/DividedMfiWithVoiceMaker.java @@ -64,7 +64,7 @@ public DividedMfiWithVoiceMaker(AudioInputStream sourceAis, String directory, St this.sourceAis = sourceAis; - this.directory = directory + File.separator + model; // TODO model に依存は良くない + this.directory = directory + File.separator + model; // TODO dependence on model is not good this.base = base; } @@ -165,5 +165,3 @@ public static void main(String[] args) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/MFi.java b/src/main/java/vavi/sound/sampled/mfi/MFi.java index 3019641..9b605b9 100644 --- a/src/main/java/vavi/sound/sampled/mfi/MFi.java +++ b/src/main/java/vavi/sound/sampled/mfi/MFi.java @@ -51,5 +51,3 @@ public Object getProperty(String key) { return properties.get(key); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/MachineDependentMfiWithVoiceMaker.java b/src/main/java/vavi/sound/sampled/mfi/MachineDependentMfiWithVoiceMaker.java index 3827fce..33755d9 100644 --- a/src/main/java/vavi/sound/sampled/mfi/MachineDependentMfiWithVoiceMaker.java +++ b/src/main/java/vavi/sound/sampled/mfi/MachineDependentMfiWithVoiceMaker.java @@ -52,5 +52,3 @@ protected String getStoreKey(String key) { } }; } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/MfiAudioFileWriter.java b/src/main/java/vavi/sound/sampled/mfi/MfiAudioFileWriter.java index 3128acb..caf1446 100644 --- a/src/main/java/vavi/sound/sampled/mfi/MfiAudioFileWriter.java +++ b/src/main/java/vavi/sound/sampled/mfi/MfiAudioFileWriter.java @@ -33,24 +33,23 @@ public class MfiAudioFileWriter extends AudioFileWriter { new MFi(null) // TODO null }; - /** このオーディオファイルライタがファイル書き込みサポートを提供するファイル型を取得します。 */ @Override public Type[] getAudioFileTypes() { return outputTypes; } - /** 指定されたオーディオ入力ストリームからこのオーディオファイルライタが書き込みできるファイル型を取得します。 */ @Override public Type[] getAudioFileTypes(AudioInputStream stream) { return getAudioFileTypes(); // TODO check stream } /** - * 指定されたファイル形式のオーディオファイルを表すバイトストリームを、指定された外部ファイルへ書き込みます。 + * {@inheritDoc} + * * @param fileType must be instance of {@link MFi} - * @param out null 出力を指定してください。 win32: "nul", *nix: "/dev/null" - * @throws IllegalArgumentException fileType が MFi でない場合スローされます。 - * @throws NullPointerException fileType に properties が設定されていない場合スローされます。 + * @param out specify null device. e.g. win32: "nul", *nix: "/dev/null" + * @throws IllegalArgumentException when fileType is not MFi + * @throws NullPointerException when fileType is not set in properties */ @Override public int write(AudioInputStream stream, Type fileType, OutputStream out) throws IOException { @@ -61,7 +60,7 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw // properties boolean divided = (Boolean) ((MFi) fileType).getProperty("mfi.divided"); if (divided) { - // 分割 + // division String directory = (String) ((MFi) fileType).getProperty("mfi.directory"); String base = (String) ((MFi) fileType).getProperty("mfi.base"); String model = (String) ((MFi) fileType).getProperty("mfi.model"); @@ -76,7 +75,7 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw int r = mwvm.create(); return r; } else { - // 単体 + // single unit String filename = (String) ((MFi) fileType).getProperty("mfi.filename"); String model = (String) ((MFi) fileType).getProperty("mfi.model"); float time = (Float) ((MFi) fileType).getProperty("mfi.time"); @@ -99,14 +98,13 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw } /** - * 指定されたファイル型のオーディオファイルを表すバイトのストリームを、指定された出力ストリームへ書き込みます。 + * {@inheritDoc} + * * @param fileType must be instance of {@link MFi} - * @param out null 出力を指定してください。 win32: "nul", *nix: "/dev/null" + * @param out specify null device. e.g. win32: "nul", *nix: "/dev/null" */ @Override public int write(AudioInputStream stream, Type fileType, File out) throws IOException { return write(stream, fileType, Files.newOutputStream(out.toPath())); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/MfiWithVoiceMaker.java b/src/main/java/vavi/sound/sampled/mfi/MfiWithVoiceMaker.java index 486928c..85dd7ed 100644 --- a/src/main/java/vavi/sound/sampled/mfi/MfiWithVoiceMaker.java +++ b/src/main/java/vavi/sound/sampled/mfi/MfiWithVoiceMaker.java @@ -116,7 +116,7 @@ protected MfiWithVoiceMaker(String model, float time, int samplingRate, int bits public int create() throws IOException, UnsupportedAudioFileException, InvalidMfiDataException { long t = System.currentTimeMillis(); // divide -System.err.println("1: " + (System.currentTimeMillis() - t)); +Debug.println(Level.FINE, "1: " + (System.currentTimeMillis() - t)); t = System.currentTimeMillis(); byte[] buffer = new byte[sourceAis.available()]; int l = 0; @@ -125,7 +125,7 @@ public int create() throws IOException, UnsupportedAudioFileException, InvalidMf l += r; } int result = createMFi(buffer, new File(filename)); -System.err.println("2: " + (System.currentTimeMillis() - t)); +Debug.println(Level.FINE, "2: " + (System.currentTimeMillis() - t)); t = System.currentTimeMillis(); return result; } @@ -260,5 +260,3 @@ public static void main(String[] args) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/readme.md b/src/main/java/vavi/sound/sampled/mfi/readme.md index 16995ef..3432a9c 100644 --- a/src/main/java/vavi/sound/sampled/mfi/readme.md +++ b/src/main/java/vavi/sound/sampled/mfi/readme.md @@ -1,8 +1,8 @@ # vavi.sound.sampled.mfi -MFi ADPCM サウンド関連の javax.sound.sampled.spi 実装クラスを提供します. +Provides MFi ADPCM sound related javax.sound.sampled.spi implementations. ## TODO - * WaveDivider のステレオ対応 - * Zip で本来のアウトプットに出力する + * WaveDivider: support stereo + * original output by Zip diff --git a/src/main/java/vavi/sound/sampled/mfi/type/sh252.java b/src/main/java/vavi/sound/sampled/mfi/type/sh252.java index 6810f94..fde2455 100644 --- a/src/main/java/vavi/sound/sampled/mfi/type/sh252.java +++ b/src/main/java/vavi/sound/sampled/mfi/type/sh252.java @@ -54,5 +54,3 @@ public List getEvents(byte[] data, float time, int sampleRate, int bit return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/mfi/type/sh900.java b/src/main/java/vavi/sound/sampled/mfi/type/sh900.java index 3c39848..f86557f 100644 --- a/src/main/java/vavi/sound/sampled/mfi/type/sh900.java +++ b/src/main/java/vavi/sound/sampled/mfi/type/sh900.java @@ -60,5 +60,3 @@ public List getEvents(byte[] data, float time, int sampleRate, int bit return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/smaf/DividedSmafWithVoiceMaker.java b/src/main/java/vavi/sound/sampled/smaf/DividedSmafWithVoiceMaker.java index 0718a16..bc7bed6 100644 --- a/src/main/java/vavi/sound/sampled/smaf/DividedSmafWithVoiceMaker.java +++ b/src/main/java/vavi/sound/sampled/smaf/DividedSmafWithVoiceMaker.java @@ -58,7 +58,7 @@ public DividedSmafWithVoiceMaker(AudioInputStream sourceAis, String directory, S this.sourceAis = sourceAis; - this.directory = directory + File.separator + "mmf"; // TODO mmf に依存は良くない + this.directory = directory + File.separator + "mmf"; // TODO dependence on mmf is not good this.base = base; } @@ -159,5 +159,3 @@ public static void main(String[] args) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/smaf/SMAF.java b/src/main/java/vavi/sound/sampled/smaf/SMAF.java index 86c67cc..c24a113 100644 --- a/src/main/java/vavi/sound/sampled/smaf/SMAF.java +++ b/src/main/java/vavi/sound/sampled/smaf/SMAF.java @@ -50,5 +50,3 @@ public Object getProperty(String key) { return properties.get(key); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/smaf/SmafAudioFileWriter.java b/src/main/java/vavi/sound/sampled/smaf/SmafAudioFileWriter.java index cf751ac..30d71cb 100644 --- a/src/main/java/vavi/sound/sampled/smaf/SmafAudioFileWriter.java +++ b/src/main/java/vavi/sound/sampled/smaf/SmafAudioFileWriter.java @@ -32,24 +32,23 @@ public class SmafAudioFileWriter extends AudioFileWriter { new SMAF(null) // TODO null }; - /** このオーディオファイルライタがファイル書き込みサポートを提供するファイル型を取得します。 */ @Override public Type[] getAudioFileTypes() { return outputTypes; } - /** 指定されたオーディオ入力ストリームからこのオーディオファイルライタが書き込みできるファイル型を取得します。 */ @Override public Type[] getAudioFileTypes(AudioInputStream stream) { return getAudioFileTypes(); // TODO check stream } /** - * 指定されたファイル形式のオーディオファイルを表すバイトストリームを、指定された外部ファイルへ書き込みます。 + * {@inheritDoc} + * * @param fileType must be instance of {@link SMAF} - * @param out null 出力を指定してください。 win32: "nul", *nix: "/dev/null" - * @throws IllegalArgumentException fileType が SMAF でない場合スローされます。 - * @throws NullPointerException fileType に properties が設定されていない場合スローされます。 + * @param out specify null device. e.g. win32: "nul", *nix: "/dev/null" + * @throws IllegalArgumentException when fileType is not SMAF + * @throws NullPointerException when fileType is not set in properties */ @Override public int write(AudioInputStream stream, Type fileType, OutputStream out) throws IOException { @@ -60,7 +59,7 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw // properties boolean divided = (Boolean) ((SMAF) fileType).getProperty("smaf.divided"); if (divided) { - // 分割 + // division String directory = (String) ((SMAF) fileType).getProperty("smaf.directory"); String base = (String) ((SMAF) fileType).getProperty("smaf.base"); float time = (Float) ((SMAF) fileType).getProperty("smaf.time"); @@ -74,7 +73,7 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw int r = mwvm.create(); return r; } else { - // 単体 + // single unit String filename = (String) ((SMAF) fileType).getProperty("smaf.filename"); float time = (Float) ((SMAF) fileType).getProperty("smaf.time"); int sampleRate = (Integer) ((SMAF) fileType).getProperty("smaf.sampleRate"); @@ -93,14 +92,13 @@ public int write(AudioInputStream stream, Type fileType, OutputStream out) throw } /** - * 指定されたファイル型のオーディオファイルを表すバイトのストリームを、指定された出力ストリームへ書き込みます。 + * {@inheritDoc} + * * @param fileType must be instance of {@link SMAF} - * @param out null 出力を指定してください。 win32: "nul", *nix: "/dev/null" + * @param out specify null device. e.g. win32: "nul", *nix: "/dev/null" */ @Override public int write(AudioInputStream stream, Type fileType, File out) throws IOException { return write(stream, fileType, Files.newOutputStream(out.toPath())); } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/smaf/SmafWithVoiceMaker.java b/src/main/java/vavi/sound/sampled/smaf/SmafWithVoiceMaker.java index 6013a94..ade8619 100644 --- a/src/main/java/vavi/sound/sampled/smaf/SmafWithVoiceMaker.java +++ b/src/main/java/vavi/sound/sampled/smaf/SmafWithVoiceMaker.java @@ -327,5 +327,3 @@ public static void main(String[] args) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/sampled/smaf/readme.md b/src/main/java/vavi/sound/sampled/smaf/readme.md index b73f41a..d4a3cc0 100644 --- a/src/main/java/vavi/sound/sampled/smaf/readme.md +++ b/src/main/java/vavi/sound/sampled/smaf/readme.md @@ -1,5 +1,5 @@ # vavi.sound.smapled.smaf -SMAF ADPCM サウンド関連の javax.sound.sampled.spi 実装クラスを提供します. +Provides SMAF ADPCM sound related javax.sound.sampled.spi implementations. ## TODO diff --git a/src/main/java/vavi/sound/smaf/InvalidSmafDataException.java b/src/main/java/vavi/sound/smaf/InvalidSmafDataException.java index fedcf9e..525cadf 100644 --- a/src/main/java/vavi/sound/smaf/InvalidSmafDataException.java +++ b/src/main/java/vavi/sound/smaf/InvalidSmafDataException.java @@ -30,5 +30,3 @@ public InvalidSmafDataException(Throwable t) { super(t); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/MetaEventAdapter.java b/src/main/java/vavi/sound/smaf/MetaEventAdapter.java index bdd6e1f..7e18614 100644 --- a/src/main/java/vavi/sound/smaf/MetaEventAdapter.java +++ b/src/main/java/vavi/sound/smaf/MetaEventAdapter.java @@ -59,14 +59,14 @@ public void open() { } /** - * {@link SmafMessageStore} を使用した再生機構を実装しています。 + * Implements playback mechanism using {@link SmafMessageStore}. * @see WaveMessage#getMidiEvents(MidiContext) */ @Override public void meta(javax.sound.midi.MetaMessage message) { //Debug.println("type: " + message.getType()); switch (MetaEvent.valueOf(message.getType())) { - case META_MACHINE_DEPEND: // シーケンサ固有のメタイベント + case META_MACHINE_DEPEND: // sequencer specific meta event try { processSpecial(message); } catch (InvalidSmafDataException e) { @@ -79,13 +79,13 @@ public void meta(javax.sound.midi.MetaMessage message) { throw e; } break; - case META_TEXT_EVENT: // テキスト・イベント - case META_COPYRIGHT: // 著作権表示 - case META_NAME: // シーケンス名またはトラック名 + case META_TEXT_EVENT: // text event + case META_COPYRIGHT: // show copyright + case META_NAME: // sequence name or track name Debug.println(Level.FINE, "meta " + message.getType() + ": " + MidiUtil.getDecodedMessage(message.getData())); break; - case META_END_OF_TRACK: // トラックの終わり - case META_TEMPO: // テンポ設定 + case META_END_OF_TRACK: // end of track + case META_TEMPO: // tempo was set Debug.println(Level.FINE, "this handler ignore meta: " + message.getType()); break; default: @@ -173,5 +173,3 @@ private void processSpecial_Vavi_Wave(javax.sound.midi.MetaMessage message) sequencer.sequence(); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/MetaEventListener.java b/src/main/java/vavi/sound/smaf/MetaEventListener.java index fd39c4a..7a85c2e 100644 --- a/src/main/java/vavi/sound/smaf/MetaEventListener.java +++ b/src/main/java/vavi/sound/smaf/MetaEventListener.java @@ -19,5 +19,3 @@ public interface MetaEventListener extends EventListener { void meta(MetaMessage meta); } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/MetaMessage.java b/src/main/java/vavi/sound/smaf/MetaMessage.java index 712f416..ac22815 100644 --- a/src/main/java/vavi/sound/smaf/MetaMessage.java +++ b/src/main/java/vavi/sound/smaf/MetaMessage.java @@ -20,29 +20,29 @@ | +- manufacturers id +---- length -[テンポ] +[tempo] FF 51 03 aa bb cc -[テキスト] +[text] FF 01 ll dd … dd -[著作権表示] +[copyright] FF 02 ll dd … dd -[キュー・ポイント] +[cue point] FF 07 05 53 54 41 52 54 (START) FF 07 04 53 54 4F 50 (STOP) -[XF キューポイント] +[XF cue point] FF 7F 04 43 7B 02 rr -[チャンネルステータス指定] +[specify channel status] FF 7F 14 43 02 00 04 dd ... dd -[MA-5 AL チャンネル指定] +[MA-5 AL specify channel ] FF 7F 06 43 02 01 01 cc dd -[MA-5 V 発音チャンネル指定] +[MA-5 V specify voice channel] FF 7F 06 43 02 01 02 cc dd *
  • @@ -84,7 +84,7 @@ public void setMessage(int type, Map data) } /** - * Meta 番号 + * Meta number *

    * {@link javax.sound.midi.MetaMessage} compatible. *

    @@ -98,7 +98,7 @@ public int getType() { *

    * {@link javax.sound.midi.MetaMessage} nearly compatible. *

    - * @return コピー + * @return copied data */ public Map getData() { return data; @@ -121,5 +121,3 @@ public int getLength() { return 0; // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/MetaSupport.java b/src/main/java/vavi/sound/smaf/MetaSupport.java index d13e8d5..8956587 100644 --- a/src/main/java/vavi/sound/smaf/MetaSupport.java +++ b/src/main/java/vavi/sound/smaf/MetaSupport.java @@ -12,8 +12,8 @@ /** - * MetaEvent 機構のユーティリティクラスです. - *
  • javax.sound.midi パッケージにはない。(SMAF オリジナル) + * This is a utility class for the MetaEvent mechanism. + *
  • not in javax.sound.midi package. (SMAF original) * * @author Naohide Sano (nsano) * @version 0.00 071010 nsano initial version
    @@ -23,22 +23,20 @@ class MetaSupport implements Serializable { /** The metaEvent listeners */ private List listenerList = new ArrayList<>(); - /** {@link MetaEventListener} を追加します. */ + /** Adds {@link MetaEventListener}. */ public void addMetaEventListener(MetaEventListener l) { listenerList.add(l); } - /** {@link MetaEventListener} を削除します. */ + /** Removes {@link MetaEventListener}. */ public void removeMetaEventListener(MetaEventListener l) { listenerList.remove(l); } - /** meta message を発行します. */ + /** Fires a meta message. */ public void fireMeta(MetaMessage meta) { for (MetaEventListener listener : listenerList) { listener.meta(meta); } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/Sequence.java b/src/main/java/vavi/sound/smaf/Sequence.java index c063e67..49f6be3 100644 --- a/src/main/java/vavi/sound/smaf/Sequence.java +++ b/src/main/java/vavi/sound/smaf/Sequence.java @@ -51,5 +51,3 @@ public Track[] getTracks() { return tracks.toArray(new Track[0]); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/Sequencer.java b/src/main/java/vavi/sound/smaf/Sequencer.java index adb1ee5..0dce06e 100644 --- a/src/main/java/vavi/sound/smaf/Sequencer.java +++ b/src/main/java/vavi/sound/smaf/Sequencer.java @@ -42,11 +42,9 @@ void setSequence(InputStream stream) /** */ boolean isRunning(); - /** {@link MetaEventListener Listener} を登録します。 */ + /** Adds {@link MetaEventListener Listener}. */ void addMetaEventListener(MetaEventListener l); - /** {@link MetaEventListener Listener} を削除します。 */ + /** Removes {@link MetaEventListener Listener}. */ void removeMetaEventListener(MetaEventListener l); } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/ShortMessage.java b/src/main/java/vavi/sound/smaf/ShortMessage.java index e1ef7e0..4bf6c6a 100644 --- a/src/main/java/vavi/sound/smaf/ShortMessage.java +++ b/src/main/java/vavi/sound/smaf/ShortMessage.java @@ -8,7 +8,7 @@ /** - * ShortMessage を表すクラスです。 + * Represents ShortMessage. * * @author Naohide Sano (nsano) * @version 0.00 041227 nsano port from MFi
    @@ -18,5 +18,3 @@ public abstract class ShortMessage extends SmafMessage { public ShortMessage() { } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafDevice.java b/src/main/java/vavi/sound/smaf/SmafDevice.java index 05e0344..515fcc9 100644 --- a/src/main/java/vavi/sound/smaf/SmafDevice.java +++ b/src/main/java/vavi/sound/smaf/SmafDevice.java @@ -86,5 +86,3 @@ public final String toString() { /** */ void open() throws SmafUnavailableException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafDeviceProvider.java b/src/main/java/vavi/sound/smaf/SmafDeviceProvider.java index 7a4de50..9d96556 100644 --- a/src/main/java/vavi/sound/smaf/SmafDeviceProvider.java +++ b/src/main/java/vavi/sound/smaf/SmafDeviceProvider.java @@ -110,5 +110,3 @@ public static SmafDevice getSmafDevice(SmafDevice.Info smafDeviceInfo) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafEvent.java b/src/main/java/vavi/sound/smaf/SmafEvent.java index a770c19..a3241b8 100644 --- a/src/main/java/vavi/sound/smaf/SmafEvent.java +++ b/src/main/java/vavi/sound/smaf/SmafEvent.java @@ -44,5 +44,3 @@ public long getTick() { return tick; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafFileFormat.java b/src/main/java/vavi/sound/smaf/SmafFileFormat.java index 5f46dd3..547e3d1 100644 --- a/src/main/java/vavi/sound/smaf/SmafFileFormat.java +++ b/src/main/java/vavi/sound/smaf/SmafFileFormat.java @@ -87,9 +87,9 @@ static SmafFileFormat readFrom(InputStream is) throws InvalidSmafDataException, } /** - * ストリームに書き込みます。事前にシーケンスを設定しておくこと。 + * Writes to the stream. Set the sequence in advance. * @after out has been {@link java.io.OutputStream#flush() flush}-ed - * @throws IllegalStateException シーケンスが設定されていない場合スローされます + * @throws IllegalStateException throws if no sequence is set */ void writeTo(OutputStream out) throws InvalidSmafDataException, IOException { @@ -127,5 +127,3 @@ public static boolean isIgnored(SmafMessage message) { return false; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafFileReader.java b/src/main/java/vavi/sound/smaf/SmafFileReader.java index ca8db41..dec798d 100644 --- a/src/main/java/vavi/sound/smaf/SmafFileReader.java +++ b/src/main/java/vavi/sound/smaf/SmafFileReader.java @@ -76,5 +76,3 @@ public Sequence getSequence(URL url) return getSequence(is); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafFileWriter.java b/src/main/java/vavi/sound/smaf/SmafFileWriter.java index 1d3be8b..c472a5a 100644 --- a/src/main/java/vavi/sound/smaf/SmafFileWriter.java +++ b/src/main/java/vavi/sound/smaf/SmafFileWriter.java @@ -34,7 +34,7 @@ public int[] getSmafFileTypes() { /** */ public int[] getSmafFileTypes(Sequence sequence) { - // sequence を無視しているけど SMAF Sequence 一つしか型ないからいい + // ignoring sequence, but there's only one type of SMAF Sequence, so that's fine return types; } @@ -50,16 +50,15 @@ public boolean isFileTypeSupported(int fileType) { /** */ public boolean isFileTypeSupported(int fileType, Sequence sequence) { - // sequence を無視しているけど SMAF Sequence 一つしか型ないからいい + // ignoring sequence, but there's only one type of SMAF Sequence, so that's fine return isFileTypeSupported(fileType); } /** - * @param in {@link Sequence#getTracks() Sequence#tracks}[0] に - * 各種 {@link SmafMessage TODO} を設定することで - * ヘッダチャンクの内容を指定することが出来ます。 - * @return 0: fileType がサポートされていない場合、書き込みデータにエラーがある場合 - * else: 書き込んだバイト数 + * @param in You can specify the contents of the header chunk by setting various {@link SmafMessage TODO} + * to {@link Sequence#getTracks() Sequence#tracks}[0]. + * @return 0: if fileType is not supported, if there is an error in the write data + * else: number of bytes written */ public int write(Sequence in, int fileType, OutputStream out) throws IOException { @@ -71,10 +70,10 @@ public int write(Sequence in, int fileType, OutputStream out) SmafFileFormat ff = new SmafFileFormat(in); - // header (最低限必要なものはデフォルトを設定) + // header (set the defaults for the minimum requirements) // try { // } catch (InvalidSmafDataException e) { -// // TODO IOException でいいのか? +// // TODO is IOException ok? // throw (IOException) new IOException().initCause(e); // } @@ -89,7 +88,7 @@ public int write(Sequence in, int fileType, OutputStream out) return ff.getByteLength(); } - /** {@link #write(Sequence, int, OutputStream)} に委譲 */ + /** Delegates to {@link #write(Sequence, int, OutputStream)} */ public int write(Sequence in, int fileType, File out) throws IOException { @@ -97,5 +96,3 @@ public int write(Sequence in, int fileType, File out) return write(in, fileType, os); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafMessage.java b/src/main/java/vavi/sound/smaf/SmafMessage.java index c9c7b60..bf0f190 100644 --- a/src/main/java/vavi/sound/smaf/SmafMessage.java +++ b/src/main/java/vavi/sound/smaf/SmafMessage.java @@ -7,7 +7,7 @@ package vavi.sound.smaf; /** - * SMAF メッセージの基底クラスです. + * SMAF message base class. * * @author Naohide Sano (nsano) * @version 0.00 041227 nsano port from MFi
    @@ -32,12 +32,10 @@ public int getDuration() { } /** - * @return コピー + * @return copied data */ public abstract byte[] getMessage(); /** */ public abstract int getLength(); } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafMidiConverter.java b/src/main/java/vavi/sound/smaf/SmafMidiConverter.java index c1b1883..de462ae 100644 --- a/src/main/java/vavi/sound/smaf/SmafMidiConverter.java +++ b/src/main/java/vavi/sound/smaf/SmafMidiConverter.java @@ -136,7 +136,7 @@ Sequence convert(vavi.sound.smaf.Sequence smafSequence) return midiSequence; } - /** Note が Control/Program より先に入ることがある */ + /** Note may be entered before Control/Program */ @SuppressWarnings("unused") private void addSmafMessage(javax.sound.midi.Track midiTrack, MidiEvent midiEvent) { //Debug.println("★: " + midiEvent.getMessage()); @@ -167,5 +167,3 @@ vavi.sound.smaf.Sequence convert(Sequence midiSequence, int fileType) throw new UnsupportedOperationException("not implemented yet"); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafSequence.java b/src/main/java/vavi/sound/smaf/SmafSequence.java index ba1af34..238e096 100644 --- a/src/main/java/vavi/sound/smaf/SmafSequence.java +++ b/src/main/java/vavi/sound/smaf/SmafSequence.java @@ -25,7 +25,7 @@ */ class SmafSequence extends Sequence { - /** TODO 内容は SmafFileFormat/FileChunk に移すべき */ + /** TODO content should be moved to SmafFileFormat/FileChunk */ SmafSequence(FileChunk fileChunk) { try { for (TrackChunk scoreTrackChunk : fileChunk.getScoreTrackChunks()) { @@ -42,11 +42,11 @@ class SmafSequence extends Sequence { } // SMF XF Information | SMAF Contents Info Chunk // -------------------+------------------------- - // 曲名 | ST: 曲名 - // 作曲者 | SW: 作曲 - // 作詞者 | WW: 作詞 - // 編曲者 | AW: 編曲 - // 演奏者・歌唱者 | AN: アーティスト名 + // sond title | ST: song title + // sond writer | SW: song writer + // words writer | WW: words writer + // arrangement writer | AW: arrangement writer + // artist name | AN: artist name Track track0 = tracks.get(0); String title = "title"; String prot = "vavi"; @@ -55,7 +55,7 @@ class SmafSequence extends Sequence { Debug.println(Level.FINE, dataChunk); // TODO } - } else if (fileChunk.getContentsInfoChunk() != null) { // TODO 必須なので if 要らん + } else if (fileChunk.getContentsInfoChunk() != null) { // TODO no need for if as it is required title = fileChunk.getContentsInfoChunk().getSubDataByTag("ST"); prot = fileChunk.getContentsInfoChunk().getSubDataByTag("SW"); // TODO create meta for ContentsInfoChunk @@ -94,5 +94,3 @@ private void insert(Track track, SmafEvent event, int index) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafSequencer.java b/src/main/java/vavi/sound/smaf/SmafSequencer.java index 1e1ac12..c9c9f6b 100644 --- a/src/main/java/vavi/sound/smaf/SmafSequencer.java +++ b/src/main/java/vavi/sound/smaf/SmafSequencer.java @@ -159,16 +159,16 @@ private void off() { //------------------------------------------------------------------------- - /** {@link MetaMessage MetaEvent} ユーティリティ。 */ + /** {@link MetaMessage MetaEvent} utility */ private MetaSupport metaSupport = new MetaSupport(); - /* {@link MetaEventListener} を登録します。 */ + /* Adds a {@link MetaEventListener}. */ @Override public void addMetaEventListener(MetaEventListener l) { metaSupport.addMetaEventListener(l); } - /* {@link MetaEventListener} を削除します。 */ + /* Removes a {@link MetaEventListener}. */ @Override public void removeMetaEventListener(MetaEventListener l) { metaSupport.removeMetaEventListener(l); @@ -235,5 +235,3 @@ public Receiver getReceiver() throws MidiUnavailableException { return midiSynthesizer.getReceiver(); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafSystem.java b/src/main/java/vavi/sound/smaf/SmafSystem.java index a345ec2..7c0ec63 100644 --- a/src/main/java/vavi/sound/smaf/SmafSystem.java +++ b/src/main/java/vavi/sound/smaf/SmafSystem.java @@ -54,14 +54,14 @@ public final class SmafSystem { private SmafSystem() { } - /** シーケンサを取得します。 */ + /** Gets a sequencer. */ public static Sequencer getSequencer() throws SmafUnavailableException { return sequencer; } - /** MIDI シーケンサに付加するリスナを取得します。 */ + /** Gets a listener to attach to a MIDI sequencer. */ public static MetaEventListener getMetaEventListener() throws SmafUnavailableException { @@ -69,7 +69,7 @@ public static MetaEventListener getMetaEventListener() } /** - * @param is + * @param is sequencer * @return SmafFileFormat */ public static SmafFileFormat getSmafFileFormat(InputStream is) @@ -80,7 +80,7 @@ public static SmafFileFormat getSmafFileFormat(InputStream is) } /** - * @param is + * @param is sequencer * @return SMAF Sequence */ public static vavi.sound.smaf.Sequence getSequence(InputStream is) @@ -90,7 +90,7 @@ public static vavi.sound.smaf.Sequence getSequence(InputStream is) return ff.getSequence(); } - /** SMAF シーケンスを取得します。 */ + /** Gets a SMAF sequence. */ public static vavi.sound.smaf.Sequence getSequence(File file) throws InvalidSmafDataException, IOException { @@ -114,7 +114,7 @@ public static Sequence toMidiSequence(vavi.sound.smaf.Sequence sequence) /** * @param in MIDI Sequence - * @param fileType + * @param fileType SMAF file type * @return SMAF sequence */ public static vavi.sound.smaf.Sequence toSmafSequence(Sequence in, int fileType) @@ -129,9 +129,9 @@ public static vavi.sound.smaf.Sequence toSmafSequence(Sequence in, int fileType) } /** - * @param smafSequence - * @param fileType - * @param out + * @param smafSequence SMAF Sequence + * @param fileType SMAF file type + * @param out stream to output * @return SMAF sequence */ public static int write(vavi.sound.smaf.Sequence smafSequence, int fileType, OutputStream out) @@ -140,12 +140,10 @@ public static int write(vavi.sound.smaf.Sequence smafSequence, int fileType, Out return writer.write(smafSequence, fileType, out); } - /** SMAF or MIDI で書き出します。 */ + /** Writes as SMAF or MIDI. */ public static int write(vavi.sound.smaf.Sequence smafSequence, int fileType, File out) throws IOException { return writer.write(smafSequence, fileType, out); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SmafUnavailableException.java b/src/main/java/vavi/sound/smaf/SmafUnavailableException.java index c408ef9..2241405 100644 --- a/src/main/java/vavi/sound/smaf/SmafUnavailableException.java +++ b/src/main/java/vavi/sound/smaf/SmafUnavailableException.java @@ -30,5 +30,3 @@ public SmafUnavailableException(Throwable t) { super(t); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/Synthesizer.java b/src/main/java/vavi/sound/smaf/Synthesizer.java index ee985b9..2a6beff 100644 --- a/src/main/java/vavi/sound/smaf/Synthesizer.java +++ b/src/main/java/vavi/sound/smaf/Synthesizer.java @@ -42,5 +42,3 @@ public interface Synthesizer extends SmafDevice { /** @see javax.sound.midi.Synthesizer#getReceiver() */ Receiver getReceiver() throws MidiUnavailableException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/SysexMessage.java b/src/main/java/vavi/sound/smaf/SysexMessage.java index 381af88..8b73f6c 100644 --- a/src/main/java/vavi/sound/smaf/SysexMessage.java +++ b/src/main/java/vavi/sound/smaf/SysexMessage.java @@ -47,7 +47,7 @@ protected SysexMessage() { *
  • * * @param status 0xf0 - * @param data 0xf0 以降 + * @param data after 0xf0 */ public void setMessage(int status, byte[] data, int length) throws InvalidSmafDataException { byte[] tmp = new byte[length]; @@ -101,5 +101,3 @@ public static SysexMessage getSysexMessage(int duration, byte[] data) throws Inv } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/Track.java b/src/main/java/vavi/sound/smaf/Track.java index ba7133f..40d0b7a 100644 --- a/src/main/java/vavi/sound/smaf/Track.java +++ b/src/main/java/vavi/sound/smaf/Track.java @@ -55,5 +55,3 @@ public int size() { // TODO public long ticks() } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/AudioSequenceDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/AudioSequenceDataChunk.java index 939896b..95ff266 100644 --- a/src/main/java/vavi/sound/smaf/chunk/AudioSequenceDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/AudioSequenceDataChunk.java @@ -57,12 +57,10 @@ protected void init(MyDataInputStream dis, Chunk parent) /** * internal use - * Atsq の場合 + * for Atsq */ @Override protected SmafMessage getHandyPhoneStandardMessage(int duration, int data, int gateTime) { return new WaveMessage(duration, data, gateTime); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/BitmapChunk.java b/src/main/java/vavi/sound/smaf/chunk/BitmapChunk.java index 8ab117d..3515e38 100644 --- a/src/main/java/vavi/sound/smaf/chunk/BitmapChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/BitmapChunk.java @@ -48,5 +48,3 @@ protected void init(MyDataInputStream dis, Chunk parent) public void writeTo(OutputStream os) throws IOException { } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ChannelStatus.java b/src/main/java/vavi/sound/smaf/chunk/ChannelStatus.java index c55de7d..756ed12 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ChannelStatus.java +++ b/src/main/java/vavi/sound/smaf/chunk/ChannelStatus.java @@ -113,5 +113,3 @@ public String toString() { return "channel status:[" + channel + "] type=" + type + ", KCS=" + keyControlStatus + ", LED=" + led + ", vibration=" + vibration; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/Chunk.java b/src/main/java/vavi/sound/smaf/chunk/Chunk.java index dfe5a02..62a30d5 100644 --- a/src/main/java/vavi/sound/smaf/chunk/Chunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/Chunk.java @@ -40,7 +40,7 @@ public abstract class Chunk { public Chunk() { } - /** TODO bean でもいいかも */ + /** TODO bean might be fine */ protected Chunk(byte[] id, int size) { this.id = id; @@ -48,11 +48,11 @@ protected Chunk(byte[] id, int size) { } /** - * @param dis Chunk Header は読み込み済みであること + * @param dis chunk Header must be read * @throws IOException * @throws InvalidSmafDataException * TODO Chunk -> constructor ??? - * TODO parent を渡したいが為。 + * because of passing the parent */ protected abstract void init(MyDataInputStream dis, Chunk parent) throws InvalidSmafDataException, IOException; @@ -62,15 +62,15 @@ public String getId() { return new String(id); } - /** Chunk Header の 8 バイトは含まれていないので注意 */ + /** note that the 8 bytes of Chunk Header are not included. */ public int getSize() { return size; } /** - * 最初でない親の読み込み用(マーク無し) + * For reading non-first parent (unmarked) * @param is - * @return 読み込んだ Chunk オブジェクト + * @return Chunk object read */ protected Chunk readFrom(InputStream is) throws InvalidSmafDataException, IOException { @@ -80,8 +80,8 @@ protected Chunk readFrom(InputStream is) /** * @param is should support marking - * @param parent 親のデータが欲しい時があるので - * @return 読み込んだ Chunk オブジェクト + * @param parent sometimes I want my parents' data. + * @return Chunk object read */ public static Chunk readFrom(InputStream is, Chunk parent) throws InvalidSmafDataException, IOException { @@ -108,7 +108,7 @@ public static Chunk readFrom(InputStream is, Chunk parent) chunk.init(mdis, parent); if (parent != null) { - // 親のループ内での読み込みの場合 + // for reading inside the parent loop if (is instanceof MyDataInputStream) { mdis = (MyDataInputStream) is; mdis.readSize -= 8 + chunk.getSize(); @@ -276,10 +276,11 @@ static class CRC16 { int crc = 0xffff; int count; + /** - * 16 ビットの CRC を方法 1 で求めます。 - * @param c データを与えます。 - * @return CRC 値を返します。 + * Determine the 16-bit CRC using method 1. + * @param c data + * @return CRC value */ public int update(byte[] c) { for (byte b : c) { @@ -306,7 +307,6 @@ public int getCount() { return count; } } - //---- /** @@ -376,5 +376,3 @@ protected String getStoreKey(String key) { } }; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ColorPaletteDefinitionChunk.java b/src/main/java/vavi/sound/smaf/chunk/ColorPaletteDefinitionChunk.java index 834ce6e..75e2acc 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ColorPaletteDefinitionChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/ColorPaletteDefinitionChunk.java @@ -51,5 +51,3 @@ public void writeTo(OutputStream os) throws IOException { // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ContentsInfoChunk.java b/src/main/java/vavi/sound/smaf/chunk/ContentsInfoChunk.java index e60c78e..003cd4e 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ContentsInfoChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/ContentsInfoChunk.java @@ -24,12 +24,12 @@ *
      * "CNTI"
      *
    - *  Contents Class :1 byte (必須)
    - *  Contents Type :1 byte (必須)
    - *  Contents Code Type :1 byte (必須)
    - *  Copy Status :1 byte (必須)
    - *  Copy Counts :1 byte (必須)
    - *  Option :n byte (Option)
    + *  Contents Class :1 byte (required)
    + *  Contents Type :1 byte (required)
    + *  Contents Code Type :1 byte (required)
    + *  Copy Status :1 byte (required)
    + *  Copy Counts :1 byte (required)
    + *  Option :n byte (option)
      * 
    * * @author Naohide Sano (nsano) @@ -100,8 +100,9 @@ public void writeTo(OutputStream os) throws IOException { private int contentsClass; /** - * コンテンツのクラスを表現する。 - * ※PDA 端末等、将来の多機能端末で同様のデータフォーマットまで流用する場合の区別に用いる。 + * Represents a class of content. + * *Used to differentiate when similar data formats are used in future + * multi-function terminals such as PDA terminals. */ public void setContentsClass(int contentsClass) { this.contentsClass = contentsClass; @@ -112,31 +113,31 @@ public void setContentsClass(int contentsClass) { /** *
    -     * 0x01 ISO 8859-1 (Latin-1) 英語、フランス語、ドイツ語 イタリア語、スペイン語、ポルトガル語
    -     * 0x02 EUC-KR(KS) 韓国語
    -     * 0x03 HZ-GB-2312 中国語(簡体字)
    -     * 0x04 Big5 中国語(繁体字)
    -     * 0x05 KOI8-R ロシア語など
    -     * 0x06 TCVN-5773:1993 ベトナム語
    -     * 0x07〜0x1F Reserved Reserved
    +     * 0x01 ISO 8859-1 (Latin-1) English, French, German Italian, Spanish, Portuguese
    +     * 0x02 EUC-KR(KS) Korean
    +     * 0x03 HZ-GB-2312 Chinese(Simplified)
    +     * 0x04 Big5 Chinese(Traditional)
    +     * 0x05 KOI8-R Russian etc.
    +     * 0x06 TCVN-5773:1993 Vietnamese
    +     * 0x07 ~ 0x1F Reserved Reserved
          * 0x20 UCS-2 Unicode
          * 0x21 UCS-4 Unicode
          * 0x22 UTF-7 Unicode
          * 0x23 UTF-8 Unicode
          * 0x24 UTF-16 Unicode
          * 0x25 UTF-32 Unicode
    -     * 0x26〜0xFF Reserved Reserved
    +     * 0x26 ~ 0xFF Reserved Reserved
          * 
    - * ただし、Contents Info Chunk のOption においては、どのタイプも 『,(0x2C)』 はOption のデリミタとし - * て定義しているため、エスケープキャラクタとしてのバックスラッシュ『\(0x5C)』 と合わせて使用する。 + * However, for all types of Option in Contents Info Chunk, ",(0x2C)" is defined as the Option delimiter, + * so it is used together with backslash "\(0x5C)" as an escape character. *
    -     *  表記 機能
    -     *  \, “,” を表す
    -     *  \\ \を表す
    -     *  \ 無視する
    +     *  Notation Function
    +     *  \,       represents “,”
    +     *  \\       represents "\"
    +     *  \        ignored
          * 
    - * デリミタを正しく識別出来ないことが想定される文字コードが設定されている場合にはContents Info - * Chunk のOption にデータを記述せず、Optional Data Chunk にデータを記述するものとする。 + * If a character code that is assumed to be unable to correctly identify the delimiter is set, + * data shall not be written in Option of Contents Info Chunk, but data shall be written in Optional Data Chunk. */ public void setContentsCodeType(int contentsCodeType) { this.contentsCodeType = contentsCodeType; @@ -146,12 +147,12 @@ public void setContentsCodeType(int contentsCodeType) { private int contentsType; /** - * コンテンツのタイプを表現する。 + * Represents the type of content. *
    -     * 0x00〜0x0F, 0x30〜0x33 着信メロディ
    -     * 0x10〜0x1F, 0x40〜0x42 カラオケ系
    -     * 0x20〜0x2F, 0x50〜0x53 CM 系
    -     * 上記以外の未使用値 Reserved
    +     * 0x00 ~ 0x0F, 0x30 ~ 0x33 ringtone melody
    +     * 0x10 ~ 0x1F, 0x40 ~ 0x42 karaoke type
    +     * 0x20 ~ 0x2F, 0x50 ~ 0x53 CM type
    +     * unused values other than the above reserved
          * 
    */ public void setContentsType(int contentsType) { @@ -162,13 +163,13 @@ public void setContentsType(int contentsType) { private int copyCounts; /** - * コピー回数を表現する。 + * Expresses the number of copies. *
          * Copy Counts Description
    -     * 0x00〜0xFE Copy Counts
    -     * 0xFF Copy Counts(255 以上)
    +     * 0x00 ~ 0xFE Copy Counts
    +     * 0xFF Copy Counts(255 or more)
          * 
    - * ※ コピー/移動が発生するたびに1カウント進める。 + * *increments the count by 1 each time a copy/move occurs. */ public void setCopyCounts(int copyCounts) { this.copyCounts = copyCounts; @@ -178,14 +179,14 @@ public void setCopyCounts(int copyCounts) { private int copyStatus; /** - * コンテンツの持つコピー定義を表現する。 + * Expresses the copy definition of the content. *
    -     *         | b7       | b6       | b5       | b4       | b3       | b2       | b1      |  b0
    -     * --------+----------+----------+----------+----------+----------+----------+---------+-----
    -     * 不可bit | Reserved | Reserved | Reserved | Reserved | Reserved | 編集     | 保存    | 転送
    +     *                | b7       | b6       | b5       | b4       | b3       | b2       | b1      |  b0
    +     * ---------------+----------+----------+----------+----------+----------+----------+---------+----------
    +     * impossible bit | Reserved | Reserved | Reserved | Reserved | Reserved | edit     | save    | transfer
          * 
    - * b0 は転送の可/不可、b1 は保存の可/不可b2 は編集の可/不可を定義する。(0:可 1:不可) - * Reserved bit は”1”で埋める。 + * b0 defines whether it can be transferred, b1 whether it can be saved or not, and b2 whether it can be edited. + * (0: Possible 1: Not possible) Reserved bit is filled with “1”. */ public void setCopyStatus(int copyStatus) { this.copyStatus = copyStatus; @@ -210,33 +211,33 @@ public String getSubDataByTag(String tag) { } /** - * Option (Contents Type 0x00, Contents Class 0x00 ~ 0xFF 用) + * Option (Contents Type 0x00, for Contents Class 0x00 ~ 0xFF) *

    - * ジャンル名、曲名、アーティスト名、作詞/作曲者名等を格納する。必ずしも表示に使用するものではなく、個 - * 別データの認識に使用するものである。 - * データは可変長とし、『タグ (2byte)』+『 : (0x3A)』+『Data』+『 , (0x2C)』で区切って記述する。タグ名を以 - * 下とする。タグは2byte 固定のバイト列とする。 - * 『Data』内において『 , (0x2C)』を文字として使用する場合 のエスケープキャラクタを§4.2.3に定義する。 + * Stores genre name, song title, artist name, lyricist/composer name, etc. + * It is not necessarily used for display, but for recognition of individual data. + * The data has a variable length and is written separated by "Tag(2byte)" + ":(0x3A)" + "Data" + ",(0x2C)". + * The tag name is as follows. The tag is a fixed 2-byte byte string. + * The escape character when using ",(0x2C)" as a character in "Data" is defined in §4.2.3. *

    *
    -     *  名称           | タグ名 | Hex
    -     * ----------------+--------+-----------
    -     *  ベンダー名     | VN     | 0x56 0x4E
    -     *  キャリア名     | CN     | 0x43 0x4E
    -     *  カテゴリー名   | CA     | 0x43 0x41
    -     *  曲名           | ST     | 0x53 0x54
    -     *  アーティスト名 | AN     | 0x41 0x4E
    -     *  作詞           | WW     | 0x57 0x57
    -     *  作曲           | SW     | 0x53 0x57
    -     *  編曲           | AW     | 0x41 0x57
    -     *  Copyright©     | CR     | 0x43 0x52
    -     *  管理者団体名   | GR     | 0x47 0x52
    -     *  管理情報       | MI     | 0x4D 0x49
    -     *  作成日時       | CD     | 0x43 0x44
    -     *  更新日時       | UD     | 0x55 0x44
    +     *  name               | tag name | Hex
    +     * --------------------+----------+-----------
    +     *  vendor name        | VN       | 0x56 0x4E
    +     *  carrier name       | CN       | 0x43 0x4E
    +     *  category name      | CA       | 0x43 0x41
    +     *  song title         | ST       | 0x53 0x54
    +     *  artist name        | AN       | 0x41 0x4E
    +     *  words writer       | WW       | 0x57 0x57
    +     *  song writer        | SW       | 0x53 0x57
    +     *  arrangement writer | AW       | 0x41 0x57
    +     *  copyright©    | CR       | 0x43 0x52
    +     *  group name         | GR       | 0x47 0x52
    +     *  management info    | MI       | 0x4D 0x49
    +     *  creation date      | CD       | 0x43 0x44
    +     *  update date        | UD       | 0x55 0x44
          * 
    - * Unicode の追加にあたり、Option 内のデリミタを識別できない文字コードが存在するため - * Optional Data Chunk を追加した。 + * when adding unicode, Optional Data Chunk was added because there are character codes + * that cannot identify the delimiter in option. */ public void addSubData(String tag, String data) { SubData subDatum; @@ -249,5 +250,3 @@ public void addSubData(String tag, String data) { size += subDatum.getSize(); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/DataChunk.java b/src/main/java/vavi/sound/smaf/chunk/DataChunk.java index 40e5c60..94a534b 100644 --- a/src/main/java/vavi/sound/smaf/chunk/DataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/DataChunk.java @@ -49,13 +49,13 @@ protected void init(MyDataInputStream dis, Chunk parent) throws InvalidSmafDataException, IOException { Debug.println(Level.FINER, "available: " + dis.available()); - while (dis.available() > 4) { // TODO 正常ファイルは 0 でいい + while (dis.available() > 4) { // TODO normal files should be 0. SubData subDatum = new SubData(dis); Debug.println(Level.FINE, subDatum); subData.put(subDatum.tag, subDatum); Debug.println(Level.FINER, "SubData: " + subDatum.tag + ", " + subDatum.data.length + ", " + dis.available()); } - dis.skipBytes(dis.available()); // TODO 正常ファイルなら必要なし + dis.skipBytes(dis.available()); // TODO not necessary if the file is normal } @Override @@ -112,8 +112,8 @@ public void setLanguageCode(int languageCode) { } /** - * 記述する文字コードがUnicode の場合、それぞれの文字群先頭にBOM (バイトオーダーマーク) を設定 - * すること。BOM 無しの場合、ビッグエンディアンとして解釈する。 + * if the character code to be written is Unicode, set a BOM (byte order mark) at the beginning of + * each character group. If there is no BOM, it will be interpreted as big endian. */ boolean isUnicode(int languageCode) { return languageCode >= 0x20 && languageCode <= 0x25; @@ -121,9 +121,9 @@ boolean isUnicode(int languageCode) { /** *
    -     * tag  2byte (固定)
    -     * size 2byte (固定)
    -     * data n byte (可変)
    +     * tag  2byte (fixed)
    +     * size 2byte (fixed)
    +     * data n byte (variable)
          * 
    */ class SubData { @@ -159,7 +159,7 @@ public int getSize() { return 2 + 2 + data.length; } - /** タグ */ + /** tag */ private String tag; /** Data */ @@ -191,5 +191,3 @@ public String toString() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/DisplayParameterDefinitionChunk.java b/src/main/java/vavi/sound/smaf/chunk/DisplayParameterDefinitionChunk.java index 75f95ed..d4b2ecb 100644 --- a/src/main/java/vavi/sound/smaf/chunk/DisplayParameterDefinitionChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/DisplayParameterDefinitionChunk.java @@ -104,33 +104,33 @@ public void writeTo(OutputStream os) { /** */ enum ParameterID { - /** フォントの種類 */ + /** font type */ FontType(0x01), - /** フォントのサイズ */ + /** font size */ FontSize(0x02), - /** 文字並び方向 */ + /** direction */ Direction(0x03), - /** 文字アトリビュート指定 将来拡張 */ + /** attribute future expansion */ Attribute(0x04), - /** 文字色 */ + /** font color */ FontColor0(0x10), - /** 色替え後文字色 */ + /** color after changed */ FontColor1(0x11), - /** 文字縁取り色 将来拡張 */ + /** text border color future expansion */ EdgeColor0(0x12), - /** 色替え後文字縁取り色 将来拡張 */ + /** text border color after color change future expansion */ EdgeColor1(0x13), - /** 文字背景色 */ + /** text background color */ BackColor0(0x14), - /** 色替え後文字背景色 */ + /** text background color after color change */ BackColor1(0x15), - /** デフォルトの座標指定方法 */ + /** default coordinate specification method */ Coordinates(0x20), - /** 背景色 Plane 0 指定色 */ + /** background color plane 0 specified color */ BackDropColor(0x30), - /** 透明色とする色を指定 */ + /** specify the color to be transparent */ TransparentColor(0x31), - /** 透明処理の有効フラグ */ + /** transparency processing enable flag */ TransparentEnable(0x32); /** */ final int value; @@ -149,5 +149,3 @@ static ParameterID valueOf(int value) { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/FileChunk.java b/src/main/java/vavi/sound/smaf/chunk/FileChunk.java index 71ca320..c40bff4 100644 --- a/src/main/java/vavi/sound/smaf/chunk/FileChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/FileChunk.java @@ -213,7 +213,7 @@ public void setMasterTrackChunk(MasterTrackChunk masterTrackChunk) { } /** - * Chunk Header 及び Body の Byte 列に対し、下記に示す割数で割り算した余り。(16 bit) + * the remainder when the Byte columns of Chunk Header and Body are divided by the divisor shown below. (16 bit) */ private int crc; @@ -222,5 +222,3 @@ public int getCrc() { return crc; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/GraphicsSetupDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/GraphicsSetupDataChunk.java index 2acadd4..21e8a6c 100644 --- a/src/main/java/vavi/sound/smaf/chunk/GraphicsSetupDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/GraphicsSetupDataChunk.java @@ -71,5 +71,3 @@ public void writeTo(OutputStream os) throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackChunk.java b/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackChunk.java index ae3b7e3..83f4cd2 100644 --- a/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackChunk.java @@ -33,7 +33,7 @@ * Color Type : 1byte * TimeBase : 1byte * Option Size : 1byte - * Option Data : Option Size で指定したサイズ(0〜255b) + * Option Data : size specified in Option Size (0 ~ 255b) *
  • * * @author Naohide Sano (nsano) @@ -108,7 +108,7 @@ public void writeTo(OutputStream os) throws IOException { /** * 0x00 Handy Phone Standard - * 0x01〜0xFF Reserved + * 0x01 ~ 0xFF Reserved */ private int playerType; /** */ @@ -116,7 +116,7 @@ public void writeTo(OutputStream os) throws IOException { /** * 0x00 Direct RGB:=3:3:2 * 0x01 Index Color - * 0x02〜FF Reserved + * 0x02 ~ FF Reserved */ private int colorType; @@ -182,5 +182,3 @@ public void writeTo(OutputStream os) throws IOException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackSequenceDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackSequenceDataChunk.java index 78a69ee..9f4d7aa 100644 --- a/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackSequenceDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/GraphicsTrackSequenceDataChunk.java @@ -124,5 +124,3 @@ protected void readHandyPhoneStandard(DataInputStream dis) } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/HuffmanDecodingInputStream.java b/src/main/java/vavi/sound/smaf/chunk/HuffmanDecodingInputStream.java index 645c1a4..603e393 100644 --- a/src/main/java/vavi/sound/smaf/chunk/HuffmanDecodingInputStream.java +++ b/src/main/java/vavi/sound/smaf/chunk/HuffmanDecodingInputStream.java @@ -17,7 +17,7 @@ /** * HuffmanDecodingInputStream. * - * TODO 出典 + * TODO source * TODO not work * * @author Naohide Sano (nsano) @@ -163,5 +163,3 @@ public int read(byte[] b, int offset, int length) throws IOException { return position; // TODO ??? } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ImageChunk.java b/src/main/java/vavi/sound/smaf/chunk/ImageChunk.java index ea3d499..6d7b6af 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ImageChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/ImageChunk.java @@ -73,5 +73,3 @@ public BufferedImage getImage() { public void writeTo(OutputStream os) throws IOException { } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ImageDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/ImageDataChunk.java index 5b5b516..5fa8242 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ImageDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/ImageDataChunk.java @@ -66,5 +66,3 @@ protected void init(MyDataInputStream dis, Chunk parent) public void writeTo(OutputStream os) throws IOException { } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/LinkChunk.java b/src/main/java/vavi/sound/smaf/chunk/LinkChunk.java index 9f18fe6..d1b8526 100644 --- a/src/main/java/vavi/sound/smaf/chunk/LinkChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/LinkChunk.java @@ -48,5 +48,3 @@ protected void init(MyDataInputStream dis, Chunk parent) public void writeTo(OutputStream os) throws IOException { } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/MasterTrackChunk.java b/src/main/java/vavi/sound/smaf/chunk/MasterTrackChunk.java index 096c511..2fff0d5 100644 --- a/src/main/java/vavi/sound/smaf/chunk/MasterTrackChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/MasterTrackChunk.java @@ -79,5 +79,3 @@ public List getSmafEvents() throws InvalidSmafDataException { return null; // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/MasterTrackSequenceDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/MasterTrackSequenceDataChunk.java index fd12151..7f69f2d 100644 --- a/src/main/java/vavi/sound/smaf/chunk/MasterTrackSequenceDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/MasterTrackSequenceDataChunk.java @@ -36,5 +36,3 @@ protected void init(MyDataInputStream dis, Chunk parent) dis.skipBytes((int) (long) size); // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/OptionalDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/OptionalDataChunk.java index 7b4af89..1a03281 100644 --- a/src/main/java/vavi/sound/smaf/chunk/OptionalDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/OptionalDataChunk.java @@ -93,5 +93,3 @@ public Chunk getProChunk() { // stop 4 bytes // ??? 4 bytes } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/PcmAudioTrackChunk.java b/src/main/java/vavi/sound/smaf/chunk/PcmAudioTrackChunk.java index aefc33c..ba78cd1 100644 --- a/src/main/java/vavi/sound/smaf/chunk/PcmAudioTrackChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/PcmAudioTrackChunk.java @@ -143,7 +143,7 @@ public void setSetupDataChunk(SetupDataChunk setupDataChunk) { /** */ private List waveDataChunks = new ArrayList<>(); - /** "Awa*" TODO ホンマに複数か? */ + /** "Awa*" TODO is there really more than one? */ public void addWaveDataChunk(Chunk waveDataChunk) { waveDataChunks.add(waveDataChunk); size += waveDataChunk.getSize() + 8; @@ -181,5 +181,3 @@ public List getSmafEvents() throws InvalidSmafDataException { return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/ScoreTrackChunk.java b/src/main/java/vavi/sound/smaf/chunk/ScoreTrackChunk.java index 72f2f14..32ab130 100644 --- a/src/main/java/vavi/sound/smaf/chunk/ScoreTrackChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/ScoreTrackChunk.java @@ -28,15 +28,15 @@ *
      * "MTR*"
      *
    - *  Format Type              : 1 byte (必須)
    - *  Sequence Type            : 1 byte (必須)
    - *  TimeBase_D               : 1 byte (必須)
    - *  TimeBase_G               : 1 byte (必須)
    - *  Channel Status           : n byte (必須)(Format Type に依存)
    - *  Seek & Phrase Info Chunk : n byte (Option)
    - *  Setup Data Chunk         : n byte (Option)
    - *  Sequence Data Chunk      : n byte (必須)
    - *  Stream PCM Data Chunk    : n byte (Option) (Format Type = "Mobile Standard" の場合のみ)
    + *  Format Type              : 1 byte (required)
    + *  Sequence Type            : 1 byte (required)
    + *  TimeBase_D               : 1 byte (required)
    + *  TimeBase_G               : 1 byte (required)
    + *  Channel Status           : n byte (required)(dependence on Format Type)
    + *  Seek & Phrase Info Chunk : n byte (option)
    + *  Setup Data Chunk         : n byte (option)
    + *  Sequence Data Chunk      : n byte (required)
    + *  Stream PCM Data Chunk    : n byte (option) (only for Format Type = "Mobile Standard")
      * 
    * @author Naohide Sano (nsano) * @version 0.00 041222 nsano initial version
    @@ -225,5 +225,3 @@ public List getSmafEvents() throws InvalidSmafDataException { return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/SeekAndPhraseInfoChunk.java b/src/main/java/vavi/sound/smaf/chunk/SeekAndPhraseInfoChunk.java index b4820f5..869cc36 100644 --- a/src/main/java/vavi/sound/smaf/chunk/SeekAndPhraseInfoChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/SeekAndPhraseInfoChunk.java @@ -129,5 +129,3 @@ public List getSubSequenceList() { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/SequenceDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/SequenceDataChunk.java index 0c52861..dd362d3 100644 --- a/src/main/java/vavi/sound/smaf/chunk/SequenceDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/SequenceDataChunk.java @@ -102,7 +102,7 @@ protected void init(MyDataInputStream dis, Chunk parent) /** * internal use - * Mtsq の場合 + * for Mtsq * @param gateTime should not be 0 */ protected SmafMessage getHandyPhoneStandardMessage(int duration, int data, int gateTime) { @@ -257,38 +257,38 @@ private void readMobileStandard(MyDataInputStream dis) int control = dis.readUnsignedByte(); int value = dis.readUnsignedByte(); switch (control) { // TODO no specification - case 0x00: // バンクセレクト MSB + case 0x00: // bank select MSB smafMessage = new BankSelectMessage(duration, channel, value, BankSelectMessage.Significant.Least); break; - case 0x20: // バンクセレクト LSB + case 0x20: // bank select LSB smafMessage = new BankSelectMessage(duration, channel, value, BankSelectMessage.Significant.Most); break; - case 0x01: // モジュレーションデプス MSB + case 0x01: // modulation depth MSB smafMessage = new ModulationMessage(duration, channel, value); break; - case 0x07: // メインボリューム MSB + case 0x07: // main volume MSB smafMessage = new VolumeMessage(duration, channel, value); break; - case 0x0a: // パンポット MSB + case 0x0a: // pan pot MSB smafMessage = new PanMessage(duration, channel, value); break; - case 0x0b: // エクスプレッション MSB + case 0x0b: // expression MSB smafMessage = new ExpressionMessage(duration, channel, value); break; - case 0x06: // データエントリー MSB - case 0x26: // データエントリー LSB - case 0x40: // ホールド 1 (ダンパー) - case 0x47: // フィルタ・レゾナンス MA-5 - case 0x4a: // ブライトネス MA-5 + case 0x06: // data entry MSB + case 0x26: // data entry LSB + case 0x40: // hold 1 (dumper) + case 0x47: // filter resonance MA-5 + case 0x4a: // brightness MA-5 case 0x64: // RPN LSB - // value = 00 のみ? ピッチ・ベンド・センシティビティ + // only when value = 00 ? pitch bend sensitivity case 0x65: // RPN MSB - // value = 00 のみ? ピッチ・ベンド・センシティビティ - case 0x78: // オール・サウンド・オフ - case 0x79: // リセットオールコントローラー - case 0x7b: // オール・ノート・オフ MA-5 - case 0x7e: // モノ・モード・オン - case 0x7f: // ポリ・モード・オン (MA-3 のみ) + // only when value = 00 ? pitch bend sensitivity + case 0x78: // all sound off + case 0x79: // reset all controllers + case 0x7b: // all notes off MA-5 + case 0x7e: // mono mode on + case 0x7f: // poly mode on (MA-3 only) smafMessage = new MidiConvertibleMessage(duration, control, channel, value); break; default: @@ -384,5 +384,3 @@ public void addSmafMessage(SmafMessage smafMessage) { size += smafMessage.getLength(); // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/SetupDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/SetupDataChunk.java index 0c9f072..0b22601 100644 --- a/src/main/java/vavi/sound/smaf/chunk/SetupDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/SetupDataChunk.java @@ -158,5 +158,3 @@ public List getSmafMessages() { return messages; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/StreamPcmDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/StreamPcmDataChunk.java index 931f562..935a8d5 100644 --- a/src/main/java/vavi/sound/smaf/chunk/StreamPcmDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/StreamPcmDataChunk.java @@ -86,5 +86,3 @@ public List getSmafMessages() { return messages; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/StreamWaveDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/StreamWaveDataChunk.java index 8b693bf..3019209 100644 --- a/src/main/java/vavi/sound/smaf/chunk/StreamWaveDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/StreamWaveDataChunk.java @@ -65,5 +65,3 @@ SmafMessage toSmafMessage() { return waveDataMessage; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/SubData.java b/src/main/java/vavi/sound/smaf/chunk/SubData.java index 6a6f5f0..ebf2592 100644 --- a/src/main/java/vavi/sound/smaf/chunk/SubData.java +++ b/src/main/java/vavi/sound/smaf/chunk/SubData.java @@ -40,7 +40,7 @@ class SubData { this(buffer, offset, 0); // TODO 0 ? } - /** TODO 文字コードとか */ + /** TODO about charset */ SubData(byte[] buffer, int offset, int contentsCodeType) throws IOException { this.contentsCodeType = contentsCodeType; @@ -91,7 +91,7 @@ public int getSize() { /** */ private String tag; - /** タグ */ + /** tag */ public String getTag() { return tag; } @@ -114,5 +114,3 @@ public String toString() { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/TrackChunk.java b/src/main/java/vavi/sound/smaf/chunk/TrackChunk.java index a0ca77b..4251c75 100644 --- a/src/main/java/vavi/sound/smaf/chunk/TrackChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/TrackChunk.java @@ -57,7 +57,7 @@ public void setTrackNumber(int trackNumber) { public enum FormatType { /** */ HandyPhoneStandard(2, false), - /** ハフマン符号化による圧縮を行う */ + /** perform compression using Huffman encoding */ MobileStandard_Compress(16, true), /** */ MobileStandard_NoCompress(16, false), @@ -85,9 +85,9 @@ public FormatType getFormatType() { } /** - * このステータスでこの Track Chunk の実フォーマットを定義する。データ・サイズ削減のため、LSI - * Native Format での記述や、将来パワフルな Control CPU を想定して、その他のシーケンス・フォーマ - * ットを記述可能とする。Compress はハフマン符号化による圧縮を行うことと定める。 + * This status defines the actual format of this Track Chunk. To reduce data size, it is possible to write in + * LSI Native Format and other sequence formats assuming a powerful Control CPU in the future. + * Compress specifies that compression is performed using Huffman encoding. */ public void setFormatType(FormatType formatType) { this.formatType = formatType; @@ -96,13 +96,13 @@ public void setFormatType(FormatType formatType) { /** */ public enum SequenceType { /** - * Sequence Data は1つの連続したシーケンス・データである。Seek Point や Phrase List はシーケン - * ス中の意味のある位置を外部から参照する目的で利用する。 + * Sequence Data is one continuous sequence data. Seek Point and Phrase List are used to refer to + * meaningful positions in a sequence from the outside. */ StreamSequence, /** - * Sequence Data は複数のフレーズデータを連続で表記したものである。Phrase List は外部から個 - * 別フレーズを認識する為に用いる。 + * Sequence Data is a continuous representation of multiple phrase data. Phrase List is used to + * recognize individual phrases from the outside. */ SubSequence } @@ -128,12 +128,12 @@ public void setSequenceType(SequenceType sequenceType) { * 0x01 2 msec * 0x02 4 msec * 0x03 5 msec - * 0x04〜0x0F Reserved + * 0x04 ~ 0x0F Reserved * 0x10 10 msec * 0x11 20 msec * 0x12 40 msec * 0x13 50 msec - * 0x14〜0xFF Reserved + * 0x14 ~ 0xFF Reserved * - *
    * @param timeBase real timeBase [msec] @@ -159,7 +159,7 @@ public int getDurationTimeBase() { } /** - * Timebase_D と Timebase_G は同一であること。 + * Timebase_D and Timebase_G must be the same. * @param durationTimeBase in [msec] * @throws IllegalArgumentException wrong durationTimeBase */ @@ -196,11 +196,9 @@ public void setSequenceDataChunk(SequenceDataChunk sequenceDataChunk) { } /** - * 先頭に MetaMessage (META_MACHINE_DEPEND) が入る。 - * TrackChunk の情報を Properties で保持している。 + * MetaMessage (META_MACHINE_DEPEND) is placed at the beginning. + * TrackChunk information is maintained in Properties. */ public abstract List getSmafEvents() throws InvalidSmafDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/UndefinedChunk.java b/src/main/java/vavi/sound/smaf/chunk/UndefinedChunk.java index 30ed1d2..4e802e4 100644 --- a/src/main/java/vavi/sound/smaf/chunk/UndefinedChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/UndefinedChunk.java @@ -49,5 +49,3 @@ public void writeTo(OutputStream os) throws IOException { Debug.println(Level.WARNING, "not implemented skip"); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/WaveDataChunk.java b/src/main/java/vavi/sound/smaf/chunk/WaveDataChunk.java index 6232b24..c7aabe6 100644 --- a/src/main/java/vavi/sound/smaf/chunk/WaveDataChunk.java +++ b/src/main/java/vavi/sound/smaf/chunk/WaveDataChunk.java @@ -100,5 +100,3 @@ SmafMessage toSmafMessage(WaveType waveType) { return waveDataMessage; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/chunk/WaveType.java b/src/main/java/vavi/sound/smaf/chunk/WaveType.java index e446cd2..b7fb891 100644 --- a/src/main/java/vavi/sound/smaf/chunk/WaveType.java +++ b/src/main/java/vavi/sound/smaf/chunk/WaveType.java @@ -37,7 +37,7 @@ public class WaveType { private int waveChannels; /** - * TODO チャンクで数値が違う enum で解消? + * TODO different numbers in chunks, can it be solved with enum? * "Awa*" *
          * 0x0 Signed
    @@ -51,7 +51,7 @@ public class WaveType {
          * 0x1 Offset Binary PCM
          * 0x2 ADPCM(YAMAHA)
          * 
    - * とりあえず共通で + * using common number for now *
          * 0 Signed
          * 1 ADPCM
    @@ -188,5 +188,3 @@ public String toString() {
                 " (waveType: " + String.format("%04x", intValue()) + ")";
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/BankSelectMessage.java b/src/main/java/vavi/sound/smaf/message/BankSelectMessage.java
    index 9976237..270ef4b 100644
    --- a/src/main/java/vavi/sound/smaf/message/BankSelectMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/BankSelectMessage.java
    @@ -145,14 +145,14 @@ public MidiEvent[] getMidiEvents(MidiContext context)
                     ShortMessage shortMessage = new ShortMessage();
                     shortMessage.setMessage(ShortMessage.CONTROL_CHANGE,
                                             midiChannel,
    -                                        0x00,       // バンクセレクト MSB
    +                                        0x00,       // bank select MSB
                                             data2);
                     events[0] = new MidiEvent(shortMessage, context.getCurrentTick());
     
                     shortMessage = new ShortMessage();
                     shortMessage.setMessage(ShortMessage.CONTROL_CHANGE,
                                             midiChannel,
    -                                        0x20,       // バンクセレクト LSB
    +                                        0x20,       // bank select LSB
                                             bank & 0x7f);
                     events[1] = new MidiEvent(shortMessage, context.getCurrentTick());
     
    @@ -165,7 +165,7 @@ public MidiEvent[] getMidiEvents(MidiContext context)
                 ShortMessage shortMessage = new ShortMessage();
                 shortMessage.setMessage(ShortMessage.CONTROL_CHANGE,
                                         midiChannel,
    -                                    significant.data1,  // バンクセレクト MSB or LSB
    +                                    significant.data1,  // bank select MSB or LSB
                                         bank);
                 return new MidiEvent[] {
                     new MidiEvent(shortMessage, context.getCurrentTick())
    @@ -197,5 +197,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
             };
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/EndOfSequenceMessage.java b/src/main/java/vavi/sound/smaf/message/EndOfSequenceMessage.java
    index c352bfe..dc8ffa9 100644
    --- a/src/main/java/vavi/sound/smaf/message/EndOfSequenceMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/EndOfSequenceMessage.java
    @@ -81,7 +81,7 @@ public int getLength() {
             return getMessage().length;
         }
     
    -    /** NOP 等の対策で EOT の tick をカウントしたものに設定する。 */
    +    /** Set the EOT ticks to be counted using countermeasures such as NOP. */
         @Override
         public MidiEvent[] getMidiEvents(MidiContext context) {
             javax.sound.midi.Track midiTrack = context.getMidiTrack();
    @@ -93,8 +93,8 @@ public MidiEvent[] getMidiEvents(MidiContext context) {
         }
     
         /**
    -     * @return このメソッドの戻り値のみ SMAF トラック 0 ~ 3 の EndOfSequenceMessage の
    -     * SmafEvent になる。トラックがない場合は null が入っている
    +     * @return The only return value of this method is the SmafEvent of EndOfSequenceMessage for SMAF tracks 0 to 3.
    +     *         Contains null if there is no track.
          */
         @Override
         public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) {
    @@ -116,5 +116,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) {
             return smafEvents;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/ExpressionMessage.java b/src/main/java/vavi/sound/smaf/message/ExpressionMessage.java
    index 459a10a..09f77ac 100644
    --- a/src/main/java/vavi/sound/smaf/message/ExpressionMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/ExpressionMessage.java
    @@ -98,7 +98,7 @@ public MidiEvent[] getMidiEvents(MidiContext context)
     //Debug.println("Expression: [" + duration + "] " + channel + "ch, " + volume);
             shortMessage.setMessage(ShortMessage.CONTROL_CHANGE,
                                     midiChannel,
    -                                11,    // エクスプレッション MSB
    +                                11,    // expression MSB
                                     volume);
             events[0] = new MidiEvent(shortMessage, context.getCurrentTick());
             return events;
    @@ -126,5 +126,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
             };
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/MachineDependentMessage.java b/src/main/java/vavi/sound/smaf/message/MachineDependentMessage.java
    index 683406c..e799e48 100644
    --- a/src/main/java/vavi/sound/smaf/message/MachineDependentMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/MachineDependentMessage.java
    @@ -18,5 +18,3 @@
     public abstract class MachineDependentMessage extends SysexMessage {
     
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/MidiContext.java b/src/main/java/vavi/sound/smaf/message/MidiContext.java
    index 47b45cc..5d432a5 100644
    --- a/src/main/java/vavi/sound/smaf/message/MidiContext.java
    +++ b/src/main/java/vavi/sound/smaf/message/MidiContext.java
    @@ -6,6 +6,7 @@
     
     package vavi.sound.smaf.message;
     
    +import java.util.Arrays;
     import java.util.logging.Level;
     import javax.sound.midi.InvalidMidiDataException;
     import javax.sound.midi.MetaMessage;
    @@ -33,17 +34,17 @@ public class MidiContext {
         /** Max MIDI channels */
         public static final int MAX_MIDI_CHANNELS = 16;
     
    -    /** チャンネルコンフィギュレーション */
    +    /** channel configuration */
         public enum ChannelConfiguration {
    -        /** リズム */
    +        /** rhythm */
             PERCUSSION,
    -        /** その他 */
    +        /** others */
             SOUND_SET,
    -        /** 未使用 */
    +        /** unused */
             UNUSED
         }
     
    -    /** channel 9 はデフォルトでリズム */
    +    /** channel 9 defaults to rhythm */
         public static final int CHANNEL_DRUM = 9;
     
         /** */
    @@ -126,7 +127,7 @@ private ChannelConfiguration toChannelConfiguration(int midiChannel, ChannelStat
             }
         }
     
    -    /** 現在のトラック No. */
    +    /** current track no. */
         private int smafTrackNumber;
     
         /** */
    @@ -139,7 +140,7 @@ public void setSmafTrackNumber(int smafTrackNumber) {
             this.smafTrackNumber = smafTrackNumber;
         }
     
    -    /** 現在の ticks, index is smafTrackNumber */
    +    /** current ticks, index is smafTrackNumber */
         private long[] currentTicks = new long[4];
     
         /**
    @@ -166,22 +167,20 @@ public void addCurrentTick(long ticks) {
             this.currentTicks[smafTrackNumber] += ticks;
         }
     
    -    /** channel がリズムかどうか, index is pseudo MIDI channel */
    +    /** whether channel is for rhythm, index is pseudo MIDI channel */
         private ChannelConfiguration[] drums = new ChannelConfiguration[MAX_MIDI_CHANNELS];
     
         /** index is pseudo MIDI channel */
         private int[] velocities = new int[MAX_MIDI_CHANNELS];
     
         /* init */ {
    -        for (int i = 0; i < MAX_MIDI_CHANNELS; i++) {
    -            drums[i] = ChannelConfiguration.UNUSED;
    -        }
    +        Arrays.fill(drums, ChannelConfiguration.UNUSED);
         }
     
         /** */
         private static final int CHANNEL_UNUSED = -1;
     
    -    /** DRUM_CHANNEL がリズムでない場合の交換先チャンネル */
    +    /** replacement channel if DRUM_CHANNEL is not a rhythm */
         private int drumSwapChannel = CHANNEL_UNUSED;
     
         /**
    @@ -206,7 +205,7 @@ public void setDrum(int smafChannel, ChannelConfiguration value) {
     //Debug.println("temporary: " + midiChannel + ", " + value);
             }
     
    -        // DRUM_CHANNEL がリズムでなければ空いてる channel と交換
    +        // if DRUM_CHANNEL is not a rhythm, replace it with an empty channel.
             if (midiChannel == CHANNEL_DRUM && drums[CHANNEL_DRUM] == ChannelConfiguration.SOUND_SET && drumSwapChannel == CHANNEL_UNUSED) {
                 for (int k = MAX_MIDI_CHANNELS - 1; k >= 0; k--) {
                     if (k != CHANNEL_DRUM && drums[k] == ChannelConfiguration.UNUSED) {
    @@ -233,7 +232,7 @@ public void setDrum(int smafChannel, ChannelConfiguration value) {
     }
         }
     
    -    /** channel に割り当てられた program no, index is pseudo MIDI channel */
    +    /** program no, index is pseudo MIDI channel assigned to channel */
         private int[] programs = new int[MAX_MIDI_CHANNELS];
     
         /**
    @@ -253,7 +252,7 @@ private int getMidiChannel(int smafChannel) {
     
         /**
          * @param smafChannel SMAF channel
    -     * @return ドラム置き換え後のチャンネル (real MIDI channel)
    +     * @return channel after drum replacement (real MIDI channel)
          */
         public int setProgram(int smafChannel, int program) {
             int midiChannel = getMidiChannel(smafChannel);
    @@ -284,7 +283,7 @@ public int getProgram(int smafChannel) {
     
         /**
          * @param smafChannel SMAF channel
    -     * @return ドラム置き換え後のチャンネル (real MIDI channel)
    +     * @return channel after drum replacement (real MIDI channel)
          * @see #drums
          */
         public int retrieveChannel(int smafChannel) {
    @@ -294,12 +293,12 @@ public int retrieveChannel(int smafChannel) {
     //Debug.println("used swapped channel: " + midiChannel);
     //        }
     
    -        // ドラムのチャンネルがサウンドとして使用されている
    +        // drum channel is used as sound
             if (midiChannel == CHANNEL_DRUM && drums[CHANNEL_DRUM] == ChannelConfiguration.SOUND_SET) {
                 midiChannel = drumSwapChannel;
             }
     
    -        // パーカッション指定はすべて MIDI ドラムチャネルに
    +        // all percussion specifications go to MIDI drum channels
             if (drums[midiChannel] == ChannelConfiguration.PERCUSSION) {
                 midiChannel = CHANNEL_DRUM;
             }
    @@ -360,20 +359,20 @@ public int retrievePitch(int smafChannel, int pitch) {
          *  0x02         | +2 Octave
          *  0x03         | +3 Octave
          *  0x04         | +4 Octave
    -     *  0x05 〜 0x80 | Reserved
    +     *  0x05  ~  0x80 | Reserved
          *  0x81         | -1 Octave
          *  0x82         | -2 Octave
          *  0x83         | -3 Octave
          *  0x84         | -4 Octave
    -     *  0x85 〜 0xFF | Reserved
    +     *  0x85  ~  0xFF | Reserved
          * 
    * @see OctaveShiftMessage */ private int[] octaveShifts = new int[MAX_MIDI_CHANNELS]; /** - * @param smafChannel - * @param octaveShift + * @param smafChannel channel + * @param octaveShift octave shift * @see OctaveShiftMessage * @see #octaveShifts */ @@ -384,8 +383,8 @@ public void setOctaveShift(int smafChannel, int octaveShift) { } /** - * @param smafChannel - * @param velocity + * @param smafChannel channel + * @param velocity velocity * @see NoteMessage * @see #velocities */ @@ -393,11 +392,11 @@ public int setVelocity(int smafChannel, int velocity) { int midiChannel = getMidiChannel(smafChannel); velocities[midiChannel] = velocity; //Debug.println("velocities[" + mididChannel + "]: " + octaveShift); - return velocity; // TODO う〜ん + return velocity; // TODO mhh... } /** - * @param smafChannel + * @param smafChannel channel * @see NoteMessage * @see #velocities */ @@ -409,8 +408,8 @@ public int getVelocity(int smafChannel) { //---- /** - * index is MA1レジスタ値 - * TODO どうつかうの? + * index is MA1 register value + * TODO how to use it? * @see "SscMA1_Gl110-j.pdf" */ private static final int[] tempoTable = { @@ -485,7 +484,7 @@ public int getVelocity(int smafChannel) { Debug.println(Level.FINE, "tempoTable: " + tempoTable.length); } - /** テンポの指定がない場合、SSDは 4 分音符 = 120 として扱います */ + /** if no tempo is specified, SSD will treat it as a quarter note = 120 */ private static final int tempo = 120; /** */ @@ -550,5 +549,3 @@ public int getResolution(Track[] smafTracks) return 120; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/MidiConvertible.java b/src/main/java/vavi/sound/smaf/message/MidiConvertible.java index f408ff0..6e92c42 100644 --- a/src/main/java/vavi/sound/smaf/message/MidiConvertible.java +++ b/src/main/java/vavi/sound/smaf/message/MidiConvertible.java @@ -22,5 +22,3 @@ public interface MidiConvertible { MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/MidiConvertibleMessage.java b/src/main/java/vavi/sound/smaf/message/MidiConvertibleMessage.java index 80c95c8..92559cb 100644 --- a/src/main/java/vavi/sound/smaf/message/MidiConvertibleMessage.java +++ b/src/main/java/vavi/sound/smaf/message/MidiConvertibleMessage.java @@ -14,7 +14,7 @@ /** * MidiConvertibleMessage. *

    - * CONTROL_CHANGE をすべて扱う + * handle all CONTROL_CHANGE *

    * * @author Naohide Sano (nsano) @@ -33,10 +33,10 @@ public class MidiConvertibleMessage extends vavi.sound.smaf.ShortMessage private int value; /** - * @param duration - * @param command + * @param duration duration + * @param command command * @param channel smaf channel - * @param value + * @param value value */ public MidiConvertibleMessage(int duration, int command, int channel, int value) { this.duration = duration; @@ -77,13 +77,11 @@ public String toString() { //---- - /* */ @Override public byte[] getMessage() { return null; // TODO } - /* */ @Override public int getLength() { return 0; // TODO @@ -104,5 +102,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce return events; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/ModulationMessage.java b/src/main/java/vavi/sound/smaf/message/ModulationMessage.java index f3a085c..77ee1d3 100644 --- a/src/main/java/vavi/sound/smaf/message/ModulationMessage.java +++ b/src/main/java/vavi/sound/smaf/message/ModulationMessage.java @@ -97,7 +97,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, midiChannel, - 1, // モジュレーション・デプス MSB + 1, // modulation depth MSB modulation); events[0] = new MidiEvent(shortMessage, context.getCurrentTick()); return events; @@ -126,5 +126,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/NonRealtimeUniversalSysexMessage.java b/src/main/java/vavi/sound/smaf/message/NonRealtimeUniversalSysexMessage.java index f13548c..4ddbbaf 100644 --- a/src/main/java/vavi/sound/smaf/message/NonRealtimeUniversalSysexMessage.java +++ b/src/main/java/vavi/sound/smaf/message/NonRealtimeUniversalSysexMessage.java @@ -18,44 +18,44 @@ *
      *  0xf0
      *  0xfe
    - *  SUB-ID#1 | SUB-ID#2   | はたらき
    + *  SUB-ID#1 | SUB-ID#2   | function
      *  ---------|------------|-----------------------
    - *   00H     | --         | 未使用
    + *   00H     | --         | unused
      *   01H     | (not used) | Sample Dump Header
      *   02H     | (not used) | Sample Data Packet
      *   03H     | (not used) | Sample Dump Request
      *   04H     | nn         | MIDI Time Code
    - *           | 00H       |  Special
    + *           | 00H        |  Special
      *           | 01H        |  Punch In Points
      *           | 02H        |  Punch Out Points
      *           | 03H        |  Delete Punch In Point
    - *           | 04H       |  Delete Punch Out Point
    - *           | 05H       |  Event Start Point
    - *           | 06H       |  Event Stop Point
    - *           | 07H       |  Event Start Points with additional info.
    - *           | 08H       |  Event Stop Points with additional info.
    - *           | 09H       |  Delete Event Start Point
    - *           | 0AH       |  Delete Event Stop Point
    - *           | 0BH       |  Cue Points
    + *           | 04H        |  Delete Punch Out Point
    + *           | 05H        |  Event Start Point
    + *           | 06H        |  Event Stop Point
    + *           | 07H        |  Event Start Points with additional info.
    + *           | 08H        |  Event Stop Points with additional info.
    + *           | 09H        |  Delete Event Start Point
    + *           | 0AH        |  Delete Event Stop Point
    + *           | 0BH        |  Cue Points
      *           | 0CH        |  Cue Points with additional info.
      *           | 0DH        |  Delete Cue Point
    - *           | 0EH       |  Event Name in additional info.
    + *           | 0EH        |  Event Name in additional info.
      *   05H     | nn         | Sample Dump Extensions
    - *           | 01H       |  Multiple Loop Points
    - *           | 02H       |  Loop Points Request
    + *           | 01H        |  Multiple Loop Points
    + *           | 02H        |  Loop Points Request
      *   06H     | nn         | General Information
    - *           | 01H       |  Identity Request
    - *           | 02H       |  Identity Reply
    + *           | 01H        |  Identity Request
    + *           | 02H        |  Identity Reply
      *   07H     | nn         | File Dump
    - *           | 01H       |  Header
    - *           | 02H       |  Data Packet
    - *           | 03H       |  Request
    + *           | 01H        |  Header
    + *           | 02H        |  Data Packet
    + *           | 03H        |  Request
      *   08H     | nn         | MIDI Tuning Standard
    - *           | 00H       |  Bulk Dump Request
    - *           | 01H       |  Bulk Dump Reply
    + *           | 00H        |  Bulk Dump Request
    + *           | 01H        |  Bulk Dump Reply
      *   09H     | nn         | General MIDI
      *           | 01H        |  General MIDI System On
    - *           | 02H       |  General MIDI System Off
    + *           | 02H        |  General MIDI System Off
      *   7BH     | (not used) | End Of File
      *   7CH     | (not used) | Wait
      *   7DH     | (not used) | Cancel
    @@ -69,5 +69,3 @@
     public class NonRealtimeUniversalSysexMessage extends SysexMessage {
     
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/NopMessage.java b/src/main/java/vavi/sound/smaf/message/NopMessage.java
    index 4a4035a..07e653c 100644
    --- a/src/main/java/vavi/sound/smaf/message/NopMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/NopMessage.java
    @@ -85,5 +85,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) {
             return null;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/NoteMessage.java b/src/main/java/vavi/sound/smaf/message/NoteMessage.java
    index b2168e6..ebdeb61 100644
    --- a/src/main/java/vavi/sound/smaf/message/NoteMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/NoteMessage.java
    @@ -28,20 +28,20 @@
     public class NoteMessage extends SmafMessage
         implements MidiConvertible {
     
    -    /** 音階 */
    +    /** note */
         private int note;
     
         /** smaf channel */
         private int channel;
     
    -    /** 音長 (!= 0) */
    +    /** note length (!= 0) */
         private int gateTime;
     
         /** 0 ~ 127 */
         private int velocity;
     
         /**
    -     * オクターブ
    +     * Octave
          * 
          * 01 Low
          * 00 Mid Low
    @@ -101,8 +101,8 @@ protected NoteMessage() {
         }
     
         /**
    -     * 音階を取得します.
    -     * @return 音階
    +     * Gets a note.
    +     * @return note
          */
         public int getNote() {
             switch (octave) {
    @@ -120,8 +120,8 @@ public int getNote() {
         }
     
         /**
    -     * 音階を設定します.
    -     * @param note SMAF の音階
    +     * Sets a note.
    +     * @param note SMAF note
          */
         public void setNote(int note) {
             if (octave != -1) {
    @@ -144,32 +144,32 @@ public void setNote(int note) {
         }
     
         /**
    -     * ボイスナンバを取得します.
    -     * @return ボイスナンバ
    +     * Gets voice number.
    +     * @return voice number
          */
         public int getChannel() {
             return channel;
         }
     
         /**
    -     * ボイスナンバを設定します.
    -     * @param channel ボイスナンバ
    +     * Sets voice number.
    +     * @param channel voce number
          */
         public void setChannel(int channel) {
             this.channel = channel & 0x03;
         }
     
         /**
    -     * 音長を取得します.
    -     * @return 音長
    +     * Gets note length.
    +     * @return note length
          */
         public int getGateTime() {
             return gateTime;
         }
     
         /**
    -     * 音長を設定します.
    -     * @param gateTime 音長
    +     * Sets note length.
    +     * @param gateTime note length
          */
         public void setGateTime(int gateTime) {
             this.gateTime = gateTime;
    @@ -198,13 +198,11 @@ public String toString() {
                 " velocity=" + String.format("%04x", velocity);
         }
     
    -    /* */
         @Override
         public byte[] getMessage() {
             return null; // TODO
         }
     
    -    /* */
         @Override
         public int getLength() {
             return 0;   // TODO
    @@ -248,8 +246,9 @@ public MidiEvent[] getMidiEvents(MidiContext context)
         }
     
         /**
    -     * TODO Δタイムが、直前の同ボイス、同キーの NoteMessage のゲートタイムより小さい場合は直前の NoteMessage からの継続音とする
    -     * TODO 次の音まで余裕があったら伸ばして、無かったら切る?(未実装)
    +     * TODO if the Δ time is smaller than the gate time of the previous NoteMessage of the same voice and same key,
    +     *      it will be the continuation sound from the previous NoteMessage.
    +     * TODO if there is room for the next note, do you extend it, and if there is not, cut it? (unimplemented)
          */
         public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
             throws InvalidSmafDataException {
    @@ -262,7 +261,7 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
     //Debug.println(midiEvent.getTick() + ", " + channel + ", " + command + ", " + (context.retrievePitch(channel, data1) + 45) + ", " + (data2 / 2));
     
             if (command == ShortMessage.NOTE_OFF ||
    -            // note on で velocity 0 の場合
    +            // note on with velocity 0
                 (command == ShortMessage.NOTE_ON && data2 == 0)) {
     
                 if (!context.isNoteOffEventUsed()) {
    @@ -309,7 +308,6 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
     if (smafEvents[i] == null) {
      Debug.println(Level.FINE, "[" + i + "]: " + smafEvents[i]);
     }
    -
                     if (i == 0) {
                         context.setBeforeTick(track, midiEvent.getTick());
                         break;
    @@ -322,5 +320,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context)
             }
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/OctaveShiftMessage.java b/src/main/java/vavi/sound/smaf/message/OctaveShiftMessage.java
    index 4302c06..28fcac6 100644
    --- a/src/main/java/vavi/sound/smaf/message/OctaveShiftMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/OctaveShiftMessage.java
    @@ -31,12 +31,12 @@ public class OctaveShiftMessage extends vavi.sound.smaf.ShortMessage
          * 0x02 +2 Octave
          * 0x03 +3 Octave
          * 0x04 +4 Octave
    -     * 0x05〜0x80 Reserved
    +     * 0x05 ~ 0x80 Reserved
          * 0x81 -1 Octave
          * 0x82 -2 Octave
          * 0x83 -3 Octave
          * 0x84 -4 Octave
    -     * 0x85〜0xff Reserved
    +     * 0x85 ~ 0xff Reserved
          * 
    */ private int octaveShift; @@ -93,5 +93,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) { return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/PanMessage.java b/src/main/java/vavi/sound/smaf/message/PanMessage.java index 31dc0e8..5c40802 100644 --- a/src/main/java/vavi/sound/smaf/message/PanMessage.java +++ b/src/main/java/vavi/sound/smaf/message/PanMessage.java @@ -97,7 +97,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, midiChannel, - 10, // パンポット MSB + 10, // pan pot MSB panpot); events[0] = new MidiEvent(shortMessage, context.getCurrentTick()); return events; @@ -126,5 +126,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/PitchBendMessage.java b/src/main/java/vavi/sound/smaf/message/PitchBendMessage.java index 6b3cf01..ea322ea 100644 --- a/src/main/java/vavi/sound/smaf/message/PitchBendMessage.java +++ b/src/main/java/vavi/sound/smaf/message/PitchBendMessage.java @@ -89,7 +89,7 @@ public int getLength() { } /** - * PsmPlayer がこう変換していたからしょうがない。 + * because PsmPlayer converted it like this. */ @Override public MidiEvent[] getMidiEvents(MidiContext context) @@ -130,5 +130,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/ProgramChangeMessage.java b/src/main/java/vavi/sound/smaf/message/ProgramChangeMessage.java index 57d7b94..d3a2082 100644 --- a/src/main/java/vavi/sound/smaf/message/ProgramChangeMessage.java +++ b/src/main/java/vavi/sound/smaf/message/ProgramChangeMessage.java @@ -136,5 +136,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/RealtimeUniversalSysexMessage.java b/src/main/java/vavi/sound/smaf/message/RealtimeUniversalSysexMessage.java index 911b0a8..e2a575e 100644 --- a/src/main/java/vavi/sound/smaf/message/RealtimeUniversalSysexMessage.java +++ b/src/main/java/vavi/sound/smaf/message/RealtimeUniversalSysexMessage.java @@ -18,44 +18,44 @@ *
      *  0xf0
      *  0xff
    - *  SUB-ID#1 | SUB-ID#2 | はたらき
    - *  ---------+----------+------------------------------------------
    - *   00H     | --       | 未使用
    - *   01H     | nn       | MIDI Time Code
    - *           | 01H     |  Full Message
    - *           | 02H     |  User Bits
    - *   02H     | nn       | MIDI Show Control
    - *           | 00H     |  MSC Extensions
    - *           | 01H〜7FH |  MSC Commands
    - *   03H     | nn       | Notation Information
    - *           | 01H     |  Bar Number
    - *           | 02H     |  Time Signature(Immediate)
    - *           | 42H     |  Time Signature(Delayed)
    - *   04H     | nn       | Device Control
    - *           | 01H     |  Master Volume
    - *           | 02H     |  Master Ballance
    - *   05H     | nn       | Real Time MTC Cueing
    - *           | 00H     |  Special
    - *           | 01H     |  Punch In Points
    - *           | 02H     |  Punch Out Points
    - *           | 03H     |  (Reserved)
    - *           | 04H     |  (Reserved)
    - *           | 05H     |  Event Start Points
    - *           | 06H     |  Event Stop Points
    - *           | 07H     |  Event Start Points with additional info.
    - *           | 08H     |  Event Stop Points with additional info.
    - *           | 09H     |  (Reserved)
    - *           | 0AH     |  (Reserved)
    - *           | 0BH     |  Cue Points
    - *           | 0CH     |  Cue Points with additional info.
    - *           | 0DH     |  (Reserved)
    - *           | 0EH     |  Event Name in additional info.
    - *   06H     | nn       | MIDI Machine Control Commands
    - *           | 00H〜7FH |  MMC Commands
    - *   07H     | nn       | MIDI Machine Control Responses
    - *           | 00H〜7FH |  MMC Commands
    - *   08H     | nn       | MIDI Tuning Standard
    - *           | 02H     |  Note Change
    + *  SUB-ID#1 | SUB-ID#2  | function
    + *  ---------+-----------+------------------------------------------
    + *   00H     | --        | unused
    + *   01H     | nn        | MIDI Time Code
    + *           | 01H       |  Full Message
    + *           | 02H       |  User Bits
    + *   02H     | nn        | MIDI Show Control
    + *           | 00H       |  MSC Extensions
    + *           | 01H ~ 7FH |  MSC Commands
    + *   03H     | nn        | Notation Information
    + *           | 01H       |  Bar Number
    + *           | 02H       |  Time Signature(Immediate)
    + *           | 42H       |  Time Signature(Delayed)
    + *   04H     | nn        | Device Control
    + *           | 01H       |  Master Volume
    + *           | 02H       |  Master Ballance
    + *   05H     | nn        | Real Time MTC Cueing
    + *           | 00H       |  Special
    + *           | 01H       |  Punch In Points
    + *           | 02H       |  Punch Out Points
    + *           | 03H       |  (Reserved)
    + *           | 04H       |  (Reserved)
    + *           | 05H       |  Event Start Points
    + *           | 06H       |  Event Stop Points
    + *           | 07H       |  Event Start Points with additional info.
    + *           | 08H       |  Event Stop Points with additional info.
    + *           | 09H       |  (Reserved)
    + *           | 0AH       |  (Reserved)
    + *           | 0BH       |  Cue Points
    + *           | 0CH       |  Cue Points with additional info.
    + *           | 0DH       |  (Reserved)
    + *           | 0EH       |  Event Name in additional info.
    + *   06H     | nn        | MIDI Machine Control Commands
    + *           | 00H ~ 7FH |  MMC Commands
    + *   07H     | nn        | MIDI Machine Control Responses
    + *           | 00H ~ 7FH |  MMC Commands
    + *   08H     | nn        | MIDI Tuning Standard
    + *           | 02H       |  Note Change
      * 
    * * @author Naohide Sano (nsano) @@ -66,19 +66,19 @@ public class RealtimeUniversalSysexMessage extends SysexMessage { /* -[マスターボリューム] +[master volume] F0 7F 7F 04 01 ll mm F7 - nn=0〜7F(音量:0〜127) ※ 初期値はnn=64 (音量:100) + nn=0 ~ 7F(volume: 0 ~ 127) * initial value=64 (volume: 100) [Master Fine Tuning] F0h 7F 7F 04 03 vh vl F7 - マスター・ファイン・チューンを設定します。 - A440Hzからのチューニングをセント単位で指定します。 + specify master fine tune + specifies the tuning from A440Hz in cents. [Master Coarse Tuning] F0 7F 7F 04 04 00 vl F7 - マスター・コース・チューンを設定します。 - A440Hzからのチューニングを100[cent]単位で指定します。 + specify coarse fine tune + specifies the tuning from A440Hz in cents. [GM SYSTEM ON] F0 7E 7F 09 01 F7 @@ -91,5 +91,3 @@ public class RealtimeUniversalSysexMessage extends SysexMessage { */ } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/STMessage.java b/src/main/java/vavi/sound/smaf/message/STMessage.java index e1b080c..683761f 100644 --- a/src/main/java/vavi/sound/smaf/message/STMessage.java +++ b/src/main/java/vavi/sound/smaf/message/STMessage.java @@ -19,7 +19,7 @@ /** * ST Message. - * TODO MetaMessage じゃだめなの? + * TODO isn't MetaMessage enough? * * @author Naohide Sano (nsano) * @version 0.00 050412 nsano initial version
    @@ -89,5 +89,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/SmafContext.java b/src/main/java/vavi/sound/smaf/message/SmafContext.java index 80f54de..bfec4c5 100644 --- a/src/main/java/vavi/sound/smaf/message/SmafContext.java +++ b/src/main/java/vavi/sound/smaf/message/SmafContext.java @@ -6,6 +6,7 @@ package vavi.sound.smaf.message; +import java.util.Arrays; import java.util.BitSet; import java.util.NoSuchElementException; import java.util.logging.Level; @@ -31,7 +32,7 @@ */ public class SmafContext implements SmafConvertible { - /** SMAF のトラック数の最大値 */ + /** max SMAF track number */ public static final int MAX_SMAF_TRACKS = 4; //---- @@ -49,7 +50,7 @@ public void setType(int type) { this.type = type; } - /** TODO 今のところ sequence#resolution */ + /** TODO currently sequence#resolution */ private int timeBase; /** */ @@ -64,7 +65,7 @@ public void setTimeBase(int timeBase) { //---- - /** index は SMAF Track No., 使用されていれば true */ + /** index is SMAF Track No., true if used */ private boolean[] trackUsed = new boolean[MAX_SMAF_TRACKS]; /** @@ -84,7 +85,7 @@ public boolean isTrackUsed(int smafTrackNumber) { //---- /** - * tick の倍率 + * tick magnification */ private double scale = 1.0d; @@ -101,13 +102,11 @@ public void setScale(float scale) { //---- - /** 直前の tick, index は SMAF Track No. */ + /** the previous tick, index is SMAF Track No. */ private long[] beforeTicks = new long[MAX_SMAF_TRACKS]; /* init */ { - for (int i = 0; i < MAX_SMAF_TRACKS; i++) { - beforeTicks[i] = 0; - } + Arrays.fill(beforeTicks, 0); } /** @@ -131,23 +130,23 @@ public void incrementBeforeTick(int smafTrackNumber, long delta) { this.beforeTicks[smafTrackNumber] += getAdjustedDelta(smafTrackNumber, delta * scale); } - /** @return 補正あり Δタイム */ + /** @return with correction Δ time */ public int retrieveAdjustedDelta(int smafTrackNumber, long currentTick) { return getAdjustedDelta(smafTrackNumber, (currentTick - beforeTicks[smafTrackNumber]) / scale); } /** - * @return 補正なし Δタイム - * TODO 何でこれでうまくいくの? + * @return no correction Δ time + * TODO why does this work? */ private int retrieveDelta(int smafTrackNumber, long currentTick) { return (int) Math.round((currentTick - beforeTicks[smafTrackNumber]) / scale); } - /** Math#round() で丸められた誤差 */ + /** error rounded with Math#round() */ private double[] roundedSum = new double[MAX_SMAF_TRACKS]; - /** Math#round() で丸められた誤差が整数値より大きくなった場合の補正 */ + /** correction when the sum of rounding errors with Math#round() is larger than 1 */ private int getAdjustedDelta(int smafTrackNumber, double floatDelta) { int delta = (int) Math.round(floatDelta); double rounded = floatDelta - delta; @@ -167,18 +166,17 @@ private int getAdjustedDelta(int smafTrackNumber, double floatDelta) { //---- /** - * 一つ前の NoteOn からの時間 (currentTick - beforeTicks[track]) に - * いくつΔが入るか(整数値、あまり切り捨て)を求め、その個数分挿入する - * NopMessage の配列を返します。 + * Finds how many Δs(integer value, truncating too much) can be included in the time since the previous + * NoteOn (currentTick - beforeTicks[track]) and returns an array of NopMessages to be inserted for that number. *
          *     event    index    process
          *   |
          * --+- NoteOn    -2    -> brforeTick
    -     * ↑|
    +     * ↑ |
          * ||
    -     * Δ|- NoteOff    -1    -> noteOffEventUsed[-1] = true
    +     * Δ |- NoteOff    -1    -> noteOffEventUsed[-1] = true
          * ||
    -     * ↓|
    +     * ↓ |
          * --+-
          *   |
          *  -O- NoteOn    midiEventIndex
    @@ -187,7 +185,7 @@ private int getAdjustedDelta(int smafTrackNumber, double floatDelta) {
          *   |
          * --+-
          * 
    - * 上記図だと 1 つの NopMessage が挿入される。 + * in the above figure, one NopMessage is inserted. */ public SmafEvent[] getIntervalSmafEvents() { @@ -222,7 +220,7 @@ public SmafEvent[] getIntervalSmafEvents() { // Debug.println("interval: " + interval + ", " + (interval - 256)); //} if (interval < 0) { - // ありえないはず + // it shouldn't be possible Debug.println(Level.WARNING, "interval: " + interval); interval = 0; } @@ -234,7 +232,7 @@ public SmafEvent[] getIntervalSmafEvents() { for (int i = 0; i < nopLength; i++) { NopMessage smafMessage = new NopMessage(255); smafEvents[i] = new SmafEvent(smafMessage, 0L); // TODO 0l - // 255 Δ 分後ろにずらしていく + // shift backward by 255 Δ minutes incrementBeforeTick(track, 255); } @@ -243,9 +241,8 @@ public SmafEvent[] getIntervalSmafEvents() { } /** - * 前のデータ(MIDI NoteOn)が実行されてからのΔ(時間)を取得します。 - * 必ず事前に #getIntervalSmafEvents() を実行してΔを 255 以下を - * 返すようにしておいて下さい。 + * Gets the Δ (time) since the previous data (MIDI NoteOn) was executed. + * Be sure to execute #getIntervalSmafEvents() in advance to return Δ less than 255. */ public int getDuration() { @@ -260,14 +257,14 @@ public int getDuration() { delta = retrieveAdjustedDelta(retrieveSmafTrack(channel), midiEvent.getTick()); } else if (midiMessage instanceof MetaMessage && ((MetaMessage) midiMessage).getType() == 81) { // tempo - delta = retrieveAdjustedDelta(smafTrackNumber, midiEvent.getTick()); // TODO smafTrackNumber でいいのか? + delta = retrieveAdjustedDelta(smafTrackNumber, midiEvent.getTick()); // TODO is smafTrackNumber ok? Debug.println(Level.FINE, "delta for tempo[" + smafTrackNumber + "]: " + delta); } else { Debug.println(Level.FINE, "no delta defined for: " + midiMessage); } if (delta > 255) { - // getIntervalSmafEvents で処理されているはずなのでありえない + // this is impossible because it should be handled by getIntervalSmafEvents Debug.println(Level.WARNING, "Δ: " + delta + ", " + (delta % 256)); } return delta % 256; @@ -275,13 +272,13 @@ public int getDuration() { //---- - /** 補正された SMAF Pitch を取得します。 sound -45, percussion -35 */ + /** Gets the corrected SMAF Pitch. sound -45, percussion -35 */ public int retrievePitch(int channel, int pitch) { return pitch - 45 + (channel == MidiContext.CHANNEL_DRUM ? 10 : 0); } /** - * SMAF Voice No. を取得します。 + * Gets SMAF Voice No. * @param channel MIDI channel */ public int retrieveVoice(int channel) { @@ -289,7 +286,7 @@ public int retrieveVoice(int channel) { } /** - * MIDI Channel を取得します。 + * Gets MIDI Channel. * @param voice SMAF channel */ public int retrieveChannel(int voice) { @@ -297,7 +294,7 @@ public int retrieveChannel(int voice) { } /** - * SMAF Track を取得します。 + * Gets SMAF Track. * @param channel MIDI channel */ public int retrieveSmafTrack(int channel) { @@ -306,46 +303,46 @@ public int retrieveSmafTrack(int channel) { //---- - /** 現在の SMAF のトラック No. */ + /** current SMAF track No. */ private int smafTrackNumber; - /** 現在の SMAF トラック No. を設定します。 */ + /** Sets current SMAF track No. */ public void setSmafTrackNumber(int smafTrackNumber) { this.smafTrackNumber = smafTrackNumber; } - /** 現在の SMAF トラック No. を取得します。 */ + /** Gets current SMAF strack No. */ public int getSmafTrackNumber() { return smafTrackNumber; } - /** 現在の MIDI トラック */ + /** current MIDI track */ private Track midiTrack; - /** 現在の MIDI トラックを設定します。 */ + /** Sets current MIDI track. */ public void setMidiTrack(Track midiTrack) { this.midiTrack = midiTrack; this.noteOffEventUsed = new BitSet(midiTrack.size()); } - /** 現在の MIDI イベントのインデックス値 */ + /** index value of the current MIDI event */ private int midiEventIndex; - /** 現在の MIDI イベントのインデックス値を設定します。 */ + /** Sets the index value of the current MIDI event. */ public void setMidiEventIndex(int midiEventIndex) { this.midiEventIndex = midiEventIndex; } - /** 現在の MIDI イベントのインデックス値を取得します。 */ + /** Gets the index value of the current MIDI event. */ int getMidiEventIndex() { return midiEventIndex; } /** - * 同じ channel で次の ShortMessage である MIDI イベントを取得します。 + * Gets the next ShortMessage MIDI event on the same channel. * - * @throws NoSuchElementException 次の MIDI イベントがない - * @throws IllegalStateException 現在のイベントは ShortMessage ではない + * @throws NoSuchElementException no next MIDI event + * @throws IllegalStateException current event is not a ShortMessage */ public MidiEvent getNextMidiEvent() throws NoSuchElementException { @@ -380,12 +377,12 @@ public MidiEvent getNextMidiEvent() throws NoSuchElementException { } /** - * 現在選択中の NoteOn イベントと対の NoteOff イベントを取得します。 - * IllegalStateException はバグトラップのためだけに使用してください。 + * Gets the currently selected NoteOn event and its counterpart NoteOff event. + * Use IllegalStateException only for bug traps. * @see vavi.sound.smaf.message.NoteMessage * - * @throws NoSuchElementException 対の NoteOff イベントがない - * @throws IllegalStateException 現在のイベントは ShortMessage ではない + * @throws NoSuchElementException no paired NoteOff event + * @throws IllegalStateException current event is not a ShortMessage */ public MidiEvent getNoteOffMidiEvent() throws NoSuchElementException { @@ -410,7 +407,7 @@ public MidiEvent getNoteOffMidiEvent() throws NoSuchElementException { if (shortMessage.getChannel() == channel && shortMessage.getData1() == data1) { - noteOffEventUsed.set(i); // 消費フラグ on + noteOffEventUsed.set(i); // consumption flag on return midiEvent; } } @@ -419,20 +416,20 @@ public MidiEvent getNoteOffMidiEvent() throws NoSuchElementException { throw new NoSuchElementException(channel + "ch, " + data1); } - /** すでに消費されたかどうか */ + /** whether it has already been consumed */ private BitSet noteOffEventUsed; - /** すでに消費されたかどうかを取得します。 */ + /** Gets whether it has already been consumed. */ public boolean isNoteOffEventUsed() { return noteOffEventUsed.get(midiEventIndex); } - // SmafConvertible --------------------------------------------------------- + // SmafConvertible ---- /** BANK LSB */ - private int[] bankLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] bankLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** BANK MSB */ - private int[] bankMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] bankMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** */ public static final int RPN_PITCH_BEND_SENSITIVITY = 0x0000; @@ -448,14 +445,14 @@ public boolean isNoteOffEventUsed() { public static final int RPN_NULL = 0x7f7f; /** RPN LSB */ - private int[] rpnLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] rpnLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** RPN MSB */ - private int[] rpnMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] rpnMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** NRPN LSB */ - private int[] nrpnLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] nrpnLSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** NRPN MSB */ - private int[] nrpnMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; + private final int[] nrpnMSB = new int[MidiContext.MAX_MIDI_CHANNELS]; /** bank, rpn, nrpn */ @Override @@ -469,10 +466,10 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) int data2 = shortMessage.getData2(); switch (data1) { - case 0: // バンクセレクト MSB + case 0: // bank select MSB bankMSB[channel] = data2; break; - case 32: // バンクセレクト LSB + case 32: // bank select LSB bankLSB[channel] = data2; break; case 98: // NRPN LSB @@ -495,5 +492,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) return null; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/SmafConvertible.java b/src/main/java/vavi/sound/smaf/message/SmafConvertible.java index 64a47fd..80cc5a3 100644 --- a/src/main/java/vavi/sound/smaf/message/SmafConvertible.java +++ b/src/main/java/vavi/sound/smaf/message/SmafConvertible.java @@ -12,12 +12,11 @@ import vavi.sound.smaf.SmafEvent; - /** * SmafConvertible. *

    - * 今のところ実装クラスは bean でなければならない. - * (引数なしのコンストラクタがあること) + * currently the implementation class must be a bean. + * (have a no-argument constructor) *

    * * @author Naohide Sano (nsano) @@ -25,8 +24,6 @@ */ public interface SmafConvertible { - /** TODO 実装法いまいち,BeanUtil 等が使えないか? */ + /** TODO the implementation method is not good enough, use BeanUtil etc.? */ SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) throws InvalidSmafDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/TrackMessage.java b/src/main/java/vavi/sound/smaf/message/TrackMessage.java index b953f88..c98bea4 100644 --- a/src/main/java/vavi/sound/smaf/message/TrackMessage.java +++ b/src/main/java/vavi/sound/smaf/message/TrackMessage.java @@ -19,7 +19,7 @@ /** - * TrackMessage. TODO 要るのか? + * TrackMessage. TODO is it necessary? * * @author Naohide Sano (nsano) * @version 0.00 080415 nsano initial version
    @@ -57,15 +57,15 @@ public void writeTo(OutputStream out) throws IOException { } /** - * track の中身を見て ScoreTrack, PcmAudio, Graphic に振り分け + * Look at the contents of the track and sort it into ScoreTrack, PcmAudio, and Graphic. */ private String getType() { return "ATR\0"; // TODO } /** - * 書き出し用 - * {@link Track}[0] の不必要なデータは省かれます。 + * for writing + * Unnecessary data in {@link Track}[0] will be omitted. */ public int getDataLength() { int trackLength = 0; @@ -81,5 +81,3 @@ public int getDataLength() { return trackLength; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/UndefinedMessage.java b/src/main/java/vavi/sound/smaf/message/UndefinedMessage.java index 1ce8096..a4a1400 100644 --- a/src/main/java/vavi/sound/smaf/message/UndefinedMessage.java +++ b/src/main/java/vavi/sound/smaf/message/UndefinedMessage.java @@ -46,5 +46,3 @@ public int getLength() { return 0; // TODO } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/VNMessage.java b/src/main/java/vavi/sound/smaf/message/VNMessage.java index 9ece407..2a24253 100644 --- a/src/main/java/vavi/sound/smaf/message/VNMessage.java +++ b/src/main/java/vavi/sound/smaf/message/VNMessage.java @@ -19,7 +19,7 @@ /** * VN Message. - * TODO MetaMessage じゃだめなの? + * TODO isn't MetaMessage enough? * * @author Naohide Sano (nsano) * @version 0.00 050412 nsano initial version
    @@ -89,5 +89,3 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/VolumeMessage.java b/src/main/java/vavi/sound/smaf/message/VolumeMessage.java index c9bfa32..12ec329 100644 --- a/src/main/java/vavi/sound/smaf/message/VolumeMessage.java +++ b/src/main/java/vavi/sound/smaf/message/VolumeMessage.java @@ -29,7 +29,7 @@ * duration 1or2 * data0 0x00 * data1 cc 11 0111 - * data2 value 0x00〜0x7f + * data2 value 0x00 ~ 0x7f *
    * * @author Naohide Sano (nsano) @@ -128,7 +128,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) context.getDrum(this.channel) == ChannelConfiguration.PERCUSSION && context.getSmafTrackNumber() * 4 + this.channel != MidiContext.CHANNEL_DRUM) { - // TODO psm は最後(最大?)?の volume を設定 + // TODO psm sets the last(maximum?)? volume Debug.println(Level.FINE, "volume: " + volume); context.setVelocity(this.channel, volume); @@ -140,7 +140,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(ShortMessage.CONTROL_CHANGE, midiChannel, - 7, // メインボリューム MSB + 7, // main volume MSB volume); events[0] = new MidiEvent(shortMessage, context.getCurrentTick()); return events; @@ -171,5 +171,3 @@ public SmafEvent[] getSmafEvents(MidiEvent midiEvent, SmafContext context) }; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/WaveDataMessage.java b/src/main/java/vavi/sound/smaf/message/WaveDataMessage.java index 6500782..85391d2 100644 --- a/src/main/java/vavi/sound/smaf/message/WaveDataMessage.java +++ b/src/main/java/vavi/sound/smaf/message/WaveDataMessage.java @@ -25,7 +25,7 @@ /** * WaveDataMessage. - * TODO SysexMessage とかじゃないの? + * TODO isn't it something like SysexMessage? *
      *
      * 
    @@ -103,7 +103,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -129,5 +129,3 @@ public void sequence() throws InvalidSmafDataException { engine.setData(number, -1, samplingRate, samplingBits, channels, data, false); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/WaveMessage.java b/src/main/java/vavi/sound/smaf/message/WaveMessage.java index 94ef99b..471e683 100644 --- a/src/main/java/vavi/sound/smaf/message/WaveMessage.java +++ b/src/main/java/vavi/sound/smaf/message/WaveMessage.java @@ -29,7 +29,7 @@ /** * WaveMessage. - * TODO SysexMessage とかじゃないの? + * TODO isn't it something like SysexMessage? *
      *  format 0x00
      *   duration   1or2
    @@ -150,38 +150,37 @@ public int getLength() {
     
         /**
          * 

    - * この {@link WaveMessage} のインスタンスに対応する - * MIDI メッセージとして Meta type 0x7f の {@link MetaMessage} を作成する。 - * {@link MetaMessage} の実データとして {@link SmafMessageStore} - * にこの {@link WaveMessage} のインスタンスをストアして採番された id を - * 2 bytes big endian で格納する。 + * Create {@link MetaMessage} of Meta type 0x7f as a MIDI message corresponding to + * this instance of {@link WaveMessage}. + * Store this instance of {@link WaveMessage} in {@link SmafMessageStore} + * as the actual data of {@link MetaMessage} + * and store the numbered ID in 2 bytes big endian. *

    *

    - * 再生の場合は {@link javax.sound.midi.MetaEventListener} で Meta type 0x7f を - * リッスンして対応する id のメッセージを {@link SmafMessageStore} から見つける。 - * それを {@link vavi.sound.smaf.sequencer.WaveSequencer} にかけて再生処理を - * 行う。 + * For playback, listen to Meta type 0x7f with {@link javax.sound.midi.MetaEventListener} + * and find the message with the corresponding id from {@link SmafMessageStore}. + * Apply it to {@link vavi.sound.smaf.sequencer.WaveSequencer} for playback processing. *

    *

    - * 再生機構は vavi.sound.smaf.MetaEventAdapter を参照。 + * See vavi.sound.smaf.MetaEventAdapter for the playback mechanism. *

    *
          * MIDI Meta
          * +--+--+--+--+--+--+--+--+--+--+--+-
          * |ff|7f|LL|ID|DD DD ...
          * +--+--+--+--+--+--+--+--+--+--+--+-
    -     *  0x7f シーケンサー固有メタイベント
    -     *  LL ホンマに 1 byte ?
    -     *  ID メーカーID
    +     *  0x7f sequencer specific meta event
    +     *  LL really 1 byte?
    +     *  ID manufacturer ID
          * 
    *
    -     * 現状
    +     * current specs.
          * +--+--+--+--+--+--+--+
          * |ff|7f|LL|5f|01|DH DL|
          * +--+--+--+--+--+--+--+
    -     *  0x5f 勝手につけたメーカ ID
    -     *  0x01 {@link WaveMessage} データであることを表す
    -     *  DH DL 採番された id
    +     *  0x5f manufacturer ID added arbitrarily
    +     *  0x01 indicates {@link WaveMessage}  data
    +     *  DH DL numbered id
          * 
    * @see vavi.sound.midi.VaviMidiDeviceProvider#MANUFACTURER_ID * @see vavi.sound.smaf.sequencer.WaveSequencer#META_FUNCTION_ID_SMAF @@ -199,7 +198,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -216,5 +215,3 @@ public void sequence() throws InvalidSmafDataException { engine.start(number); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/graphics/BackDropColorDefinitionMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/BackDropColorDefinitionMessage.java index 199e9f2..0bcd030 100644 --- a/src/main/java/vavi/sound/smaf/message/graphics/BackDropColorDefinitionMessage.java +++ b/src/main/java/vavi/sound/smaf/message/graphics/BackDropColorDefinitionMessage.java @@ -80,5 +80,3 @@ public int getLength() { return getMessage().length; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/graphics/GeneralPurposeDisplayMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/GeneralPurposeDisplayMessage.java index 137f1aa..d679fec 100644 --- a/src/main/java/vavi/sound/smaf/message/graphics/GeneralPurposeDisplayMessage.java +++ b/src/main/java/vavi/sound/smaf/message/graphics/GeneralPurposeDisplayMessage.java @@ -17,10 +17,10 @@ /** * GeneralPurposeDisplayMessage. - * (Display Object Event 0x40〜0x7F) + * (Display Object Event 0x40 ~ 0x7F) *
      *  duration    1or2
    - *  event type  0x40〜0x7F
    + *  event type  0x40 ~ 0x7F
      *  duration    1or2
      * 
    * @@ -99,5 +99,3 @@ public int getLength() { return getMessage().length; } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/message/graphics/NopMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/NopMessage.java index abc3bd2..a543036 100644 --- a/src/main/java/vavi/sound/smaf/message/graphics/NopMessage.java +++ b/src/main/java/vavi/sound/smaf/message/graphics/NopMessage.java @@ -18,7 +18,7 @@ /** * NopMessage. * (Short Control Event 0x00..0x1f) - * TODO ShortMessage ではない気がする + * TODO it's not ShortMessage? *
      *  duration    1or2
      *  event type  0x00
    @@ -72,5 +72,3 @@ public int getLength() {
             return getMessage().length;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/graphics/OffsetOriginMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/OffsetOriginMessage.java
    index fd16b91..45f826f 100644
    --- a/src/main/java/vavi/sound/smaf/message/graphics/OffsetOriginMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/graphics/OffsetOriginMessage.java
    @@ -75,5 +75,3 @@ public int getLength() {
             return getMessage().length;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/graphics/ResetOrigneMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/ResetOrigneMessage.java
    index 9ad7a95..80e027a 100644
    --- a/src/main/java/vavi/sound/smaf/message/graphics/ResetOrigneMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/graphics/ResetOrigneMessage.java
    @@ -71,5 +71,3 @@ public int getLength() {
             return getMessage().length;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/graphics/UserMessage.java b/src/main/java/vavi/sound/smaf/message/graphics/UserMessage.java
    index f97a454..e17b8ce 100644
    --- a/src/main/java/vavi/sound/smaf/message/graphics/UserMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/graphics/UserMessage.java
    @@ -81,5 +81,3 @@ public int getLength() {
             return getMessage().length;
         }
     }
    -
    -/* */
    diff --git a/src/main/java/vavi/sound/smaf/message/yamaha/YamahaMessage.java b/src/main/java/vavi/sound/smaf/message/yamaha/YamahaMessage.java
    index c561db3..a7c00d2 100644
    --- a/src/main/java/vavi/sound/smaf/message/yamaha/YamahaMessage.java
    +++ b/src/main/java/vavi/sound/smaf/message/yamaha/YamahaMessage.java
    @@ -35,41 +35,41 @@ public class YamahaMessage extends MachineDependentMessage
     
         /**
          *
    -     * 
  • [MA-3] ストリームPCM ペア + *
  • [MA-3] stream PCM pair *

    - * 指定した二つのストリームPCMを同期発音させるよう設定できます。 - * 同期メッセージを受信後、いずれかのノート・オンで二つのサウンドが同時に発音されます。 + * You can set two specified stream PCMs to sound synchronously. + * After receiving the sync message, any note-on will cause the two sounds to be played simultaneously. *

    *
          * ex.)F0 xx 43 79 06 7F 08 cl id1 id2 F7
    -     *    cl=00(同期),01(解除)
    -     *     id1=00〜20(Wave ID 1)
    -     *     id2=00〜20(Wave ID 2)
    +     *    cl=00(synchronize),01(cancel)
    +     *     id1=00 ~ 20(Wave ID 1)
    +     *     id2=00 ~ 20(Wave ID 2)
          * 
    - *
  • MA-3/MA-5 ストリームPCM ウェーブ・パンポット + *
  • MA-3/MA-5 stream PCM wave pan pot *

    - * 指定したストリームPCMウェーブのステレオ定位位置を設定します。 + * Sets the stereo location position of the specified stream PCM wave. *

    *
          * ex.)F0 xx 43 79 06 7F 0B id pp dd F7
    -     *    id=00〜20(Wave ID)
    -     *    pp=00(指定),01(クリア),02(オフ)
    -     *    dd=00〜7F(定位:Center=40)
    +     *    id=00 ~ 20(Wave ID)
    +     *    pp=00(specify),01(clear),02(off)
    +     *    dd=00 ~ 7F(localization: Center=40)
          * 
    - * ※ 一度これを指定した場合、クリアしない限りチャンネル・パンポット(CC#10)の指定は効果ありません。 + * * Once this is specified, the channel panpot (CC#10) specification will have no effect unless cleared. *
          * ----------------------
    -     *  MA-3 マスター・ボリューム
    -     *  MA-3 ストリームPCMペア
    -     *  MA-3 ストリームPCMウェーブ・パンポット
    -     *  MA-3 割り込み設定
    +     *  MA-3 master volume
    +     *  MA-3 stream PCM pair
    +     *  MA-3 stream PCM wave, pan pot
    +     *  MA-3 interruption setting
          *  ----------------------
          * 
     
     [???] (puc)
              43 01 80 31 xx F7
    -                     ~~ テンポデータ? Mtsu で指定したもの
    +                     ~~ tempo data? set by Mtsu
     
     [???] (my dump)
              43 03 91 18 00 F7
    @@ -81,11 +81,11 @@ public class YamahaMessage extends MachineDependentMessage
     
     [???] (puc)
     FF F0 05 43 02 80 ** F7
    -                  ~~ 1 デルタタイムあたりの msec らしい
    +                  ~~ msec seems per 1 delta time
     
    -[音色設定] (puc)
    +[voice setting] (puc)
     FF F0 13 43 02 01 00 50 72 9B 3F C1 98 4B 3F C0 00 10 21 42 00 F7
    -                  ~~ ~~  1 バイト目は 00 2 バイト目が音色番号
    +                  ~~ ~~  1st byte is 00, 2nd byte is voice number
     
     [FMAll4HPS] (smaftool)
              43 03 00 00 47 50 01 25 1B 92 42 A0 14 72 71 00 A0 F7
    @@ -109,20 +109,20 @@ public class YamahaMessage extends MachineDependentMessage
     [MA-3,5 SetWave] (smaftool)
              43 79    7F 03
     
    -[ストリームPCM ウェーブパンポット] (proper)
    +[stream PCM wave pan-pot] (proper)
           F0 43 79 06 7F 0B ii cc dd F7
    -          ii: WaveID 1〜32 (1H〜20F)
    -          cc: パンポット指定 0、クリア 1、パンオフ 2
    -          dd: パンポット値0〜127 (00H〜7FH)
    +          ii: WaveID 1 ~ 32 (1H ~ 20F)
    +          cc: specify pan-pot 0,clear 1, pan off 2
    +          dd: pan-pot value 0 ~ 127 (00H ~ 7FH)
     
    -[ユーザーイベント] (proper)
    +[user event] (proper)
           F0 43 79 06 7F 10 dd F7
    -          dd: ユーザーイベント種別 0〜15 (0H〜FH)
    +          dd: user event type 0 ~ 15 (0H ~ FH)
     
     
    *

    - * デフォルトの MIDI シーケンサを使用するため、メタイベントしかフックできないので - * メタイベントに変換している。 + * Since the default MIDI sequencer is used, only meta-events can be hooked, + * so they are converted to meta-events. *

    * @see "http://www.music.ne.jp/~puc/mmf_format.html" * @see "ATS-MA5-SMAF_GL_133_HV.pdf" @@ -150,7 +150,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce (byte) ((id / 0x100) & 0xff), (byte) ((id % 0x100) & 0xff) }; - metaMessage.setMessage(0x7f, // シーケンサー固有メタイベント + metaMessage.setMessage(0x7f, // sequencer specific meta event data, data.length); @@ -159,7 +159,7 @@ public MidiEvent[] getMidiEvents(MidiContext context) throws InvalidMidiDataExce }; } - /* TODO 今、超適当 */ + /* TODO super appropriate right now */ @Override public void sequence() throws InvalidSmafDataException { Debug.println(Level.INFO, "yamaha: " + data.length + "\n" + StringUtil.getDump(data, 64)); @@ -187,5 +187,3 @@ public void sequence() throws InvalidSmafDataException { } } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/sequencer/MachineDependentSequencer.java b/src/main/java/vavi/sound/smaf/sequencer/MachineDependentSequencer.java index e8223e0..0df4724 100644 --- a/src/main/java/vavi/sound/smaf/sequencer/MachineDependentSequencer.java +++ b/src/main/java/vavi/sound/smaf/sequencer/MachineDependentSequencer.java @@ -24,5 +24,3 @@ public interface MachineDependentSequencer { void sequence() throws InvalidSmafDataException; } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/sequencer/SmafMessageStore.java b/src/main/java/vavi/sound/smaf/sequencer/SmafMessageStore.java index e718275..641c5a3 100644 --- a/src/main/java/vavi/sound/smaf/sequencer/SmafMessageStore.java +++ b/src/main/java/vavi/sound/smaf/sequencer/SmafMessageStore.java @@ -15,7 +15,7 @@ /** * temporary store. *

    - * TODO 何とかして撲滅したい -> ThreadLocal ? + * TODO to remove this class somehow -> ThreadLocal? *

    * * @author Naohide Sano (nsano) @@ -33,7 +33,7 @@ private SmafMessageStore() { } /** - * @return {@link javax.sound.midi.MetaMessage} で使用される id + * @return id used in {@link javax.sound.midi.MetaMessage} */ public static /* synchronized */ int put(SmafMessage message) { try { @@ -49,5 +49,3 @@ public static SmafMessage get(int id) { return stores.get(id); } } - -/* */ diff --git a/src/main/java/vavi/sound/smaf/sequencer/WaveSequencer.java b/src/main/java/vavi/sound/smaf/sequencer/WaveSequencer.java index 08b57c2..7d83f08 100644 --- a/src/main/java/vavi/sound/smaf/sequencer/WaveSequencer.java +++ b/src/main/java/vavi/sound/smaf/sequencer/WaveSequencer.java @@ -62,5 +62,3 @@ private Factory() { } } } - -/* */ diff --git a/src/main/java/vavi/util/I0Bessel.java b/src/main/java/vavi/util/I0Bessel.java index 35d5f4f..9711948 100644 --- a/src/main/java/vavi/util/I0Bessel.java +++ b/src/main/java/vavi/util/I0Bessel.java @@ -159,5 +159,3 @@ public static double value(double x) { return y; } } - -/* */ diff --git a/src/main/java/vavi/util/SplitRadixFft.java b/src/main/java/vavi/util/SplitRadixFft.java index da0ad96..68b197c 100644 --- a/src/main/java/vavi/util/SplitRadixFft.java +++ b/src/main/java/vavi/util/SplitRadixFft.java @@ -1352,5 +1352,3 @@ private static void dstsub(int n, double[] a, int nc, double[] c, int cP) { a[m] *= c[cP + 0]; } } - -/* */ diff --git a/src/main/resources/META-INF/services/javax.sound.sampled.spi.AudioFileReader b/src/main/resources/META-INF/services/javax.sound.sampled.spi.AudioFileReader index e688a34..b96a290 100644 --- a/src/main/resources/META-INF/services/javax.sound.sampled.spi.AudioFileReader +++ b/src/main/resources/META-INF/services/javax.sound.sampled.spi.AudioFileReader @@ -6,4 +6,10 @@ # 0.00 111016 nsano initial version # -#vavi.sound.sampled.ccitt.G721AudioFileReader +#vavi.sound.sampled.ccitt.G721RawAudioFileReader +vavi.sound.sampled.adpcm.ccitt.G721WaveAudioFileReader +vavi.sound.sampled.adpcm.ima.ImaWaveAudioFileReader +vavi.sound.sampled.adpcm.ms.MsWaveAudioFileReader +vavi.sound.sampled.adpcm.oki.OkiWaveAudioFileReader +vavi.sound.sampled.adpcm.vox.VoxWaveAudioFileReader +vavi.sound.sampled.adpcm.yamaha.YamahaWaveAudioFileReader \ No newline at end of file diff --git a/src/main/resources/META-INF/services/javax.sound.sampled.spi.FormatConversionProvider b/src/main/resources/META-INF/services/javax.sound.sampled.spi.FormatConversionProvider index dcd9941..3817ef1 100644 --- a/src/main/resources/META-INF/services/javax.sound.sampled.spi.FormatConversionProvider +++ b/src/main/resources/META-INF/services/javax.sound.sampled.spi.FormatConversionProvider @@ -8,9 +8,9 @@ vavi.sound.sampled.adpcm.ccitt.G721FormatConversionProvider vavi.sound.sampled.adpcm.dvi.DviFormatConversionProvider -#vavi.sound.sampled.adpcm.ima.ImaFormatConversionProvider +vavi.sound.sampled.adpcm.ima.ImaFormatConversionProvider vavi.sound.sampled.adpcm.ma.MaFormatConversionProvider -#vavi.sound.sampled.adpcm.ms.MsFormatConversionProvider +vavi.sound.sampled.adpcm.ms.MsFormatConversionProvider vavi.sound.sampled.adpcm.oki.OkiFormatConversionProvider vavi.sound.sampled.adpcm.rohm.RohmFormatConversionProvider vavi.sound.sampled.adpcm.vox.VoxFormatConversionProvider diff --git a/src/test/java/ExtractWave.java b/src/test/java/ExtractWave.java index 5e57827..b7da191 100644 --- a/src/test/java/ExtractWave.java +++ b/src/test/java/ExtractWave.java @@ -48,5 +48,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/PlayLine.java b/src/test/java/PlayLine.java index b99b670..ead2d04 100644 --- a/src/test/java/PlayLine.java +++ b/src/test/java/PlayLine.java @@ -69,5 +69,3 @@ void play(String filename) throws Exception { line.close(); } } - -/* */ diff --git a/src/test/java/PlayMFi.java b/src/test/java/PlayMFi.java index 897384a..0ff33e6 100644 --- a/src/test/java/PlayMFi.java +++ b/src/test/java/PlayMFi.java @@ -79,7 +79,7 @@ void exec(String[] args) throws Exception { sequencer.setSequence(sequence); sequencer.addMetaEventListener(mel); sequencer.start(); -MidiUtil.volume(synthesizer.getReceiver(), volume); +MidiUtil.volume(synthesizer.getReceiver(), volume); // TODO noise countDownLatch.await(); System.err.println("END: " + arg); sequencer.removeMetaEventListener(mel); @@ -87,5 +87,3 @@ void exec(String[] args) throws Exception { sequencer.close(); } } - -/* */ diff --git a/src/test/java/PlayPCM.java b/src/test/java/PlayPCM.java index 1ebfa92..14c9fd4 100644 --- a/src/test/java/PlayPCM.java +++ b/src/test/java/PlayPCM.java @@ -93,5 +93,3 @@ void play(File file, int sampleRate, ByteOrder byteOrder) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/PlayPCM2.java b/src/test/java/PlayPCM2.java index 777ff62..b4a9b52 100644 --- a/src/test/java/PlayPCM2.java +++ b/src/test/java/PlayPCM2.java @@ -89,5 +89,3 @@ void play(File file, int sampleRate, ByteOrder byteOrder) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/PlaySMAF.java b/src/test/java/PlaySMAF.java index 1470edf..033cb07 100644 --- a/src/test/java/PlaySMAF.java +++ b/src/test/java/PlaySMAF.java @@ -10,11 +10,14 @@ import javax.sound.midi.MidiSystem; import javax.sound.midi.Soundbank; +import vavi.sound.midi.MidiUtil; import vavi.sound.smaf.MetaEventListener; import vavi.sound.smaf.Sequence; import vavi.sound.smaf.Sequencer; import vavi.sound.smaf.SmafSystem; import vavi.sound.smaf.Synthesizer; +import vavi.util.properties.annotation.Property; +import vavi.util.properties.annotation.PropsEntity; /** @@ -23,6 +26,7 @@ * @author Naohide Sano (nsano) * @version 0.00 090913 nsano initial version
    */ +@PropsEntity(url = "file:local.properties") public class PlaySMAF { /** @@ -30,6 +34,18 @@ public class PlaySMAF { * @param args smaf files ... */ public static void main(String[] args) throws Exception { + PlaySMAF app = new PlaySMAF(); + PropsEntity.Util.bind(app); + app.exec(args); + } + + static final float volume = Float.parseFloat(System.getProperty("vavi.test.volume", "0.2")); + + @Property(name = "sf2") + String sf2 = System.getProperty("user.home") + "/Library/Audio/Sounds/Banks/Orchestra/default.sf2"; + + /** */ + void exec(String[] args) throws Exception { Sequencer sequencer = SmafSystem.getSequencer(); sequencer.open(); @@ -40,7 +56,7 @@ public static void main(String[] args) throws Exception { System.err.println("---- " + soundbank.getDescription() + " ----"); //Arrays.asList(instruments).forEach(System.err::println); synthesizer.unloadAllInstruments(soundbank); -File file = new File("/Users/nsano/lib/audio/sf2/SGM-V2.01.sf2"); +File file = new File(sf2); soundbank = MidiSystem.getSoundbank(file); synthesizer.loadAllInstruments(soundbank); //instruments = synthesizer.getAvailableInstruments(); @@ -48,10 +64,6 @@ public static void main(String[] args) throws Exception { //Arrays.asList(instruments).forEach(System.err::println); // volume (not work ???) MidiChannel[] channels = synthesizer.getChannels(); -double gain = 0.02d; -for (MidiChannel channel : channels) { - channel.controlChange(7, (int) (gain * 127.0)); -} for (String arg : args) { System.err.println("START: " + arg); @@ -66,6 +78,7 @@ public static void main(String[] args) throws Exception { sequencer.setSequence(sequence); sequencer.addMetaEventListener(mel); sequencer.start(); +MidiUtil.volume(synthesizer.getReceiver(), volume); // TODO noise countDownLatch.await(); System.err.println("END: " + arg); sequencer.removeMetaEventListener(mel); @@ -73,5 +86,3 @@ public static void main(String[] args) throws Exception { sequencer.close(); } } - -/* */ diff --git a/src/test/java/ShowMIDIProviders.java b/src/test/java/ShowMIDIProviders.java index f39f1bf..585afab 100644 --- a/src/test/java/ShowMIDIProviders.java +++ b/src/test/java/ShowMIDIProviders.java @@ -26,5 +26,3 @@ public static void main(String[] args) throws Exception { .forEach(info -> System.out.println(info.getName()))); } } - -/* */ diff --git a/src/test/java/SoundFontTest.java b/src/test/java/SoundFontTest.java index 97676e5..abc7714 100644 --- a/src/test/java/SoundFontTest.java +++ b/src/test/java/SoundFontTest.java @@ -92,5 +92,3 @@ void exec(File file) throws Exception { sequencer.close(); } } - -/* */ diff --git a/src/test/java/vavi/io/InputEngineOutputStreamTest.java b/src/test/java/vavi/io/InputEngineOutputStreamTest.java index acabe7b..5da291f 100644 --- a/src/test/java/vavi/io/InputEngineOutputStreamTest.java +++ b/src/test/java/vavi/io/InputEngineOutputStreamTest.java @@ -77,5 +77,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(inFile)), Checksum.getChecksum(new File(out2File))); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/AdpcmOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/AdpcmOutputStreamTest.java index 31722e5..2831686 100644 --- a/src/test/java/vavi/sound/adpcm/AdpcmOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/AdpcmOutputStreamTest.java @@ -51,5 +51,3 @@ public int decode(int adpcm) { assertEquals(buf.length / 4, baos.size()); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ccitt/Decoder.java b/src/test/java/vavi/sound/adpcm/ccitt/Decoder.java index fc28b03..4037bb8 100644 --- a/src/test/java/vavi/sound/adpcm/ccitt/Decoder.java +++ b/src/test/java/vavi/sound/adpcm/ccitt/Decoder.java @@ -122,5 +122,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ccitt/Encoder.java b/src/test/java/vavi/sound/adpcm/ccitt/Encoder.java index 32d2da0..2266f06 100644 --- a/src/test/java/vavi/sound/adpcm/ccitt/Encoder.java +++ b/src/test/java/vavi/sound/adpcm/ccitt/Encoder.java @@ -129,5 +129,3 @@ public static void main(String[] args) throws Exception { os.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ccitt/G721InputStreamTest.java b/src/test/java/vavi/sound/adpcm/ccitt/G721InputStreamTest.java index 9e32ba6..4001c81 100644 --- a/src/test/java/vavi/sound/adpcm/ccitt/G721InputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ccitt/G721InputStreamTest.java @@ -97,5 +97,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ccitt/G721OutputStreamTest.java b/src/test/java/vavi/sound/adpcm/ccitt/G721OutputStreamTest.java index 4e68665..7d4eaaa 100644 --- a/src/test/java/vavi/sound/adpcm/ccitt/G721OutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ccitt/G721OutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/dvi/Decoder.java b/src/test/java/vavi/sound/adpcm/dvi/Decoder.java index 448709e..a509490 100644 --- a/src/test/java/vavi/sound/adpcm/dvi/Decoder.java +++ b/src/test/java/vavi/sound/adpcm/dvi/Decoder.java @@ -32,7 +32,7 @@ public static void main(String[] args) throws Exception { } /** - * big-endian 出力 + * big-endian output */ static void b(String[] args) throws IOException { @@ -56,7 +56,7 @@ static void b(String[] args) throws IOException { } /** - * little-endian 出力 + * little-endian output */ static void a(String[] args) throws IOException { @@ -79,5 +79,3 @@ static void a(String[] args) throws IOException { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/dvi/DviInputStreamTest.java b/src/test/java/vavi/sound/adpcm/dvi/DviInputStreamTest.java index 2ae4a3e..90a7a7f 100644 --- a/src/test/java/vavi/sound/adpcm/dvi/DviInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/dvi/DviInputStreamTest.java @@ -94,5 +94,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/dvi/DviOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/dvi/DviOutputStreamTest.java index aec3329..cb77669 100644 --- a/src/test/java/vavi/sound/adpcm/dvi/DviOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/dvi/DviOutputStreamTest.java @@ -66,5 +66,3 @@ void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/dvi/Encoder.java b/src/test/java/vavi/sound/adpcm/dvi/Encoder.java index 8903e44..532e19c 100644 --- a/src/test/java/vavi/sound/adpcm/dvi/Encoder.java +++ b/src/test/java/vavi/sound/adpcm/dvi/Encoder.java @@ -43,5 +43,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ima/ImaInputStreamTest.java b/src/test/java/vavi/sound/adpcm/ima/ImaInputStreamTest.java index c565b36..b157f43 100644 --- a/src/test/java/vavi/sound/adpcm/ima/ImaInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ima/ImaInputStreamTest.java @@ -135,5 +135,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ima/ImaOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/ima/ImaOutputStreamTest.java index 234de03..aecdec9 100644 --- a/src/test/java/vavi/sound/adpcm/ima/ImaOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ima/ImaOutputStreamTest.java @@ -117,7 +117,7 @@ public void test1() throws Exception { } /** - * TODO input engine と output engine の結合がうまくいかない + * TODO The combination of input engine and output engine does not work properly. */ @Test @Disabled @@ -265,5 +265,3 @@ public void test3() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(new File(outFile))); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ma/MaInputStreamTest.java b/src/test/java/vavi/sound/adpcm/ma/MaInputStreamTest.java index 51c498a..80778f4 100644 --- a/src/test/java/vavi/sound/adpcm/ma/MaInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ma/MaInputStreamTest.java @@ -104,5 +104,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ma/MaOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/ma/MaOutputStreamTest.java index d4300a1..479c665 100644 --- a/src/test/java/vavi/sound/adpcm/ma/MaOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ma/MaOutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ms/MsInputStreamTest.java b/src/test/java/vavi/sound/adpcm/ms/MsInputStreamTest.java index 8790912..0dab566 100644 --- a/src/test/java/vavi/sound/adpcm/ms/MsInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ms/MsInputStreamTest.java @@ -79,11 +79,12 @@ public void test1() throws Exception { Debug.println(Level.FINE, "ext size: " + ledis.available()); int samplesPerBlock = ledis.readShort(); int nCoefs = ledis.readShort(); +Debug.println(Level.FINE, "nCoefs: " + nCoefs); int[][] iCoefs = new int[nCoefs][2]; for (int i = 0; i < nCoefs; i++) { for (int j = 0; j < 2; j++) { iCoefs[i][j] = ledis.readShort(); -Debug.printf(Level.FINE, "iCoef[%d][%d]: %04x: %d\n", i, j, iCoefs[i][j], iCoefs[i][j]); +Debug.printf(Level.FINE, "iCoef[%d][%d]: %04x: %d\n", i, j, iCoefs[i][j] & 0xffff, iCoefs[i][j] & 0xffff); } } ledis.close(); @@ -119,11 +120,7 @@ public void test1() throws Exception { DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(audioFormat); -line.addLineListener(ev -> { -Debug.println(Level.FINE, ev.getType()); - if (LineEvent.Type.STOP == ev.getType()) { - } -}); +line.addLineListener(ev -> Debug.println(Level.FINE, ev.getType())); line.start(); volume(line, volume); @@ -146,5 +143,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ms/MsOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/ms/MsOutputStreamTest.java index e5d3535..245b2ea 100644 --- a/src/test/java/vavi/sound/adpcm/ms/MsOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ms/MsOutputStreamTest.java @@ -186,5 +186,3 @@ public void test3() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/oki/Alaw.java b/src/test/java/vavi/sound/adpcm/oki/Alaw.java index 810b5b5..d34ae98 100644 --- a/src/test/java/vavi/sound/adpcm/oki/Alaw.java +++ b/src/test/java/vavi/sound/adpcm/oki/Alaw.java @@ -10,7 +10,7 @@ /** * A-law codec. *

    - * TODO ccitt G.711 なので統合する + * TODO since this class is ccitt G.711, it will be integrated. *

    * @author Naohide Sano (nsano) * @version 0.00 030817 nsano initial version
    @@ -127,5 +127,3 @@ public Alaw() { this.encodeTable = lintoalaw; } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/oki/OkiInputStreamTest.java b/src/test/java/vavi/sound/adpcm/oki/OkiInputStreamTest.java index b2f5bc2..1e42db1 100644 --- a/src/test/java/vavi/sound/adpcm/oki/OkiInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/oki/OkiInputStreamTest.java @@ -98,5 +98,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/oki/OkiOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/oki/OkiOutputStreamTest.java index f000d90..b94aad7 100644 --- a/src/test/java/vavi/sound/adpcm/oki/OkiOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/oki/OkiOutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/oki/Ulaw.java b/src/test/java/vavi/sound/adpcm/oki/Ulaw.java index 6e3dcda..f693b64 100644 --- a/src/test/java/vavi/sound/adpcm/oki/Ulaw.java +++ b/src/test/java/vavi/sound/adpcm/oki/Ulaw.java @@ -10,7 +10,7 @@ /** * μ-law codec. *

    - * TODO ccitt G.711 なので統合する + * TODO since this class is ccitt G.711, it will be integrated. *

    * @author Naohide Sano (nsano) * @version 0.00 030817 nsano initial version
    @@ -131,5 +131,3 @@ public Ulaw() { this.encodeTable = lintoulaw; } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/oki/Xlaw.java b/src/test/java/vavi/sound/adpcm/oki/Xlaw.java index cda4daa..7aa3149 100644 --- a/src/test/java/vavi/sound/adpcm/oki/Xlaw.java +++ b/src/test/java/vavi/sound/adpcm/oki/Xlaw.java @@ -14,7 +14,7 @@ /** * x-law codec base class. *

    - * TODO ccitt G.711 なので統合する + * TODO since this class is ccitt G.711, it will be integrated. *

    * @author Naohide Sano (nsano) * @version 0.00 030817 nsano initial version
    @@ -92,5 +92,3 @@ public int encode(int linear) { } } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/rohm/RohmInputStreamTest.java b/src/test/java/vavi/sound/adpcm/rohm/RohmInputStreamTest.java index 470b4ce..81c0465 100644 --- a/src/test/java/vavi/sound/adpcm/rohm/RohmInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/rohm/RohmInputStreamTest.java @@ -104,5 +104,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/rohm/RohmOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/rohm/RohmOutputStreamTest.java index 05b4428..6ddbe8c 100644 --- a/src/test/java/vavi/sound/adpcm/rohm/RohmOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/rohm/RohmOutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/vox/VoxInputStreamTest.java b/src/test/java/vavi/sound/adpcm/vox/VoxInputStreamTest.java index 7bcb531..a36f68e 100644 --- a/src/test/java/vavi/sound/adpcm/vox/VoxInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/vox/VoxInputStreamTest.java @@ -145,5 +145,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/vox/VoxOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/vox/VoxOutputStreamTest.java index 551efdb..f69fec3 100644 --- a/src/test/java/vavi/sound/adpcm/vox/VoxOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/vox/VoxOutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/yamaha/YamahaInputStreamTest.java b/src/test/java/vavi/sound/adpcm/yamaha/YamahaInputStreamTest.java index 13475cb..b2520d3 100644 --- a/src/test/java/vavi/sound/adpcm/yamaha/YamahaInputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/yamaha/YamahaInputStreamTest.java @@ -157,5 +157,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/yamaha/YamahaOutputStreamTest.java b/src/test/java/vavi/sound/adpcm/yamaha/YamahaOutputStreamTest.java index c382f6c..85d06dc 100644 --- a/src/test/java/vavi/sound/adpcm/yamaha/YamahaOutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/yamaha/YamahaOutputStreamTest.java @@ -120,5 +120,3 @@ public static void main(String[] args) throws Exception { is.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ym2608/Ym2608InputStreamTest.java b/src/test/java/vavi/sound/adpcm/ym2608/Ym2608InputStreamTest.java index c2180f3..fac0777 100644 --- a/src/test/java/vavi/sound/adpcm/ym2608/Ym2608InputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ym2608/Ym2608InputStreamTest.java @@ -91,5 +91,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/adpcm/ym2608/Ym2608OutputStreamTest.java b/src/test/java/vavi/sound/adpcm/ym2608/Ym2608OutputStreamTest.java index ccd8478..6ab4810 100644 --- a/src/test/java/vavi/sound/adpcm/ym2608/Ym2608OutputStreamTest.java +++ b/src/test/java/vavi/sound/adpcm/ym2608/Ym2608OutputStreamTest.java @@ -64,5 +64,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/MfiSystemTest.java b/src/test/java/vavi/sound/mfi/MfiSystemTest.java index 90f6d03..3df491f 100644 --- a/src/test/java/vavi/sound/mfi/MfiSystemTest.java +++ b/src/test/java/vavi/sound/mfi/MfiSystemTest.java @@ -73,5 +73,3 @@ public static void main(String[] args) throws Exception { } } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/MfiContextTest.java b/src/test/java/vavi/sound/mfi/vavi/MfiContextTest.java index 62fa80d..17a3c18 100644 --- a/src/test/java/vavi/sound/mfi/vavi/MfiContextTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/MfiContextTest.java @@ -81,5 +81,3 @@ public static void main(String[] args) throws Exception { System.exit(0); } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/MfiConvertibleTest.java b/src/test/java/vavi/sound/mfi/vavi/MfiConvertibleTest.java index fd24ce0..7d19242 100644 --- a/src/test/java/vavi/sound/mfi/vavi/MfiConvertibleTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/MfiConvertibleTest.java @@ -30,5 +30,3 @@ void test() { assertNull(converter); } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/VaviMfiFileWriterTest.java b/src/test/java/vavi/sound/mfi/vavi/VaviMfiFileWriterTest.java index dc10fe1..ed14d46 100644 --- a/src/test/java/vavi/sound/mfi/vavi/VaviMfiFileWriterTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/VaviMfiFileWriterTest.java @@ -12,8 +12,13 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.NoSuchElementException; import java.util.logging.Level; +import javax.sound.midi.MidiEvent; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.ShortMessage; + import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -27,6 +32,7 @@ import vavi.sound.mfi.vavi.track.CuePointMessage; import vavi.sound.mfi.vavi.track.EndOfTrackMessage; import vavi.sound.mfi.vavi.track.TempoMessage; +import vavi.sound.midi.MidiUtil; import vavi.util.Debug; import vavi.util.win32.WAVE; @@ -45,16 +51,17 @@ static void setup() throws IOException { } /** - * Creates .mld w/ voice file. wav ファイルはモノラルのみです - * サンプリングレートは変更されません + * Creates .mld w/ voice file. wav files are mono only + * sampling rate remains unchanged *

    - * TODO 65535 bytes を超えたときの処理 + * TODO processing when exceeding 65535 bytes *

    * input wav(PCM mono) file * output mld file */ @Test public void test1() throws Exception { +Debug.println(Level.FINER, "vavi.util.win32.WAVE.data.notLoadData: " + System.getProperty("vavi.util.win32.WAVE.data.notLoadData")); InputStream in = new BufferedInputStream(VaviMfiFileWriterTest.class.getResourceAsStream("/ooo_m.wav")); WAVE wave = WAVE.readFrom(in, WAVE.class); @@ -126,122 +133,114 @@ private void d505i(Track track, byte[] pcm, int sampleRate, int delta) } // /** -// * 同じ channel で次の {@link ShortMessage#NOTE_OFF}, {@link ShortMessage#CONTROL_CHANGE} -// * である MIDI イベントを取得します。 +// * Get the following MIDI events on the same channel: +// * {@link ShortMessage#NOTE_OFF}, {@link ShortMessage#CONTROL_CHANGE}. // * -// * @throws NoSuchElementException 次のイベントがない -// * @throws IllegalStateException 現在のイベントは {@link ShortMessage} ではない +// * @throws NoSuchElementException no next event +// * @throws IllegalStateException current event is not {@link ShortMessage} // */ -/* - public MidiEvent getNoteOffOrControllChangeMidiEvent() throws NoSuchElementException { - - ShortMessage shortMessage = null; - - MidiEvent midiEvent = midiEvents.get(midiEventIndex); - MidiMessage midiMessage = midiEvent.getMessage(); - if (midiMessage instanceof ShortMessage) { - shortMessage = (ShortMessage) midiMessage; - } else { - throw new IllegalStateException("current is not ShortMessage"); - } - - int channel = shortMessage.getChannel(); - int data1 = shortMessage.getData1(); - - for (int i = midiEventIndex + 1; i < midiEvents.size(); i++) { - midiEvent = midiEvents.get(i); - midiMessage = midiEvent.getMessage(); - if (midiMessage instanceof ShortMessage) { - shortMessage = (ShortMessage) midiMessage; - if (shortMessage.getChannel() == channel && - shortMessage.getData1() == data1) { - // next note off - noteOffEventUsed.set(i); // 消費フラグ on - return midiEvent; - } else if (shortMessage.getChannel() == channel && - shortMessage.getCommand() == ShortMessage.CONTROL_CHANGE) { - // next control change - String key = "midi.short." + shortMessage.getCommand() + "." + shortMessage.getData1(); - MfiConvertible convertible = MfiConvertibleFactory.getConverter(key); - // TODO Converter があるかどうか - if (convertible == null) { - continue; - } -Debug.println("(NEXT): " + MidiUtil.paramString(midiMessage) + ", " + convertible.toString()); - - // next note off - for (int j = i + 1; j < midiEvents.size(); j++) { - MidiEvent farMidiEvent = midiEvents.get(j); - MidiMessage farMidiMessage = farMidiEvent.getMessage(); - if (farMidiMessage instanceof ShortMessage) { - ShortMessage farShortMessage = (ShortMessage) farMidiMessage; - if (farShortMessage.getChannel() == channel && - farShortMessage.getData1() == data1) { - // far next note off - noteOffEventUsed.set(i); // 消費フラグ on - } - } - } - - // - return midiEvent; - } - } - } - - throw new NoSuchElementException(channel + "ch, " + data1); - } -*/ - +// public MidiEvent getNoteOffOrControllChangeMidiEvent() throws NoSuchElementException { +// +// ShortMessage shortMessage = null; +// +// MidiEvent midiEvent = midiEvents.get(midiEventIndex); +// MidiMessage midiMessage = midiEvent.getMessage(); +// if (midiMessage instanceof ShortMessage) { +// shortMessage = (ShortMessage) midiMessage; +// } else { +// throw new IllegalStateException("current is not ShortMessage"); +// } +// +// int channel = shortMessage.getChannel(); +// int data1 = shortMessage.getData1(); +// +// for (int i = midiEventIndex + 1; i < midiEvents.size(); i++) { +// midiEvent = midiEvents.get(i); +// midiMessage = midiEvent.getMessage(); +// if (midiMessage instanceof ShortMessage) { +// shortMessage = (ShortMessage) midiMessage; +// if (shortMessage.getChannel() == channel && +// shortMessage.getData1() == data1) { +// // next note off +// noteOffEventUsed.set(i); // consumed flag on +// return midiEvent; +// } else if (shortMessage.getChannel() == channel && +// shortMessage.getCommand() == ShortMessage.CONTROL_CHANGE) { +// // next control change +// String key = "midi.short." + shortMessage.getCommand() + "." + shortMessage.getData1(); +// MfiConvertible convertible = MfiConvertibleFactory.getConverter(key); +// // TODO Converter whether exists +// if (convertible == null) { +// continue; +// } +//Debug.println("(NEXT): " + MidiUtil.paramString(midiMessage) + ", " + convertible.toString()); +// +// // next note off +// for (int j = i + 1; j < midiEvents.size(); j++) { +// MidiEvent farMidiEvent = midiEvents.get(j); +// MidiMessage farMidiMessage = farMidiEvent.getMessage(); +// if (farMidiMessage instanceof ShortMessage) { +// ShortMessage farShortMessage = (ShortMessage) farMidiMessage; +// if (farShortMessage.getChannel() == channel && +// farShortMessage.getData1() == data1) { +// // far next note off +// noteOffEventUsed.set(i); // consumed flag on +// } +// } +// } +// +// // +// return midiEvent; +// } +// } +// } +// +// throw new NoSuchElementException(channel + "ch, " + data1); +// } +// // /** -// * 同じ channel で次の {@link ShortMessage} である MIDI イベントを取得します。 +// * Get the next {@link ShortMessage} MIDI event on the same channel. // * (not used) -// * @throws NoSuchElementException 次の MIDI イベントがない -// * @throws IllegalStateException 現在のイベントは {@link ShortMessage} ではない +// * @throws NoSuchElementException no next MIDI event +// * @throws IllegalStateException current event is not {@link ShortMessage} // */ -/* - public MidiEvent getNextMidiEvent() throws NoSuchElementException { - - ShortMessage shortMessage = null; - - MidiEvent midiEvent = midiEvents.get(midiEventIndex); - MidiMessage midiMessage = midiEvent.getMessage(); - if (midiMessage instanceof ShortMessage) { - shortMessage = (ShortMessage) midiMessage; - } else { - throw new IllegalStateException("current is not ShortMessage"); - } - - int channel = shortMessage.getChannel(); - int data1 = shortMessage.getData1(); - - for (int i = midiEventIndex + 1; i < midiEvents.size(); i++) { - midiEvent = midiEvents.get(i); - midiMessage = midiEvent.getMessage(); - if (midiMessage instanceof ShortMessage) { - shortMessage = (ShortMessage) midiMessage; - if (shortMessage.getChannel() == channel && - shortMessage.getCommand() == ShortMessage.NOTE_ON && - shortMessage.getData1() != data1) { -Debug.println("next: " + shortMessage.getChannel() + "ch, " + shortMessage.getData1()); - return midiEvent; - } - } - } - - throw new NoSuchElementException("no next event of channel: " + channel); - } -*/ +// public MidiEvent getNextMidiEvent() throws NoSuchElementException { +// +// ShortMessage shortMessage = null; +// +// MidiEvent midiEvent = midiEvents.get(midiEventIndex); +// MidiMessage midiMessage = midiEvent.getMessage(); +// if (midiMessage instanceof ShortMessage) { +// shortMessage = (ShortMessage) midiMessage; +// } else { +// throw new IllegalStateException("current is not ShortMessage"); +// } +// +// int channel = shortMessage.getChannel(); +// int data1 = shortMessage.getData1(); +// +// for (int i = midiEventIndex + 1; i < midiEvents.size(); i++) { +// midiEvent = midiEvents.get(i); +// midiMessage = midiEvent.getMessage(); +// if (midiMessage instanceof ShortMessage) { +// shortMessage = (ShortMessage) midiMessage; +// if (shortMessage.getChannel() == channel && +// shortMessage.getCommand() == ShortMessage.NOTE_ON && +// shortMessage.getData1() != data1) { +//Debug.println("next: " + shortMessage.getChannel() + "ch, " + shortMessage.getData1()); +// return midiEvent; +// } +// } +// } +// +// throw new NoSuchElementException("no next event of channel: " + channel); +// } +// // /** -// * @return 補正なし Δタイム -// * TODO 何でこれでうまくいくの? +// * @return no correction Δ time +// * TODO why does this work? // */ -/* - private int retrieveDelta(int mfiTrackNumber, long currentTick) { - return (int) Math.round((currentTick - previousTicks[mfiTrackNumber]) / scale); - } - -*/ +// private int retrieveDelta(int mfiTrackNumber, long currentTick) { +// return (int) Math.round((currentTick - previousTicks[mfiTrackNumber]) / scale); +// } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/VaviMidiConverterTest.java b/src/test/java/vavi/sound/mfi/vavi/VaviMidiConverterTest.java index c0ece0b..669c087 100644 --- a/src/test/java/vavi/sound/mfi/vavi/VaviMidiConverterTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/VaviMidiConverterTest.java @@ -128,5 +128,3 @@ public static void main(String[] args) throws Exception { } } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/sequencer/AudioEngineTest.java b/src/test/java/vavi/sound/mfi/vavi/sequencer/AudioEngineTest.java index 64b79e7..0ee5d45 100644 --- a/src/test/java/vavi/sound/mfi/vavi/sequencer/AudioEngineTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/sequencer/AudioEngineTest.java @@ -55,5 +55,3 @@ public void test3() { assertNull(audioEngine); } } - -/* */ diff --git a/src/test/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencerTest.java b/src/test/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencerTest.java index 1f18ce7..62b2a01 100644 --- a/src/test/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencerTest.java +++ b/src/test/java/vavi/sound/mfi/vavi/sequencer/MachineDependentSequencerTest.java @@ -48,5 +48,3 @@ public void test() { assertTrue(mds instanceof vavi.sound.mfi.vavi.sharp.SharpSequencer); } } - -/* */ diff --git a/src/test/java/vavi/sound/midi/MidiUtilTest.java b/src/test/java/vavi/sound/midi/MidiUtilTest.java index b360e24..3cfc7db 100644 --- a/src/test/java/vavi/sound/midi/MidiUtilTest.java +++ b/src/test/java/vavi/sound/midi/MidiUtilTest.java @@ -33,20 +33,20 @@ public class MidiUtilTest { /** * Tests {@link MidiUtil#readVariableLength(java.io.DataInput)}. *
    -     *  実際の数値 | 可変長での表現
    -     * ------------+-------------
    -     *  00000000   | 00
    -     *  00000040   | 40
    -     *  0000007F   | 7F
    -     *  00000080   | 81 00
    -     *  00002000   | C0 00
    -     *  00003FFF   | FF 7F
    -     *  00004000   | 81 80 00
    -     *  00100000   | C0 80 00
    -     *  001FFFFF   | FF FF 7F
    -     *  00200000   | 81 80 80 00
    -     *  08000000   | C0 80 80 00
    -     *  0FFFFFFF   | FF FF FF 7F
    +     *  actual number | variable length expression
    +     * ---------------+----------------------------
    +     *  00000000      | 00
    +     *  00000040      | 40
    +     *  0000007F      | 7F
    +     *  00000080      | 81 00
    +     *  00002000      | C0 00
    +     *  00003FFF      | FF 7F
    +     *  00004000      | 81 80 00
    +     *  00100000      | C0 80 00
    +     *  001FFFFF      | FF FF 7F
    +     *  00200000      | 81 80 80 00
    +     *  08000000      | C0 80 80 00
    +     *  0FFFFFFF      | FF FF FF 7F
          * 
    */ @Test @@ -102,12 +102,10 @@ public void test01() throws Exception { /** * {@link MidiUtil#readVariableLength(java.io.DataInput)} */ - private int wr(int v) throws Exception { + private static int wr(int v) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); MidiUtil.writeVarInt(new DataOutputStream(baos), v); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); return MidiUtil.readVariableLength(new DataInputStream(bais)); } } - -/* */ diff --git a/src/test/java/vavi/sound/midi/mfi/MfiMidiFileReaderTest.java b/src/test/java/vavi/sound/midi/mfi/MfiMidiFileReaderTest.java index 83c4349..caf59ce 100644 --- a/src/test/java/vavi/sound/midi/mfi/MfiMidiFileReaderTest.java +++ b/src/test/java/vavi/sound/midi/mfi/MfiMidiFileReaderTest.java @@ -72,5 +72,3 @@ public static void main(String[] args) throws Exception { sequencer.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/midi/mfi/MfiVaviSequenceTest.java b/src/test/java/vavi/sound/midi/mfi/MfiVaviSequenceTest.java index 7fba054..72c7012 100644 --- a/src/test/java/vavi/sound/midi/mfi/MfiVaviSequenceTest.java +++ b/src/test/java/vavi/sound/midi/mfi/MfiVaviSequenceTest.java @@ -62,8 +62,5 @@ public void test4() throws Exception { public static void main(String[] args) throws Exception { MidiFileFormat mff = MidiSystem.getMidiFileFormat(new File(args[0])); System.err.println(StringUtil.paramString(mff)); - System.exit(0); } } - -/* */ diff --git a/src/test/java/vavi/sound/midi/smaf/SmafVaviSequenceTest.java b/src/test/java/vavi/sound/midi/smaf/SmafVaviSequenceTest.java index db64075..788e698 100644 --- a/src/test/java/vavi/sound/midi/smaf/SmafVaviSequenceTest.java +++ b/src/test/java/vavi/sound/midi/smaf/SmafVaviSequenceTest.java @@ -62,8 +62,5 @@ public void test4() throws Exception { public static void main(String[] args) throws Exception { MidiFileFormat mff = MidiSystem.getMidiFileFormat(new File(args[0])); System.err.println(StringUtil.paramString(mff)); - System.exit(0); } } - -/* */ diff --git a/src/test/java/vavi/sound/mobile/BasicAudioEngineTest.java b/src/test/java/vavi/sound/mobile/BasicAudioEngineTest.java index ad29695..a9a5201 100644 --- a/src/test/java/vavi/sound/mobile/BasicAudioEngineTest.java +++ b/src/test/java/vavi/sound/mobile/BasicAudioEngineTest.java @@ -33,7 +33,7 @@ */ public class BasicAudioEngineTest { - static final float volume = (float) Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); + static final float volume = (float) Double.parseDouble(System.getProperty("vavi.test.volume.midi", "0.2")); @Test public void test() throws Exception { @@ -168,5 +168,3 @@ public static void main(String[] args) throws Exception { sequencer.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/pcm/resampling/ssrc/SSRCTest.java b/src/test/java/vavi/sound/pcm/resampling/ssrc/SSRCTest.java index bc92faa..f4d72e8 100644 --- a/src/test/java/vavi/sound/pcm/resampling/ssrc/SSRCTest.java +++ b/src/test/java/vavi/sound/pcm/resampling/ssrc/SSRCTest.java @@ -220,5 +220,3 @@ public void test4() throws Exception { line.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/pcm/resampling/ssrc/fftsgTest.java b/src/test/java/vavi/sound/pcm/resampling/ssrc/fftsgTest.java index 2cfbd86..921b7c0 100644 --- a/src/test/java/vavi/sound/pcm/resampling/ssrc/fftsgTest.java +++ b/src/test/java/vavi/sound/pcm/resampling/ssrc/fftsgTest.java @@ -147,5 +147,3 @@ private static double checkError(int nini, int nend, double scale, double[] a) { return err; } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReaderTest.java index a350d74..03cc942 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/ccitt/G721AudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/ccitt/G721RawAudioFileReaderTest.java @@ -29,12 +29,12 @@ /** - * G721AudioFileReaderTest. + * G721RawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 060120 nsano initial version
    */ -public class G721AudioFileReaderTest { +public class G721RawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -103,5 +103,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/dvi/DviAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/dvi/DviRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/dvi/DviAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/dvi/DviRawAudioFileReaderTest.java index ca42ad5..a0a6c4d 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/dvi/DviAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/dvi/DviRawAudioFileReaderTest.java @@ -28,12 +28,12 @@ /** - * DviAudioFileReaderTest. + * DviRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class DviAudioFileReaderTest { +public class DviRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -102,5 +102,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/ima/ImaAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReaderTest.java similarity index 82% rename from src/test/java/vavi/sound/sampled/adpcm/ima/ImaAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReaderTest.java index 2f157ee..82f5599 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/ima/ImaAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/ima/ImaWaveAudioFileReaderTest.java @@ -12,6 +12,7 @@ import java.io.OutputStream; import java.nio.ByteOrder; import java.nio.file.Files; +import java.util.Arrays; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; @@ -20,6 +21,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import vavi.util.Debug; import vavix.util.Checksum; @@ -29,13 +31,12 @@ /** - * ImaAudioFileReaderTest. + * ImaWaveAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -@Disabled -public class ImaAudioFileReaderTest { +public class ImaWaveAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -51,6 +52,13 @@ public void setup() throws IOException { } @Test + public void test0() throws Exception { + AudioInputStream ais = AudioSystem.getAudioInputStream(ImaWaveAudioFileReader.class.getResource(inFile)); + Arrays.stream(AudioSystem.getAudioFileTypes(ais)).forEach(System.err::println); + } + + @Test + @DisplayName("extract from wav") public void test1() throws Exception { int sampleRate = 8000; @@ -66,17 +74,7 @@ public void test1() throws Exception { byteOrder.equals(ByteOrder.BIG_ENDIAN)); System.err.println(outFormat); - AudioFormat inFormat = new AudioFormat( - ImaEncoding.IMA, - sampleRate, - 16, - 1, - AudioSystem.NOT_SPECIFIED, - sampleRate, - false); -System.err.println(inFormat); - - AudioInputStream iais = new AudioInputStream(getClass().getResourceAsStream(inFile), inFormat, AudioSystem.NOT_SPECIFIED); + AudioInputStream iais = AudioSystem.getAudioInputStream(getClass().getResourceAsStream(inFile)); System.err.println("in available: " + iais.available() + ", " + iais.getFormat()); AudioInputStream oais = AudioSystem.getAudioInputStream(outFormat, iais); System.err.println("out available: " + oais.available() + ", " + oais.getFormat()); @@ -87,9 +85,10 @@ public void test1() throws Exception { SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(outFormat); line.start(); +volume(line, volume); + byte[] buf = new byte[1024]; int l; - volume(line, volume); while (oais.available() > 0) { l = oais.read(buf, 0, 1024); @@ -104,5 +103,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/ma/MaAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/ma/MaRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/ma/MaAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/ma/MaRawAudioFileReaderTest.java index f0f062d..740820c 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/ma/MaAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/ma/MaRawAudioFileReaderTest.java @@ -28,12 +28,12 @@ /** - * MaAudioFileReaderTest. + * MaRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class MaAudioFileReaderTest { +public class MaRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -102,5 +102,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/ms/MsAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReaderTest.java similarity index 84% rename from src/test/java/vavi/sound/sampled/adpcm/ms/MsAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReaderTest.java index f7d47f2..47b93eb 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/ms/MsAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/ms/MsWaveAudioFileReaderTest.java @@ -29,13 +29,12 @@ /** - * MsAudioFileReaderTest. + * MsWaveAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -@Disabled -public class MsAudioFileReaderTest { +public class MsWaveAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -66,17 +65,7 @@ public void test1() throws Exception { byteOrder.equals(ByteOrder.BIG_ENDIAN)); System.err.println(outFormat); - AudioFormat inFormat = new AudioFormat( - MsEncoding.MS, - sampleRate, - 16, - 1, - AudioSystem.NOT_SPECIFIED, - sampleRate, - false); -System.err.println(inFormat); - - AudioInputStream iais = new AudioInputStream(getClass().getResourceAsStream(inFile), inFormat, AudioSystem.NOT_SPECIFIED); + AudioInputStream iais = AudioSystem.getAudioInputStream(getClass().getResource(inFile)); System.err.println("in available: " + iais.available() + ", " + iais.getFormat()); AudioInputStream oais = AudioSystem.getAudioInputStream(outFormat, iais); System.err.println("out available: " + oais.available() + ", " + oais.getFormat()); @@ -87,9 +76,9 @@ public void test1() throws Exception { SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(outFormat); line.start(); +volume(line, volume); byte[] buf = new byte[1024]; int l; - volume(line, volume); while (oais.available() > 0) { l = oais.read(buf, 0, 1024); @@ -104,5 +93,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/oki/OkiAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/oki/OkiRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/oki/OkiAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/oki/OkiRawAudioFileReaderTest.java index c095da0..8924bf8 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/oki/OkiAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/oki/OkiRawAudioFileReaderTest.java @@ -29,12 +29,12 @@ /** - * OkiAudioFileReaderTest. + * OkiRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class OkiAudioFileReaderTest { +public class OkiRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -103,5 +103,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/rhom/RohmAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/rhom/RohmRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/rhom/RohmAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/rhom/RohmRawAudioFileReaderTest.java index 8e39e9e..3011868 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/rhom/RohmAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/rhom/RohmRawAudioFileReaderTest.java @@ -30,12 +30,12 @@ /** - * RohmAudioFileReaderTest. + * RohmRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class RohmAudioFileReaderTest { +public class RohmRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -104,5 +104,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/vox/VoxAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/vox/VoxRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/vox/VoxAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/vox/VoxRawAudioFileReaderTest.java index f0c516d..4e547e3 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/vox/VoxAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/vox/VoxRawAudioFileReaderTest.java @@ -29,12 +29,12 @@ /** - * VoxAudioFileReaderTest. + * VoxRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class VoxAudioFileReaderTest { +public class VoxRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -103,5 +103,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaAudioFileReaderTest.java b/src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaRawAudioFileReaderTest.java similarity index 97% rename from src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaAudioFileReaderTest.java rename to src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaRawAudioFileReaderTest.java index aca0540..306bec1 100644 --- a/src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaAudioFileReaderTest.java +++ b/src/test/java/vavi/sound/sampled/adpcm/yamaha/YamahaRawAudioFileReaderTest.java @@ -28,12 +28,12 @@ /** - * YamahaAudioFileReaderTest. + * YamahaRawAudioFileReaderTest. * * @author Naohide Sano (nsano) * @version 0.00 201020 nsano initial version
    */ -public class YamahaAudioFileReaderTest { +public class YamahaRawAudioFileReaderTest { static final double volume = Double.parseDouble(System.getProperty("vavi.test.volume", "0.2")); @@ -102,5 +102,3 @@ public void test1() throws Exception { assertEquals(Checksum.getChecksum(getClass().getResourceAsStream(correctFile)), Checksum.getChecksum(outFile)); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/mfi/MfiAudioFileWriterTest.java b/src/test/java/vavi/sound/sampled/mfi/MfiAudioFileWriterTest.java index 6eb37ec..55fa55b 100644 --- a/src/test/java/vavi/sound/sampled/mfi/MfiAudioFileWriterTest.java +++ b/src/test/java/vavi/sound/sampled/mfi/MfiAudioFileWriterTest.java @@ -89,5 +89,3 @@ public static void main(String[] args) throws Exception { System.exit(0); } } - -/* */ diff --git a/src/test/java/vavi/sound/sampled/smaf/SmafAudioFileWriterTest.java b/src/test/java/vavi/sound/sampled/smaf/SmafAudioFileWriterTest.java index d7aab02..d5261b6 100644 --- a/src/test/java/vavi/sound/sampled/smaf/SmafAudioFileWriterTest.java +++ b/src/test/java/vavi/sound/sampled/smaf/SmafAudioFileWriterTest.java @@ -106,5 +106,3 @@ public static void main(String[] args) throws Exception { ais.close(); } } - -/* */ diff --git a/src/test/java/vavi/sound/smaf/ChunkTest.java b/src/test/java/vavi/sound/smaf/ChunkTest.java index 36bb2a8..8723673 100644 --- a/src/test/java/vavi/sound/smaf/ChunkTest.java +++ b/src/test/java/vavi/sound/smaf/ChunkTest.java @@ -14,5 +14,3 @@ */ class ChunkTest { } - -/* */ diff --git a/src/test/java/vavi/sound/smaf/SmafFileFormatTest.java b/src/test/java/vavi/sound/smaf/SmafFileFormatTest.java index 048fe1b..d03d176 100644 --- a/src/test/java/vavi/sound/smaf/SmafFileFormatTest.java +++ b/src/test/java/vavi/sound/smaf/SmafFileFormatTest.java @@ -39,5 +39,3 @@ public static void main(String[] args) throws Exception { SmafSystem.getSmafFileFormat(new BufferedInputStream(Files.newInputStream(Paths.get(args[0])))); } } - -/* */ diff --git a/src/test/java/vavi/sound/smaf/SmafSystemTest.java b/src/test/java/vavi/sound/smaf/SmafSystemTest.java index dcdf076..fc010fb 100644 --- a/src/test/java/vavi/sound/smaf/SmafSystemTest.java +++ b/src/test/java/vavi/sound/smaf/SmafSystemTest.java @@ -46,7 +46,7 @@ public void test() throws Exception { sequencer.close(); } - //------------------------------------------------------------------------- + //---- /** * Tests this class. @@ -111,5 +111,3 @@ public static void main(String[] args) throws Exception { //} } } - -/* */ diff --git a/src/test/java/vavi/sound/smaf/message/SmafContextTest.java b/src/test/java/vavi/sound/smaf/message/SmafContextTest.java index 918e608..0f744b0 100644 --- a/src/test/java/vavi/sound/smaf/message/SmafContextTest.java +++ b/src/test/java/vavi/sound/smaf/message/SmafContextTest.java @@ -83,5 +83,3 @@ public static void main(String[] args) throws Exception { System.exit(0); } } - -/* */ diff --git a/src/test/resources/logging.properties b/src/test/resources/logging.properties index 276bce7..3687257 100644 --- a/src/test/resources/logging.properties +++ b/src/test/resources/logging.properties @@ -3,5 +3,5 @@ handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=vavi.util.logging.VaviFormatter -#vavi.util.level=FINE +vavi.util.level=FINE