//Version 0.2.4 //changelog: arreglado problema con algunas versiones de archivos que contenĂ­an un namespace especĂ­fico //it does not even writes the song's name that seems to be stores in a comments just after the MELODY tag on the XML //but it does all the dirty job except setting the correct GAP time, that needs to be manually entered import org.jdom.*; import org.jdom.input.SAXBuilder; import org.jdom.output.*; import java.io.*; import java.util.*; import java.io.IOException; public class ss2us{ private String url; Document xmldoc; Element root; public StringBuffer txtdoc; private int conversionTime; private final boolean withDashes = true; //to maintain the dash-like SS lyrics private boolean conversionStarted; //the first note is our GAP tag static public void main(String[] argv){ try{ if(argv.length != 2){ System.out.println("Usage:\n\t%1: source file\n\t%2: target file"); System.exit(1); } System.out.println("Starting conversion of "+argv[0]); ss2us song = new ss2us(argv[0]); song.convert(); DataOutputStream dos = new DataOutputStream(new FileOutputStream(argv[1])); dos.writeBytes(song.txtdoc.toString()); }catch(IOException e){e.printStackTrace();} catch(Exception e){e.printStackTrace();} } public ss2us(String file) throws Exception{ SAXBuilder builder = new SAXBuilder(); FileInputStream fis; try{ fis = new FileInputStream(file); this.xmldoc = builder.build(fis); //a ver si funciona esta sintaxis root = xmldoc.getRootElement(); conversionTime = 0; conversionStarted = false; }catch(JDOMException e){e.printStackTrace();throw new Exception("Error en JDOM");} catch(IOException e){e.printStackTrace();throw new Exception("Error en IO");} } public void convert(){ String artist; Float tempo; Element el; if (root == null) return; Element melody = root; conversionTime = 0; //TEMPO //bpm has to be doubled tempo = new Float(Float.parseFloat(melody.getAttributeValue("Tempo"))); if (melody.getAttributeValue("Resolution").equals("Demisemiquaver")) tempo=new Float(tempo.floatValue()*2); //ARTIST //some xml files does not have any TRACK tag if (melody.getChild("TRACK")!=null) artist = melody.getChild("TRACK").getAttributeValue("Artist"); else artist = new String("Unknown"); //GAP System.out.println(melody); System.out.println(melody.getChild("SENTENCE", melody.getNamespace())); int gap = Integer.parseInt(melody.getChild("SENTENCE", melody.getNamespace()).getChild("NOTE", melody.getNamespace()).getAttributeValue("Duration")); gap *= 60000; gap /= (tempo.intValue()); //HEADER txtdoc = new StringBuffer(); txtdoc.append("#TITLE:\n"); txtdoc.append("#ARTIST:"+artist+"\n"); txtdoc.append("#MP3:\n"); txtdoc.append("#BPM:"+tempo.toString().replace('.',',')+"\n"); txtdoc.append("#GAP:"+gap); //We iterate through the SENTENCE tags Iterator sentIt = melody.getChildren("SENTENCE", melody.getNamespace()).iterator(); while(sentIt.hasNext()) txtdoc.append(sentenceConvert((Element) sentIt.next())); //End txtdoc.append("\nE"); //Credits txtdoc.append("\nConverted using SS2US by UltraStar Spanish User Grup (http://ultrastar.webcindario.com"); } private String sentenceConvert(Element sentenceSS){ boolean oneNoteAtLeast = false; StringBuffer sentence = new StringBuffer(); Element el; String lyric; if (!sentenceSS.getName().equals("SENTENCE")) return null; Iterator it = sentenceSS.getChildren("NOTE", root.getNamespace()).iterator(); while(it.hasNext()){ oneNoteAtLeast = true; el = (Element) it.next(); if (el.getAttributeValue("MidiNote").equals("0")){ if(conversionStarted) this.conversionTime += Integer.parseInt(el.getAttributeValue("Duration")); else conversionStarted = true; } else{ conversionStarted = true; /*if (withDashes) lyric = el.getAttributeValue("Lyric"); else lyric = el.getAttributeValue("Lyric").replaceAll("-", "");*/ lyric = el.getAttributeValue("Lyric"); lyric = new String(lyric+" "); String bonus = new String(""); if (el.getAttribute("bonus")!=null) if(el.getAttributeValue("Bonus").equals("Yes")) bonus = "*"; if (lyric.indexOf(" - ") > 0) lyric = lyric.substring(0, lyric.indexOf(" - ")); sentence.append("\n"+bonus+": " + conversionTime + " " + el.getAttributeValue("Duration") + " " +el.getAttributeValue("MidiNote")+ " "+lyric); this.conversionTime += Integer.parseInt(el.getAttributeValue("Duration")); } } if (oneNoteAtLeast) sentence.append("\n-"+this.conversionTime); return sentence.toString(); } }