/* * ID3V1Tag.java * * Created on 7-Oct-2003 * * Copyright (C)2003-2005 Paul Grebenc * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: ID3V1Tag.java,v 1.16 2005/05/05 05:15:00 paul Exp $ */ package org.blinkenlights.jid3.v1; import java.io.*; import org.blinkenlights.jid3.*; /** * @author paul * * The base class for ID3 V1 tags. * */ public abstract class ID3V1Tag extends ID3Tag { protected String m_sTitle = null; protected String m_sArtist = null; protected String m_sAlbum = null; protected String m_sYear = null; protected String m_sComment = null; protected Genre m_oGenre = null; /** * Constructor. */ public ID3V1Tag() { super(); } /** Set the title of the recording. * * @param sTitle the title of the recording (truncated to 30 characters, if longer) */ public void setTitle(String sTitle) { if (sTitle.length() > 30) { sTitle = sTitle.substring(0, 30); } m_sTitle = sTitle; } /** Get the title of the recording. * * @return the set title for the recording */ public String getTitle() { return m_sTitle; } /** Set the artist for the recording. * * @param sArtist the artist of the recording (truncated to 30 characters, if longer) */ public void setArtist(String sArtist) { if (sArtist.length() > 30) { sArtist = sArtist.substring(0, 30); } m_sArtist = sArtist; } /** Get the artist of the recording. * * @return the set artist for the recording */ public String getArtist() { return m_sArtist; } /** Set the name of the album from which the recording comes. * * @param sAlbum the name of the album (truncated to 30 characters, if longer) */ public void setAlbum(String sAlbum) { if (sAlbum.length() > 30) { sAlbum = sAlbum.substring(0, 30); } m_sAlbum = sAlbum; } /** Get the name of the album from which the recording comes. * * @return the set name of the album */ public String getAlbum() { return m_sAlbum; } /** Set the year in which the recording was made. * * @param sYear the year of the recording (up to 4 characters, should be numeric) */ public void setYear(String sYear) { if (sYear.length() > 4) { sYear = sYear.substring(0, 4); } m_sYear = sYear; } /** Get the year in which the recording was made. * * @return the set year of the recording */ public String getYear() { return m_sYear; } /** Set the comment field. * * @param sComment a comment field (truncated to 30 characters, if longer, or 28 characters in a v1.1 tag) */ abstract public void setComment(String sComment); /** Get the comment. * * @return the set comment */ public String getComment() { return m_sComment; } /** Set the genre of the recording, using one of the predefined genre values. * * @param oGenre the genre of the recording */ public void setGenre(Genre oGenre) { m_oGenre = oGenre; } /** Get the genre of the recording. * * @return the predefined genre of the recording */ public Genre getGenre() { return m_oGenre; } /** Read an ID3 V1 tag from an input stream. * * @param oIS the input stream from which to read a V1 tag * @return an object representing the tag just read * @throws ID3Exception if an error occurs while reading the tag */ public static ID3V1Tag read(InputStream oIS) throws ID3Exception { try { // title (30 bytes) byte[] abyTitle = new byte[30]; if (oIS.read(abyTitle) != 30) { throw new ID3Exception("Unexpected EOF while reading title."); } String sTitle = new String(abyTitle, 0, indexOfFirstNull(abyTitle)); // artist (30 bytes) byte[] abyArtist = new byte[30]; if (oIS.read(abyArtist) != 30) { throw new ID3Exception("Unexpected EOF while reading artist."); } String sArtist = new String(abyArtist, 0, indexOfFirstNull(abyArtist)); // album (30 bytes) byte[] abyAlbum = new byte[30]; if (oIS.read(abyAlbum) != 30) { throw new ID3Exception("Unexpected EOF while reading album."); } String sAlbum = new String(abyAlbum, 0, indexOfFirstNull(abyAlbum)); // year (4 bytes) byte[] abyYear = new byte[4]; if (oIS.read(abyYear) != 4) { throw new ID3Exception("Unexpected EOF while reading year."); } String sYear = new String(abyYear, 0, indexOfFirstNull(abyYear)); // comment (30 bytes) possibly including an album track # as the last byte String sComment; boolean bHasTrackNum; int iTrackNum = -1; byte[] abyTemp = new byte[30]; if (oIS.read(abyTemp) != 30) { throw new ID3Exception("Unexpected EOF while reading comment."); } if ((abyTemp[28] == 0) && (abyTemp[29] != 0)) { // this is a v1.1 tag with comment and track number byte[] abyComment = new byte[29]; System.arraycopy(abyTemp, 0, abyComment, 0, 29); sComment = new String(abyComment, 0, indexOfFirstNull(abyComment)); iTrackNum = abyTemp[29] & 0xff; bHasTrackNum = true; } else { // this is just a comment sComment = new String(abyTemp, 0, indexOfFirstNull(abyTemp)); bHasTrackNum = false; } // genre int iGenre = oIS.read(); // create appropriate ID3V1Tag object and set properties ID3V1Tag oID3V1Tag = null; if (bHasTrackNum) { // v1.1 tag oID3V1Tag = new ID3V1_1Tag(); ((ID3V1_1Tag)oID3V1Tag).setAlbumTrack(iTrackNum); } else { // v1.0 tag oID3V1Tag = new ID3V1_0Tag(); } oID3V1Tag.setTitle(sTitle); oID3V1Tag.setArtist(sArtist); oID3V1Tag.setAlbum(sAlbum); oID3V1Tag.setYear(sYear); oID3V1Tag.setComment(sComment); try { oID3V1Tag.setGenre(Genre.lookupGenre(iGenre)); } catch (ID3Exception e) { if (ID3Tag.usingStrict()) { throw e; } else { oID3V1Tag.setGenre(new Genre((byte)iGenre, "Unknown")); } } return oID3V1Tag; } catch (Exception e) { throw new ID3Exception(e); } } /** Write tag to output stream. * * @param oOS output stream to which tag is to be written * @throws ID3Exception if an error occurs while writing the tag */ abstract public void write(OutputStream oOS) throws ID3Exception; /* (non-Javadoc) * @see org.blinkenlights.id3.ID3Tag#toString() */ public String toString() { // lookup genre string, if possible (print byte value otherwise) String sGenre = null; try { sGenre = ID3V1Tag.Genre.lookupGenre(m_oGenre.m_byGenre).toString(); } catch (Exception e) { sGenre = Byte.toString(m_oGenre.m_byGenre); } return "SongTitle = [" + m_sTitle + "]\n" + "Artist = [" + m_sArtist + "]\n" + "Album = [" + m_sAlbum + "]\n" + "Year = [" + m_sYear + "]\n" + "Comment = [" + m_sComment + "]\n" + "Genre = " + sGenre; //m_oGenre.m_byGenre; } /** Utility method to find the index of the first zero byte in a byte array. * * @param abyString the byte array to examine * @return the index position of the first zero byte in the array, or the length of the array if no zeros exist */ static private int indexOfFirstNull(byte[] abyString) { for (int i=0; i < abyString.length; i++) { if (abyString[i] == 0) { return i; } } return abyString.length; } /** A class representing the predefined genres. */ public static class Genre { /** Store the actual byte value representing the genre in the tag. */ private byte m_byGenre; /** A string representation of the genre which clients can display for users. */ private String m_sGenre; /** Private constructor. Genres are predefined. */ private Genre(byte byGenre, String sGenre) { m_byGenre = byGenre; m_sGenre = sGenre; } /** Return the actual byte value used to represent this genre. */ public int getByteValue() { return (m_byGenre & 0xff); } /** Equality test returns if two genre objects represent the same genre. */ public boolean equals(Genre oGenre) { if ( (oGenre == null) || ( ! (oGenre instanceof Genre)) ) { return false; } return (oGenre.m_byGenre == this.m_byGenre); } public String toString() { return m_sGenre; } /** Predefined genre. */ public static final Genre Blues = new Genre((byte)0, "Blues"); /** Predefined genre. */ public static final Genre ClassicRock = new Genre((byte)1, "Classic Rock"); /** Predefined genre. */ public static final Genre Country = new Genre((byte)2, "Country"); /** Predefined genre. */ public static final Genre Dance = new Genre((byte)3, "Dance"); /** Predefined genre. */ public static final Genre Disco = new Genre((byte)4, "Disco"); /** Predefined genre. */ public static final Genre Funk = new Genre((byte)5, "Funk"); /** Predefined genre. */ public static final Genre Grunge = new Genre((byte)6, "Grunge"); /** Predefined genre. */ public static final Genre HipHop = new Genre((byte)7, "Hip-Hop"); /** Predefined genre. */ public static final Genre Jazz = new Genre((byte)8, "Jazz"); /** Predefined genre. */ public static final Genre Metal = new Genre((byte)9, "Metal"); /** Predefined genre. */ public static final Genre NewAge = new Genre((byte)10, "New Age"); /** Predefined genre. */ public static final Genre Oldies = new Genre((byte)11, "Oldies"); /** Predefined genre. */ public static final Genre Other = new Genre((byte)12, "Other"); /** Predefined genre. */ public static final Genre Pop = new Genre((byte)13, "Pop"); /** Predefined genre. */ public static final Genre RhythmBlues = new Genre((byte)14, "R&B"); /** Predefined genre. */ public static final Genre Rap = new Genre((byte)15, "Rap"); /** Predefined genre. */ public static final Genre Reggae = new Genre((byte)16, "Reggae"); /** Predefined genre. */ public static final Genre Rock = new Genre((byte)17, "Rock"); /** Predefined genre. */ public static final Genre Techno = new Genre((byte)18, "Techno"); /** Predefined genre. */ public static final Genre Industrial = new Genre((byte)19, "Industrial"); /** Predefined genre. */ public static final Genre Alternative = new Genre((byte)20, "Alternative"); /** Predefined genre. */ public static final Genre Ska = new Genre((byte)21, "Ska"); /** Predefined genre. */ public static final Genre DeathMetal = new Genre((byte)22, "Death Metal"); /** Predefined genre. */ public static final Genre Pranks = new Genre((byte)23, "Pranks"); /** Predefined genre. */ public static final Genre Soundtrack = new Genre((byte)24, "Soundtrack"); /** Predefined genre. */ public static final Genre EuroTechno = new Genre((byte)25, "Euro-Techno"); /** Predefined genre. */ public static final Genre Ambient = new Genre((byte)26, "Ambient"); /** Predefined genre. */ public static final Genre TripHop = new Genre((byte)27, "Trip-Hop"); /** Predefined genre. */ public static final Genre Vocal = new Genre((byte)28, "Vocal"); /** Predefined genre. */ public static final Genre JazzFunk = new Genre((byte)29, "Jazz-Funk"); /** Predefined genre. */ public static final Genre Fusion = new Genre((byte)30, "Fusion"); /** Predefined genre. */ public static final Genre Trance = new Genre((byte)31, "Trance"); /** Predefined genre. */ public static final Genre Classical = new Genre((byte)32, "Classical"); /** Predefined genre. */ public static final Genre Instrumental = new Genre((byte)33, "Instrumental"); /** Predefined genre. */ public static final Genre Acid = new Genre((byte)34, "Acid"); /** Predefined genre. */ public static final Genre House = new Genre((byte)35, "House"); /** Predefined genre. */ public static final Genre Game = new Genre((byte)36, "Game"); /** Predefined genre. */ public static final Genre SoundClip = new Genre((byte)37, "Sound Clip"); /** Predefined genre. */ public static final Genre Gospel = new Genre((byte)38, "Gospel"); /** Predefined genre. */ public static final Genre Noise = new Genre((byte)39, "Noise"); /** Predefined genre. */ public static final Genre AlternativeRock = new Genre((byte)40, "Alternative Rock"); /** Predefined genre. */ public static final Genre Bass = new Genre((byte)41, "Bass"); /** Predefined genre. */ public static final Genre Soul = new Genre((byte)42, "Soul"); /** Predefined genre. */ public static final Genre Punk = new Genre((byte)43, "Punk"); /** Predefined genre. */ public static final Genre Space = new Genre((byte)44, "Space"); /** Predefined genre. */ public static final Genre Meditative = new Genre((byte)45, "Meditative"); /** Predefined genre. */ public static final Genre InstrumentalPop = new Genre((byte)46, "Instrumental Pop"); /** Predefined genre. */ public static final Genre InstrumentalRock = new Genre((byte)47, "Instrumental Rock"); /** Predefined genre. */ public static final Genre Ethnic = new Genre((byte)48, "Ethnic"); /** Predefined genre. */ public static final Genre Gothic = new Genre((byte)49, "Gothic"); /** Predefined genre. */ public static final Genre DarkWave = new Genre((byte)50, "Dark Wave"); /** Predefined genre. */ public static final Genre TechnoIndustrial = new Genre((byte)51, "Techno-Industrial"); /** Predefined genre. */ public static final Genre Electronic = new Genre((byte)52, "Electronic"); /** Predefined genre. */ public static final Genre PopFolk = new Genre((byte)53, "Pop-Folk"); /** Predefined genre. */ public static final Genre EuroDance = new Genre((byte)54, "Euro-Dance"); /** Predefined genre. */ public static final Genre Dream = new Genre((byte)55, "Dream"); /** Predefined genre. */ public static final Genre SouthernRock = new Genre((byte)56, "Southern Rock"); /** Predefined genre. */ public static final Genre Comedy = new Genre((byte)57, "Comedy"); /** Predefined genre. */ public static final Genre Cult = new Genre((byte)58, "Cult"); /** Predefined genre. */ public static final Genre Gangsta = new Genre((byte)59, "Gangsta"); /** Predefined genre. */ public static final Genre Top40 = new Genre((byte)60, "Top 40"); /** Predefined genre. */ public static final Genre ChristianRap = new Genre((byte)61, "Christian Rap"); /** Predefined genre. */ public static final Genre PopFunk = new Genre((byte)62, "Pop-Funk"); /** Predefined genre. */ public static final Genre Jungle = new Genre((byte)63, "Jungle"); /** Predefined genre. */ public static final Genre NativeAmerican = new Genre((byte)64, "Native American"); /** Predefined genre. */ public static final Genre Cabaret = new Genre((byte)65, "Cabaret"); /** Predefined genre. */ public static final Genre NewWave = new Genre((byte)66, "New Wave"); /** Predefined genre. */ public static final Genre Psychedelic = new Genre((byte)67, "Psychedelic"); // this is the correct spelling /** Predefined genre. */ public static final Genre Rave = new Genre((byte)68, "Rave"); /** Predefined genre. */ public static final Genre ShowTunes = new Genre((byte)69, "Show Tunes"); /** Predefined genre. */ public static final Genre Trailer = new Genre((byte)70, "Trailer"); /** Predefined genre. */ public static final Genre LowFi = new Genre((byte)71, "Low-Fi"); /** Predefined genre. */ public static final Genre Tribal = new Genre((byte)72, "Tribal"); /** Predefined genre. */ public static final Genre AcidPunk = new Genre((byte)73, "Acid Punk"); /** Predefined genre. */ public static final Genre AcidJazz = new Genre((byte)74, "Acid Jazz"); /** Predefined genre. */ public static final Genre Polka = new Genre((byte)75, "Polka"); /** Predefined genre. */ public static final Genre Retro = new Genre((byte)76, "Retro"); /** Predefined genre. */ public static final Genre Musical = new Genre((byte)77, "Musical"); /** Predefined genre. */ public static final Genre RockNRoll = new Genre((byte)78, "Rock'N'Roll"); /** Predefined genre. */ public static final Genre HardRock = new Genre((byte)79, "Hard Rock"); /** Predefined genre. */ public static final Genre EXT_Folk = new Genre((byte)80, "Folk"); /** Predefined genre. */ public static final Genre EXT_FolkRock = new Genre((byte)81, "Folk Rock"); /** Predefined genre. */ public static final Genre EXT_NationalFolk = new Genre((byte)82, "National Folk"); /** Predefined genre. */ public static final Genre EXT_Swing = new Genre((byte)83, "Swing"); /** Predefined genre. */ public static final Genre EXT_FastFusion = new Genre((byte)84, "Fast Fusion"); /** Predefined genre. */ public static final Genre EXT_Bebop = new Genre((byte)85, "Bebop"); /** Predefined genre. */ public static final Genre EXT_Latin = new Genre((byte)86, "Latin"); /** Predefined genre. */ public static final Genre EXT_Revival = new Genre((byte)87, "Revival"); /** Predefined genre. */ public static final Genre EXT_Celtic = new Genre((byte)88, "Celtic"); /** Predefined genre. */ public static final Genre EXT_Bluegrass = new Genre((byte)89, "Bluegrass"); /** Predefined genre. */ public static final Genre EXT_AvanteGarde = new Genre((byte)90, "Avante Garde"); /** Predefined genre. */ public static final Genre EXT_GothicRock = new Genre((byte)91, "Gothic Rock"); /** Predefined genre. */ public static final Genre EXT_ProgressiveRock = new Genre((byte)92, "Progressive Rock"); /** Predefined genre. */ public static final Genre EXT_PsychedelicRock = new Genre((byte)93, "Psychedelic Rock"); /** Predefined genre. */ public static final Genre EXT_SymphonicRock = new Genre((byte)94, "Symphonic Rock"); /** Predefined genre. */ public static final Genre EXT_SlowRock = new Genre((byte)95, "Slow Rock"); /** Predefined genre. */ public static final Genre EXT_BigBand = new Genre((byte)96, "Big Band"); /** Predefined genre. */ public static final Genre EXT_Chorus = new Genre((byte)97, "Chorus"); /** Predefined genre. */ public static final Genre EXT_EasyListening = new Genre((byte)98, "Easy Listening"); /** Predefined genre. */ public static final Genre EXT_Acoustic = new Genre((byte)99, "Acoustic"); /** Predefined genre. */ public static final Genre EXT_Humour = new Genre((byte)100, "Humour"); /** Predefined genre. */ public static final Genre EXT_Speech = new Genre((byte)101, "Speech"); /** Predefined genre. */ public static final Genre EXT_Chanson = new Genre((byte)102, "Chanson"); /** Predefined genre. */ public static final Genre EXT_Opera = new Genre((byte)103, "Opera"); /** Predefined genre. */ public static final Genre EXT_ChamberMusic = new Genre((byte)104, "Chamber Music"); /** Predefined genre. */ public static final Genre EXT_Sonata = new Genre((byte)105, "Sonata"); /** Predefined genre. */ public static final Genre EXT_Symphony = new Genre((byte)106, "Symphony"); /** Predefined genre. */ public static final Genre EXT_BootyBass = new Genre((byte)107, "Booty Bass"); /** Predefined genre. */ public static final Genre EXT_Primus = new Genre((byte)108, "Primus"); /** Predefined genre. */ public static final Genre EXT_PornGroove = new Genre((byte)109, "Porn Groove"); /** Predefined genre. */ public static final Genre EXT_Satire = new Genre((byte)110, "Satire"); /** Predefined genre. */ public static final Genre EXT_SlowJam = new Genre((byte)111, "Slow Jam"); /** Predefined genre. */ public static final Genre EXT_Club = new Genre((byte)112, "Club"); /** Predefined genre. */ public static final Genre EXT_Tango = new Genre((byte)113, "Tango"); /** Predefined genre. */ public static final Genre EXT_Samba = new Genre((byte)114, "Samba"); /** Predefined genre. */ public static final Genre EXT_Folklore = new Genre((byte)115, "Folklore"); /** Predefined genre. */ public static final Genre EXT_Ballad = new Genre((byte)116, "Ballad"); /** Predefined genre. */ public static final Genre EXT_PowerBallad = new Genre((byte)117, "Power Ballad"); /** Predefined genre. */ public static final Genre EXT_RhythmicSoul = new Genre((byte)118, "Rhythmic Soul"); /** Predefined genre. */ public static final Genre EXT_Freestyle = new Genre((byte)119, "Freestyle"); /** Predefined genre. */ public static final Genre EXT_Duet = new Genre((byte)120, "Duet"); /** Predefined genre. */ public static final Genre EXT_PunkRock = new Genre((byte)121, "Punk Rock"); /** Predefined genre. */ public static final Genre EXT_DrumSolo = new Genre((byte)122, "Drum Solo"); /** Predefined genre. */ public static final Genre EXT_ACappella = new Genre((byte)123, "A Cappella"); /** Predefined genre. */ public static final Genre EXT_EuroHouse = new Genre((byte)124, "Euro-House"); /** Predefined genre. */ public static final Genre EXT_DanceHall = new Genre((byte)125, "Dance Hall"); /** Predefined genre. */ public static final Genre Nullsoft_Goa = new Genre((byte)126, "Goa"); /** Predefined genre. */ public static final Genre Nullsoft_DrumAndBass = new Genre((byte)127, "Drum & Bass"); /** Predefined genre. */ public static final Genre Nullsoft_ClubHouse = new Genre((byte)128, "Club-House"); /** Predefined genre. */ public static final Genre Nullsoft_Hardcore = new Genre((byte)129, "Hardcore"); /** Predefined genre. */ public static final Genre Nullsoft_Terror = new Genre((byte)130, "Terror"); /** Predefined genre. */ public static final Genre Nullsoft_Indie = new Genre((byte)131, "Indie"); /** Predefined genre. */ public static final Genre Nullsoft_BritPop = new Genre((byte)132, "BritPop"); /** Predefined genre. */ public static final Genre Nullsoft_Negerpunk = new Genre((byte)133, "Negerpunk"); /** Predefined genre. */ public static final Genre Nullsoft_PolskPunk = new Genre((byte)134, "Polsk Punk"); /** Predefined genre. */ public static final Genre Nullsoft_Beat = new Genre((byte)135, "Beat"); /** Predefined genre. */ public static final Genre Nullsoft_ChristianGangstaRap = new Genre((byte)136, "Christian Gangsta Rap"); /** Predefined genre. */ public static final Genre Nullsoft_HeavyMetal = new Genre((byte)137, "Heavy Metal"); /** Predefined genre. */ public static final Genre Nullsoft_BlackMetal = new Genre((byte)138, "Black Metal"); /** Predefined genre. */ public static final Genre Nullsoft_Crossover = new Genre((byte)139, "Crossover"); /** Predefined genre. */ public static final Genre Nullsoft_ContemporaryChristian = new Genre((byte)140, "Contemporary Christian"); /** Predefined genre. */ public static final Genre Nullsoft_ChristianRock = new Genre((byte)141, "Christian Rock"); /** Predefined genre. */ public static final Genre Nullsoft_Merengue = new Genre((byte)142, "Merengue"); /** Predefined genre. */ public static final Genre Nullsoft_Salsa = new Genre((byte)143, "Salsa"); /** Predefined genre. */ public static final Genre Nullsoft_ThrashMetal = new Genre((byte)144, "Thrash Metal"); /** Predefined genre. */ public static final Genre Nullsoft_Anime = new Genre((byte)145, "Anime"); /** Predefined genre. */ public static final Genre Nullsoft_Jpop = new Genre((byte)146, "Jpop"); /** Predefined genre. */ public static final Genre Nullsoft_Synthpop = new Genre((byte)147, "Synthpop"); /** Some people use a byte value of 255 to imply that the genre is undefined. */ public static final Genre Undefined = new Genre((byte)255, "Undefined"); /** Return the genre object represented by a byte value. * * @param iType the value code for a specific V1 genre * @return the corresponding Genre object * @throws ID3Exception if no matching genre exists */ public static Genre lookupGenre(int iType) throws ID3Exception { try { // special case, some people use 255 to mean the genre has not been defined if (iType == 255) { return Undefined; } return s_aoGenre[iType]; } catch (Exception e) { throw new ID3Exception("Invalid V1 genre code " + iType + "."); } } /** Return the genre object represented by a string value. * * @param sGenre the string name of a specific V1 genre (case-insensitive) * @return the corresponding Genre object * @throws ID3Exception if no matching genre exists */ public static Genre lookupGenre(String sGenre) throws ID3Exception { for (int i=0; i < s_aoGenre.length; i++) { if (s_aoGenre[i].m_sGenre.equalsIgnoreCase(sGenre)) { return s_aoGenre[i]; } } throw new ID3Exception("Unknown V1 genre [" + sGenre + "]."); } /** Lookup table used to match byte value to genre. */ private static Genre[] s_aoGenre = { Blues, ClassicRock, Country, Dance, Disco, Funk, Grunge, HipHop, Jazz, Metal, NewAge, Oldies, Other, Pop, RhythmBlues, Rap, Reggae, Rock, Techno, Industrial, Alternative, Ska, DeathMetal, Pranks, Soundtrack, EuroTechno, Ambient, TripHop, Vocal, JazzFunk, Fusion, Trance, Classical, Instrumental, Acid, House, Game, SoundClip, Gospel, Noise, AlternativeRock, Bass, Soul, Punk, Space, Meditative, InstrumentalPop, InstrumentalRock, Ethnic, Gothic, DarkWave, TechnoIndustrial, Electronic, PopFolk, EuroDance, Dream, SouthernRock, Comedy, Cult, Gangsta, Top40, ChristianRap, PopFunk, Jungle, NativeAmerican, Cabaret, NewWave, Psychedelic, Rave, ShowTunes, Trailer, LowFi, Tribal, AcidPunk, AcidJazz, Polka, Retro, Musical, RockNRoll, HardRock, EXT_Folk, EXT_FolkRock, EXT_NationalFolk, EXT_Swing, EXT_FastFusion, EXT_Bebop, EXT_Latin, EXT_Revival, EXT_Celtic, EXT_Bluegrass, EXT_AvanteGarde, EXT_GothicRock, EXT_ProgressiveRock, EXT_PsychedelicRock, EXT_SymphonicRock, EXT_SlowRock, EXT_BigBand, EXT_Chorus, EXT_EasyListening, EXT_Acoustic, EXT_Humour, EXT_Speech, EXT_Chanson, EXT_Opera, EXT_ChamberMusic, EXT_Sonata, EXT_Symphony, EXT_BootyBass, EXT_Primus, EXT_PornGroove, EXT_Satire, EXT_SlowJam, EXT_Club, EXT_Tango, EXT_Samba, EXT_Folklore, EXT_Ballad, EXT_PowerBallad, EXT_RhythmicSoul, EXT_Freestyle, EXT_Duet, EXT_PunkRock, EXT_DrumSolo, EXT_ACappella, EXT_EuroHouse, EXT_DanceHall, Nullsoft_Goa, Nullsoft_DrumAndBass, Nullsoft_ClubHouse, Nullsoft_Hardcore, Nullsoft_Terror, Nullsoft_Indie, Nullsoft_BritPop, Nullsoft_Negerpunk, Nullsoft_PolskPunk, Nullsoft_Beat, Nullsoft_ChristianGangstaRap, Nullsoft_HeavyMetal, Nullsoft_BlackMetal, Nullsoft_Crossover, Nullsoft_ContemporaryChristian, Nullsoft_ChristianRock, Nullsoft_Merengue, Nullsoft_Salsa, Nullsoft_ThrashMetal, Nullsoft_Anime, Nullsoft_Jpop, Nullsoft_Synthpop }; } }