How to compile TiMidity++ for Windows

This file contains fllowing instructions.

1.Mingw in Msys environment
2.Borland C++ in Msys environment
3.OpenWatcom C++ in Msys environment
4.Visual C++ in Msys environment


1.Mingw in Msys environment

(1)Setup Mingw and MSYS
    1)Setup Mingw(http://sourceforge.net/projects/mingw/) 
      and MSYS (See MingwWiki(http://mingw.sourceforge.net/MinGWiki/))
        If want to build Japanese version of TiMidity++,
            you can use Mingw-JP(http://sourceforge.jp/projects/mingw-jp),
            at least windres.exe  from Mingw-JP is needed,
            and to set windows(not msys) environment valiable CLANG=C-SJIS is recomended.
(2)Setup needed libraries
        2-0)get pexports from Mingw
            "pexports" is included in mingw-utils-0.3.tar.gz, get it and extract it.
        2-1)pdcurses
            Get pdcurses-2.6.0-2003.07.21-1.exe from Mingw. and extract them.
            Move curses.h to include path and libcurses.a libarary path.
        2-2)oggvorbis(http://www.vorbis.com/)
            get OggVorbis-win32sdk-1.0.1.zip and extract it.
            make export libraries
                pexports xxxx.dll >xxxx.def
                dlltool --dllname xxxx.dll --input-def xxxx.def --output-lib libxxxx.a
            Change include\ogg\os_type.h line 29 as following
                (os_types.h)
                29 #  if !defined(__GNUC__) || defined(__MINGW32__)
            set environment variables in batch file like this.
                REM OggVorbis
                set PATH=\usr\local\oggvorbis-win32sdk-1.0.1\bin;\usr\local\oggvorbis-win32sdk-1.0.1\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/oggvorbis-win32sdk-1.0.1/include:%C_INCLUDE_PATH
                set LD_LIBRARY_PATH=/usr/local/oggvorbis-win32sdk-1.0.1/lib:%LD_LIBRARY_PATH%

        2-3)gogo no coder(http://www.marinecat.net/mct_top.htm)
            get gogo.dll from Gogo no Coder(http://www.marinecat.net/cgi/lcount/count.cgi?page=3112&name=wing311.exe&downex=wing311a.exe)
            get gogo.h files from Gogo noCoder source(http://www.marinecat.net/cgi/lcount/count.cgi?page=3111&name=petit311-src.lzh&downex=petit311.lzh)
            move gogo.h gogo\include\gogo
            move gogo.dll gogo\lib
            make export libraries
                pexports gogo.dll >gogo.def
                dlltool --dllname gogo.dll --input-def gogo.def --output-lib libgogo.a
            set environment variables in batch file like this.
                REM GOGO
                set PATH=\usr\local\gogo\bin;\usr\local\gogo\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/gogo/include:%C_INCLUDE_PATH%
                set LD_LIBRARY_PATH=/usr/local/gogo/lib:%LD_LIBRARY_PATH%
        2-4)flac(http://flac.sourceforge.net/)
            get flac-1.1.0-win.zip and extract it.
            Change include\*\export.h line 23 as following
                (export.h)
                23 #if defined(FLAC__NO_DLL) || !defined(_MSC_VER) \
                    || !defined(__BORLANDC__) || !defined(__CYGWIN32__) || !defined(__MINGW32__)
            set environment variables in batch file like this.
                REM FLAC
                set PATH=\usr\local\flac-1.1.0-win\bin;;%PATH%
                set C_INCLUDE_PATH=/usr/local/flac-1.1.0-win/include:%C_INCLUDE_PATH%
                set LD_LIBRARY_PATH=/usr/local/flac-1.1.0-win/bin:%LD_LIBRARY_PATH%

        2-5)portaudio(http://www.portaudio.com/)
            Download and make portaudio v1.18.
            (see callasio http://www.audiomulch.com/~rossb/code/calliasio/)
            Each portaudio.dll must be renamed  pa_asio.dllApa_win_ds.dllApa_win_wmme.dll.
            Only portaudo.h is needed for compiling TiMidity++.

        2-6)portmidi(http://www-2.cs.cmu.edu/~music/portmusic/)
            Download portmidi18jun03.zip, extract it and compile it.
            Copy porttime.h libporttime.a portmidi.h libportmidi.a to appropriate directories.

(3)Make TiMidity++ binaries
        3-1)timw32g.exe
            (configure)
             CFLAGS="-O2" configure --enable-network --enable-w32gui \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             strip timidity.exe
             mv timidity.exe timw32g.exe
        3-2)twsyng.exe
            (configure)
             CFLAGS="-O2" configure --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             strip timidity.exe
             mv timidity.exe twsyng.exe

        3-3)twsynsrv.exe
            (configure)
              CFLAGS="-O2" configure --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
             add config.h following line
                #define TWSYNSRV 1
           (make)
             make
             strip timidity.exe
             mv timidity.exe twsynsrv.exe

        3-4)timidity.exe
            (configure)
             CFLAGS="-O2" configure --enable-interface=ncurses,vt100,winsyn --enable-network \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             strip timidity.exe


2.Borland C++ in Msys environment

(1)Setup BorlandC and MSYS
    1)Setup BorlandC
        Downlod C++Buldercompiler(http://www.borland.com/products/downloads/download_cbuilder.html#)
         , read readme.txt and make bcc32.cfg and ilink 32.cfg.
        (bcc32.cfg)
          -I"C:\Borland\Bcc55\include"
          -L"C:\Borland\Bcc55\lib;C:\Borland\Bcc55\lib\PSDK"
          -DWINVER=0x0400
          -D_WIN32_WINNT=0x0400
        (ilink32.cfg )
            -L"C:\Borland\Bcc55\lib;C:\Borland\Bcc55\lib\PSDK"
    2)Setup  MSYS (See MingwWiki(http://mingw.sourceforge.net/MinGWiki/))
        Remove mingw path from /etc/fstab.
        Add fllowing line at the top of Msys.bat and create bcc_env.bat.
              call c:\borland\bcc55\bin\bcc_env.bat
        bcc_env.bat is like follow ing
            @echo off
            set PATH=c:\borland\bcc55\bin;%PATH%

            Set INCLUDE=c:\usr\local\pdcurses_bcc\include;%INCLUDE%
                  ----
               ( setteing of various env. val. s )
                  ----
(2)Setup needed libraries
        2-0-1)implib.exe(to make import library from dll)
           implib -a -c xxx.lib xxx.dll
        2-0-2)coff2omf.exe(VCC library to BCC library)
           coff2omf  xxxx.lib xxx_bcpp.lib.
        
        2-1)pdcurses
           pdcurses-2.6.0-src.tar.bz2 from Mingw(http://sourceforge.net/project/showfiles.php?group_id=2435)
           and make them.
           rename pdcurses.lib libpdcurses.lib
           Move  curses.h to include path.
           Add library path in ilink32.cfg
      2-2)oggvorbis(http://www.vorbis.com/)
           get OggVorbis-win32sdk-1.0.1.zip and extract it.
           set environment variables in batch file like this.
                REM OggVorbis
                set PATH=\usr\local\oggvorbis-win32sdk-1.0.1\bin;\usr\local\oggvorbis-win32sdk-1.0.1\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/oggvorbis-win32sdk-1.0.1/include:%C_INCLUDE_PATH
            Add library path in ilink32.cfg
            Only hederfiles are need for compiling TiMidity++
        2-3)gogo no coder(http://www.marinecat.net/mct_top.htm)
            get gogo.dll from Gogo no Coder(http://www.marinecat.net/cgi/lcount/count.cgi?page=3112&name=wing311.exe&downex=wing311a.exe)
            get gogo.h files from Gogo no Coder source(http://www.marinecat.net/cgi/lcount/count.cgi?page=3111&name=petit311-src.lzh&downex=petit311.lzh)
            move gogo.h gogo\include\gogo
            (for timidity gogo.lib is not necessary)
           set environment variables in batch file like this.
                REM GOGO
                set PATH=\usr\local\gogo\bin;\usr\local\gogo\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/gogo/include:%C_INCLUDE_PATH%
            Add library path in ilink32.cfg
            Only hederfiles are need for TiMidity++
        2-5)flac(http://flac.sourceforge.net/)
          get flac-1.1.0-win.zip and extract it.
            Change include\*\export.h line 23 as following
                (export.h)
                23 #if defined(FLAC__NO_DLL) || !defined(_MSC_VER) \
                    || !defined(__BORLANDC__) || !defined(__CYGWIN32__) || !defined(__MINGW32__)
            Change include\FLAC\ordinals.h line 39 as following
                39 #if defined(_MSC_VER) || defined(__BORLANDC__)
            set environment variables in batch file like this.
                REM FLAC
                set PATH=\usr\local\flac-1.1.0-win\bin;;%PATH%
                set C_INCLUDE_PATH=/usr/local/flac-1.1.0-win/include:%C_INCLUDE_PATH%
             Add library path in ilink32.cfg
        2-6)portaudio(http://www.portaudio.com/)
             I don't know how to comple portaudio with bcc commandline tools.
             Only portaudio.h is needed for compiling TiMidity++.
        2-7)portmidi(http://www-2.cs.cmu.edu/~music/portmusic/)
             I don't know how to comple portaudio with bcc commandline tools.

(3)Make TiMidity++ binaries
        3-0-1) perl -pe 's/CC\s-o\s\S\S*\s/CC /g' configure >configure_bc
                ( -o xxxx options are not work correctly with BCC)
        3-0-2)Invoke sh rm_float.sh in timidity/timidity directory.
                This removes f , F, l and L after sonst float valude( ex. 123.45f )
<rmfloat.sh>
-------------------- from here -----------------------
#!/bin/sh

for foo in `ls *.c` `ls *.h`;do
perl -pe 's/(%[0-9]*\.[0-9]+f)/$1f/g' $foo|perl -pe 's/(\.[0-9]+)f/$1/g' - |perl -pe 's/(\.[0-9]+)F/$1/g' - |perl -pe 's/(\.[0-9]+)l/$1/g' - |perl -pe 's/(\.[0-9]+)L/$1/g' - |perl -pe 's/(0x[0-9a-f]+)l/$1/g' - |perl -pe 's/(0x[0-9a-f]+)L/$1/g' - >$foo.rm
mv $foo.rm $foo
done
-------------------- to here -------------------------
                
        3-1)timw32g.exe
            (configure)
             CC="bcc32" CPP="cpp32" CFLAGS="" ./configure_bc  --enable-w32gui \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             mv timidity.exe timw32g.exe
        3-2)twsyng.exe
            (configure)
            CC="bcc32" CPP="cpp32" CFLAGS="" \
            ./configure_bc --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             mv timidity.exe twsyng.exe
        3-3)twsynsrv.exe
            (configure)
             CC="bcc32" CPP="cpp32" CFLAGS=""\
             ./configure_bc --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
             add config.h following line
                #define TWSYNSRV 1
             (make)
             make
             mv timidity.exe twsynsrv.exe
       3-4)timidity.exe
            (configure)
            CC="bcc32" CPP="cpp32" CFLAGS="" \
             ./configure_bc --enable-interface=vt100,winsyn,ncurses --enable-network \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make


3.OpenWatcom C++ in Msys environment

(1)OpenWatcom and MSYS
    1)Set OpenWatcom(http://www.openwatcom.org)
       1-1)Download OpenWatcom, install and configure them
       1-2)Download Microsoft Platform SDK install and configure them.
            Replace rc.exe of OpenWatom with the one of Platform SDK's one.
            (OpenWatcom's rc.exe can't use).
  2)Setup Mngw and MSYS (See MingwWiki(http://mingw.sourceforge.net/MinGWiki/))
        Remove mingw path from /etc/fstab.
        Add fllowing line at the top of Msys.bat and create wcc_env.bat.
              call wcc_env.bat
        wcc_env.bat is like follow ing
            @echo off
            set LIB=
            set INCLUDE=
            call i:\watcom\setvars.bat
                 ----
               ( setteing of various env. val. s )
                  ----
(2)Setup needed libraries(The wcc386 option -5s is recomended !! Because of TiMidity++ compatibility.!!)
        2-0) make import Libray from dll
           mlib -n -b out.lib in.dll
        2-1)pdcurses
           Get  pdcurses-2.5.0  from GnuWin32(http://sourceforge.net/projects/gnuwin32/)
           and make import Libraries from dlls.
           "libpdcurses.lib"  is needed (not pdcurses.lib).
           Move curses.h to include path and libpdcurses.lib libarary path.
        2-2)oggvorbis(http://www.vorbis.com/)
           Get OggVorbis-win32sdk-1.0.1.zip and extract it.
           Edit include\ogg\os_types.h.
              (os_types.h)
              29 #  if defined(__WATCOMC__)
              30 /* MSVC/Borland */
              31 typedef __int64 ogg_int64_t;
              32 typedef int ogg_int32_t;
              33 typedef unsigned int ogg_uint32_t;
              34 typedef short ogg_int16_t;
              35 typedef unsigned short ogg_uint16_t;
              36 #  else
                   -----
              52 #  endif
           Make inport Libraries from dll
           Set environment variables in batch file like this.
                REM OggVorbis
                set PATH=\usr\local\oggvorbis-win32sdk-1.0.1_wcc\bin;\usr\local\oggvorbis-win32sdk-1.0.1_wcc\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/oggvorbis-win32sdk-1.0.1_wcc/include:%C_INCLUDE_PATH
                set LIB=\usr\local\oggvorbis-win32sdk-1.0.1_wcc\lib:%LIB%
           Only *.h files are needed for TiMidity++.
        2-3)gogo no coder(http://www.marinecat.net/mct_top.htm)
           Get gogo.dll from Gogo no Coder(http://www.marinecat.net/cgi/lcount/count.cgi?page=3112&name=wing311.exe&downex=wing311a.exe)
            Get gogo.h files from Gogo noCoder source(http://www.marinecat.net/cgi/lcount/count.cgi?page=3111&name=petit311-src.lzh&downex=petit311.lzh)
            Move gogo.h gogo\include\gogo
            (for timidity gogo.lib not necessary)
           Set environment variables in batch file like this.
                REM GOGO
                set PATH=\usr\local\gogo_wcc\bin;\usr\local\gogo_wcc\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/gogo_wcc/include:%C_INCLUDE_PATH%
                set LIB=\usr\local\gogo_wcc\lib:%LIB%
           Only *.h files are needed for compiling TiMidity++.
        2-5)flac(http://flac.sourceforge.net/)
            get flac-1.1.0-win.zip and extract it.
            make inport Libraries from dll
            set environment variables in batch file like this.
                REM FLAC
                set PATH=\usr\local\flac-1.1.0-win_wcc\bin;%PATH%
                set C_INCLUDE_PATH=/usr/local/flac-1.1.0-win_wcc/include:%C_INCLUDE_PATH%
                set LIB=\usr\local\flac-1.1.0-win_wcc\bin:%LIB%
           Only *.h files are needed for compiling TiMidity++.
        2-6)portaudio(http://www.portaudio.com/)
            I don't know how to comple portaudio with OpenWatcom commandline tools.
            Only port audio.h is needed for compling TiMidity++.
        2-7)portmidi(http://www-2.cs.cmu.edu/~music/portmusic/)
            I don't know how to comple portmidi with OpenWatcom commandline tools..

(3)Make TiMidity++ binaries
        3-0-1)wcc386_w.sh ( it is in scripts/directory )
            Wcc386 is not familier to GNU autoconf tools,
            Use my wrapper wcc386_w.sh, instead of wcc386.exe
        3-1)timw32g.exe
            (configure)
            CC="wcc386_w.sh" CPP="wcc386_w.sh -p"  CFLAGS="-d0 -obll+riemcht" \
           ./configure --enable-network --enable-w32gui \
            --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio \
            --disable-oggtest --disable-vorbistest --disable-libFLACtest --disable-libOggFLACtest
            (make)
             make
             mv timidity.exe timw32g.exe
        3-2)twsyng.exe
            (configure)
            CC="wcc386_w.sh" CPP="wcc386_w.sh -p"  CFLAGS="-d0 -obll+riemcht" \
            ./configure --enable-network --enable-winsyng \
            --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio \
            --disable-oggtest --disable-vorbistest --disable-libFLACtest --disable-libOggFLACtest
             (make)
             make
             mv timidity.exe twsyng.exe
        3-3)twsynsrv.exe
            (configure)
            CC="wcc386_w.sh" CPP="wcc386_w.sh -p"  CFLAGS="-d0 -obll+riemcht" \
            ./configure --enable-network --enable-winsyng \
            --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio \
            --disable-oggtest --disable-vorbistest --disable-libFLACtest --disable-libOggFLACtest
            add config.h following line
                #define TWSYNSRV 1
             (make)
             make
             mv timidity.exe twsynsrv.exe

        3-4)timidity.exe
            (configure)
            CC="wcc386_w.sh" CPP="wcc386_w.sh -p"  CFLAGS="-d0 -obll+riemcht" \
            ./configure --enable-interface=ncurses,vt100,winsyn --enable-network \
            --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio \
            --disable-oggtest --disable-vorbistest --disable-libFLACtest --disable-libOggFLACtest
            (make)
            make


4.Visual C++ in Msys environment

(1)Setup VisualC++ and MSYS
    1)Setup Visual C++
        Download
            Microsoft Visual C++ Toolkit 2003
            Microsoft.NET SDK
            Microsoft Platform SDK
        install and configure them.
======= CAUTION !! ===========
If you plan to distribute TiMidity++ binary, use "Visual C++" or "Visual Studio" not "Microsoft Visual C++ Toolkit 2003". because of LICENCE issue. 
Use -MD option insted of -MT and link msvcrt.lib instead of libcmt.lib.
==============================

   2)Setup Mngw and MSYS (See MingwWiki(http://mingw.sourceforge.net/MinGWiki/))
        Remove mingw path from /etc/fstab.
        Add fllowing line at the top of Msys.bat and create bcc_env.bat.
              call vc_msys_env.bat
        vc_msys_env.bat is like follow ing
            @echo off
            call i:\"Program Files\Microsoft Visual C++ Toolkit 2003"\vcvars32.bat
            call i:\"Program Files\Microsoft SDK"\SetEnv.Bat /RETAIL
            call i:\"Program Files\Microsoft.NET\SDK\v1.1\bin"\sdkvars.bat

            Set INCLUDE=c:\DXSDK\include;%INCLUDE%
            Set LIB=c:\DXSDK\lib;%LIB%
                  ----
               ( setteing of various env. val. s )
                  ----
(2)Setup needed libraries
        2-1)pdcurses
           pdcurses-2.6.0-src.tar.bz2 from Mingw(http://sourceforge.net/project/showfiles.php?group_id=2435)
           and make them.
           rename pdcurses.lib libpdcurses.lib
           move curses.h to include path and libpdcurses.lib libarary path.
        2-2)oggvorbis(http://www.vorbis.com/)
           get OggVorbis-win32sdk-1.0.1.zip and extract it.
           set environment variables in batch file like this.
                REM OggVorbis
                set PATH=\usr\local\oggvorbis-win32sdk-1.0.1\bin;\usr\local\oggvorbis-win32sdk-1.0.1\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/oggvorbis-win32sdk-1.0.1/include:%C_INCLUDE_PATH
                set LIB=\usr\local\oggvorbis-win32sdk-1.0.1\lib:%LIB%

        2-3)gogo no coder(http://www.marinecat.net/mct_top.htm)
           Get gogo.dll from Gogo no Coder(http://www.marinecat.net/cgi/lcount/count.cgi?page=3112&name=wing311.exe&downex=wing311a.exe)
           Get gogo.h files from Gogo noCoder source(http://www.marinecat.net/cgi/lcount/count.cgi?page=3111&name=petit311-src.lzh&downex=petit311.lzh)
           Move gogo.h gogo\include\gogo
            (for timidity gogo.lib not necessary)
           Set environment variables in batch file like this.
                REM GOGO
                set PATH=\usr\local\gogo\bin;\usr\local\gogo\lib;%PATH%
                set C_INCLUDE_PATH=/usr/local/gogo/include:%C_INCLUDE_PATH%
                set LIB=\usr\local\gogo\lib:%LIB%
        2-5)flac(http://flac.sourceforge.net/)
            Set flac-1.1.0-win.zip and extract it.
            Set environment variables in batch file like this.
                REM FLAC
                set PATH=\usr\local\flac-1.1.0-win\bin;;%PATH%
                set C_INCLUDE_PATH=/usr/local/flac-1.1.0-win/include:%C_INCLUDE_PATH%
                set LIB=\usr\local\flac-1.1.0-win\bin:%LIB%
        2-6)portaudio(http://www.portaudio.com/).
             I don't know how to comple portaudio with vc commandline tools.
            But for compling TiMidity++ only port audio.h is needed.
        2-7)portmidi(http://www-2.cs.cmu.edu/~music/portmusic/)
            I don't know how to comple portmidi with vc commandline tools..

(3)Make TiMidity++ binaries
        3-1)timw32g.exe
            (configure)
             CC="cl" CPP="cl.exe -EP"  CFLAGS="-O2" \
            ./configure --enable-network --enable-w32gui \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
            make
             mv timidity.exe timw32g.exe
        3-2)twsyng.exe
            (configure)
            CC="cl" CPP="cl.exe -EP"  CFLAGS="-O2" \
            ./configure --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make
             mv timidity.exe twsyng.exe
        3-3)twsynsrv.exe
            (configure)
             CC="cl" CPP="cl.exe -EP"  CFLAGS="-O2"\
             ./configure --enable-network --enable-winsyng \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
             add config.h following line
                #define TWSYNSRV 1
             (make)
             make
             mv timidity.exe twsynsrv.exe
        3-4)timidity.exe
            (configure)
            CC="cl" CPP="cl.exe -EP"  CFLAGS="-O2" \
             ./configure --enable-interface=ncurses,vt100,winsyn --enable-network \
             --enable-audio=w32,vorbis,gogo,ogg,flac,portaudio
            (make)
             make


2004.5.28 Keishi Suenaga(skeishi@mutt.freemail.ne.jp)
