Package

Source Code of ASAP2WAV

/*
* ASAP2WAV.java - converter of ASAP-supported formats to WAV files
*
* Copyright (C) 2007-2009  Piotr Fusik
*
* This file is part of ASAP (Another Slight Atari Player),
* see http://asap.sourceforge.net
*
* ASAP is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* ASAP is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ASAP; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

import java.io.*;
import net.sf.asap.ASAP;
import net.sf.asap.ASAP_ModuleInfo;

public class ASAP2WAV
{
  private static String outputFilename = null;
  private static boolean outputHeader = true;
  private static int song = -1;
  private static int format = ASAP.FORMAT_S16_LE;
  private static int duration = -1;
  private static int muteMask = 0;

  private static void printHelp()
  {
    System.out.print(
      "Usage: java -jar asap2wav.jar [OPTIONS] INPUTFILE...\n" +
      "Each INPUTFILE must be in a supported format:\n" +
      "SAP, CMC, CM3, CMR, CMS, DMC, DLT, MPT, MPD, RMT, TMC, TM8 or TM2.\n" +
      "Options:\n" +
      "-o FILE     --output=FILE      Set output file name\n" +
      "-o -        --output=-         Write to standard output\n" +
      "-s SONG     --song=SONG        Select subsong number (zero-based)\n" +
      "-t TIME     --time=TIME        Set output length (MM:SS format)\n" +
      "-b          --byte-samples     Output 8-bit samples\n" +
      "-w          --word-samples     Output 16-bit samples (default)\n" +
      "            --raw              Output raw audio (no WAV header)\n" +
      "-m CHANNELS --mute=CHANNELS    Mute POKEY chanels (1-8)\n" +
      "-h          --help             Display this information\n" +
      "-v          --version          Display version information\n"
    );
  }

  private static void setSong(String s)
  {
    song = Integer.parseInt(s);
  }

  private static void setTime(String s)
  {
    duration = ASAP.parseDuration(s);
  }

  private static void setMuteMask(String s)
  {
    int mask = 0;
    for (int i = 0; i < s.length(); i++) {
      int c = s.charAt(i);
      if (c >= '1' && c <= '8')
        mask |= 1 << (c - '1');
    }
    muteMask = mask;
  }

  private static void processFile(String inputFilename) throws IOException
  {
    InputStream is = new FileInputStream(inputFilename);
    byte[] module = new byte[ASAP.MODULE_MAX];
    int module_len = is.read(module);
    is.close();
    ASAP asap = new ASAP();
    asap.load(inputFilename, module, module_len);
    ASAP_ModuleInfo module_info = asap.getModuleInfo();
    if (song < 0)
      song = module_info.default_song;
    if (duration < 0) {
      duration = module_info.durations[song];
      if (duration < 0)
        duration = 180 * 1000;
    }
    asap.playSong(song, duration);
    asap.mutePokeyChannels(muteMask);
    if (outputFilename == null) {
      int i = inputFilename.lastIndexOf('.');
      outputFilename = inputFilename.substring(0, i + 1) + (outputHeader ? "wav" : "raw");
    }
    OutputStream os;
    if (outputFilename.equals("-"))
      os = System.out;
    else
      os = new FileOutputStream(outputFilename);
    byte[] buffer = new byte[8192];
    if (outputHeader) {
      asap.getWavHeader(buffer, format);
      os.write(buffer, 0, ASAP.WAV_HEADER_BYTES);
    }
    int n_bytes;
    do {
      n_bytes = asap.generate(buffer, format);
      os.write(buffer, 0, n_bytes);
    } while (n_bytes == buffer.length);
    os.close();
    outputFilename = null;
    song = -1;
    duration = -1;
  }

  public static void main(String[] args) throws IOException
  {
    boolean noInputFiles = true;
    for (int i = 0; i < args.length; i++) {
      String arg = args[i];
      if (arg.charAt(0) != '-') {
        processFile(arg);
        noInputFiles = false;
      }
      else if (arg.equals("-o"))
        outputFilename = args[++i];
      else if (arg.startsWith("--output="))
        outputFilename = arg.substring(9);
      else if (arg.equals("-s"))
        setSong(args[++i]);
      else if (arg.startsWith("--song="))
        setSong(arg.substring(7));
      else if (arg.equals("-t"))
        setTime(args[++i]);
      else if (arg.startsWith("--time="))
        setTime(arg.substring(7));
      else if (arg.equals("-b") || arg.equals("--byte-samples"))
        format = ASAP.FORMAT_U8;
      else if (arg.equals("-w") || arg.equals("--word-samples"))
        format = ASAP.FORMAT_S16_LE;
      else if (arg.equals("--raw"))
        outputHeader = false;
      else if (arg.equals("-m"))
        setMuteMask(args[++i]);
      else if (arg.startsWith("--mute="))
        setMuteMask(arg.substring(7));
      else if (arg.equals("-h") || arg.equals("--help")) {
        printHelp();
        noInputFiles = false;
      }
      else if (arg.equals("-v") || arg.equals("--version")) {
        System.out.println("ASAP2WAV (Java) " + ASAP.VERSION);
        noInputFiles = false;
      }
      else
        throw new IllegalArgumentException("unknown option: " + arg);
    }
    if (noInputFiles) {
      printHelp();
      System.exit(1);
    }
  }
}
TOP

Related Classes of ASAP2WAV

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.