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