Added README and updated Java code with comments!

This commit is contained in:
Sam Archer 2011-10-08 14:25:27 -07:00
parent 9728c2992c
commit be30db892e
9 changed files with 309 additions and 182 deletions

View File

@ -55,7 +55,14 @@ is divided into following sections:
</target> </target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init"> <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
<available file="${manifest.file}" property="manifest.available"/> <available file="${manifest.file}" property="manifest.available"/>
<available file="${application.splash}" property="splashscreen.available"/> <condition property="splashscreen.available">
<and>
<not>
<equals arg1="${application.splash}" arg2="" trim="true"/>
</not>
<available file="${application.splash}"/>
</and>
</condition>
<condition property="main.class.available"> <condition property="main.class.available">
<and> <and>
<isset property="main.class"/> <isset property="main.class"/>
@ -70,8 +77,14 @@ is divided into following sections:
<isset property="main.class.available"/> <isset property="main.class.available"/>
</and> </and>
</condition> </condition>
<condition property="do.archive">
<not>
<istrue value="${jar.archive.disabled}"/>
</not>
</condition>
<condition property="do.mkdist"> <condition property="do.mkdist">
<and> <and>
<isset property="do.archive"/>
<isset property="libs.CopyLibs.classpath"/> <isset property="libs.CopyLibs.classpath"/>
<not> <not>
<istrue value="${mkdist.disabled}"/> <istrue value="${mkdist.disabled}"/>
@ -84,40 +97,41 @@ is divided into following sections:
<isset property="do.mkdist"/> <isset property="do.mkdist"/>
</and> </and>
</condition> </condition>
<condition property="manifest.available+main.class+mkdist.available+splashscreen.available">
<and>
<istrue value="${manifest.available+main.class+mkdist.available}"/>
<istrue value="${splashscreen.available}"/>
</and>
</condition>
<condition property="do.archive">
<not>
<istrue value="${jar.archive.disabled}"/>
</not>
</condition>
<condition property="do.archive+manifest.available"> <condition property="do.archive+manifest.available">
<and> <and>
<isset property="manifest.available"/> <isset property="manifest.available"/>
<istrue value="${do.archive}"/> <istrue value="${do.archive}"/>
</and> </and>
</condition> </condition>
<condition property="do.archive+main.class.available">
<and>
<isset property="main.class.available"/>
<istrue value="${do.archive}"/>
</and>
</condition>
<condition property="do.archive+splashscreen.available">
<and>
<isset property="splashscreen.available"/>
<istrue value="${do.archive}"/>
</and>
</condition>
<condition property="do.archive+manifest.available+main.class"> <condition property="do.archive+manifest.available+main.class">
<and> <and>
<istrue value="${manifest.available+main.class}"/> <istrue value="${manifest.available+main.class}"/>
<istrue value="${do.archive}"/> <istrue value="${do.archive}"/>
</and> </and>
</condition> </condition>
<condition property="do.archive+manifest.available+main.class+mkdist.available"> <condition property="manifest.available-mkdist.available">
<and> <or>
<istrue value="${manifest.available+main.class+mkdist.available}"/> <istrue value="${manifest.available}"/>
<istrue value="${do.archive}"/> <isset property="do.mkdist"/>
</and> </or>
</condition> </condition>
<condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available"> <condition property="manifest.available+main.class-mkdist.available">
<and> <or>
<istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/> <istrue value="${manifest.available+main.class}"/>
<istrue value="${do.archive}"/> <isset property="do.mkdist"/>
</and> </or>
</condition> </condition>
<condition property="have.tests"> <condition property="have.tests">
<or> <or>
@ -173,8 +187,17 @@ is divided into following sections:
<condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'"> <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
<length length="0" string="${endorsed.classpath}" when="greater"/> <length length="0" string="${endorsed.classpath}" when="greater"/>
</condition> </condition>
<property name="javac.fork" value="false"/> <condition else="false" property="jdkBug6558476">
<and>
<matches pattern="1\.[56]" string="${java.specification.version}"/>
<not>
<os family="unix"/>
</not>
</and>
</condition>
<property name="javac.fork" value="${jdkBug6558476}"/>
<property name="jar.index" value="false"/> <property name="jar.index" value="false"/>
<property name="jar.index.metainf" value="${jar.index}"/>
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/> <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
</target> </target>
<target name="-post-init"> <target name="-post-init">
@ -291,14 +314,19 @@ is divided into following sections:
<attribute default="${build.classes.dir}" name="destdir"/> <attribute default="${build.classes.dir}" name="destdir"/>
<sequential> <sequential>
<fail unless="javac.includes">Must set javac.includes</fail> <fail unless="javac.includes">Must set javac.includes</fail>
<pathconvert pathsep="," property="javac.includes.binary"> <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
<path> <path>
<filelist dir="@{destdir}" files="${javac.includes}"/> <filelist dir="@{destdir}" files="${javac.includes}"/>
</path> </path>
<globmapper from="*.java" to="*.class"/> <globmapper from="*.java" to="*.class"/>
</pathconvert> </pathconvert>
<tempfile deleteonexit="true" property="javac.includesfile.binary"/>
<echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
<delete> <delete>
<files includes="${javac.includes.binary}"/> <files includesfile="${javac.includesfile.binary}"/>
</delete>
<delete>
<fileset file="${javac.includesfile.binary}"/>
</delete> </delete>
</sequential> </sequential>
</macrodef> </macrodef>
@ -309,7 +337,8 @@ is divided into following sections:
<attribute default="${excludes}" name="excludes"/> <attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/> <attribute default="**" name="testincludes"/>
<sequential> <sequential>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}"> <property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<batchtest todir="${build.test.results.dir}"> <batchtest todir="${build.test.results.dir}">
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}"> <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/> <filename name="@{testincludes}"/>
@ -325,11 +354,56 @@ is divided into following sections:
<formatter type="brief" usefile="false"/> <formatter type="brief" usefile="false"/>
<formatter type="xml"/> <formatter type="xml"/>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/> <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-ea"/>
<jvmarg line="${run.jvmargs}"/> <jvmarg line="${run.jvmargs}"/>
</junit> </junit>
</sequential> </sequential>
</macrodef> </macrodef>
</target> </target>
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
<target name="-profile-pre-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target name="-profile-post-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target name="-profile-init-macrodef-profile">
<macrodef name="resolve">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="${env.@{value}}"/>
</sequential>
</macrodef>
<macrodef name="profile">
<attribute default="${main.class}" name="classname"/>
<element name="customize" optional="true"/>
<sequential>
<property environment="env"/>
<resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
<java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
<jvmarg value="${profiler.info.jvmargs.agent}"/>
<jvmarg line="${profiler.info.jvmargs}"/>
<env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
<arg line="${application.args}"/>
<classpath>
<path path="${run.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="run-sys-prop."/>
<mapper from="run-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<customize/>
</java>
</sequential>
</macrodef>
</target>
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
<fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
<fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
</target>
<target depends="-init-debug-args" name="-init-macrodef-nbjpda"> <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/> <attribute default="${main.class}" name="name"/>
@ -424,6 +498,7 @@ is divided into following sections:
</target> </target>
<target name="-init-macrodef-copylibs"> <target name="-init-macrodef-copylibs">
<macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3"> <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${manifest.file}" name="manifest"/>
<element name="customize" optional="true"/> <element name="customize" optional="true"/>
<sequential> <sequential>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/> <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
@ -439,7 +514,7 @@ is divided into following sections:
</chainedmapper> </chainedmapper>
</pathconvert> </pathconvert>
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
<copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
<fileset dir="${build.classes.dir}"/> <fileset dir="${build.classes.dir}"/>
<manifest> <manifest>
<attribute name="Class-Path" value="${jar.classpath}"/> <attribute name="Class-Path" value="${jar.classpath}"/>
@ -568,10 +643,10 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available"> <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
<j2seproject1:jar/> <j2seproject1:jar/>
</target> </target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class"> <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
<j2seproject1:jar manifest="${manifest.file}"/> <j2seproject1:jar manifest="${manifest.file}"/>
</target> </target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available"> <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
@ -580,44 +655,53 @@ is divided into following sections:
<j2seproject1:attribute name="Main-Class" value="${main.class}"/> <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
</j2seproject1:manifest> </j2seproject1:manifest>
</j2seproject1:jar> </j2seproject1:jar>
<echo>To run this application from the command line without Ant, try:</echo> <echo level="info">To run this application from the command line without Ant, try:</echo>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/> <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<property location="${dist.jar}" name="dist.jar.resolved"/> <property location="${dist.jar}" name="dist.jar.resolved"/>
<pathconvert property="run.classpath.with.dist.jar"> <pathconvert property="run.classpath.with.dist.jar">
<path path="${run.classpath}"/> <path path="${run.classpath}"/>
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/> <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
</pathconvert> </pathconvert>
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo> <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
</target> </target>
<target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available" name="-do-jar-with-libraries-and-splashscreen"> <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
<tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
<touch file="${tmp.manifest.file}" verbose="false"/>
</target>
<target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
<tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
<copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
</target>
<target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
<manifest file="${tmp.manifest.file}" mode="update">
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</target>
<target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
<basename file="${application.splash}" property="splashscreen.basename"/> <basename file="${application.splash}" property="splashscreen.basename"/>
<mkdir dir="${build.classes.dir}/META-INF"/> <mkdir dir="${build.classes.dir}/META-INF"/>
<copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/> <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
<j2seproject3:copylibs> <manifest file="${tmp.manifest.file}" mode="update">
<customize> <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
<attribute name="Main-Class" value="${main.class}"/> </manifest>
<attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
</customize>
</j2seproject3:copylibs>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo>java -jar "${dist.jar.resolved}"</echo>
</target> </target>
<target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries" unless="splashscreen.available"> <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
<j2seproject3:copylibs> <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
<customize> <echo level="info">To run this application from the command line without Ant, try:</echo>
<attribute name="Main-Class" value="${main.class}"/>
</customize>
</j2seproject3:copylibs>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/> <property location="${dist.jar}" name="dist.jar.resolved"/>
<echo>java -jar "${dist.jar.resolved}"</echo> <echo level="info">java -jar "${dist.jar.resolved}"</echo>
</target> </target>
<target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
<delete>
<fileset file="${tmp.manifest.file}"/>
</delete>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
<target name="-post-jar"> <target name="-post-jar">
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries-and-splashscreen,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/> <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
<!-- <!--
================= =================
EXECUTION SECTION EXECUTION SECTION
@ -682,6 +766,72 @@ is divided into following sections:
<j2seproject1:nbjpdareload/> <j2seproject1:nbjpdareload/>
</target> </target>
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/> <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
<!--
=================
PROFILING SECTION
=================
-->
<target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
</classpath>
</nbprofiledirect>
<profile/>
</target>
<target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
<fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
</classpath>
</nbprofiledirect>
<profile classname="${profile.class}"/>
</target>
<!--
=========================
APPLET PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
</classpath>
</nbprofiledirect>
<profile classname="sun.applet.AppletViewer">
<customize>
<arg value="${applet.url}"/>
</customize>
</profile>
</target>
<!--
=========================
TESTS PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
<nbprofiledirect>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
</nbprofiledirect>
<junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
<env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
<jvmarg value="${profiler.info.jvmargs.agent}"/>
<jvmarg line="${profiler.info.jvmargs}"/>
<test name="${profile.class}"/>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
</junit>
</target>
<!-- <!--
=============== ===============
JAVADOC SECTION JAVADOC SECTION
@ -693,11 +843,12 @@ is divided into following sections:
<classpath> <classpath>
<path path="${javac.classpath}"/> <path path="${javac.classpath}"/>
</classpath> </classpath>
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> <fileset dir="${src.dir}" excludes="*.java,${excludes}" includes="${includes}">
<filename name="**/*.java"/> <filename name="**/*.java"/>
</fileset> </fileset>
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
<include name="**/*.java"/> <include name="**/*.java"/>
<exclude name="*.java"/>
</fileset> </fileset>
</javadoc> </javadoc>
<copy todir="${dist.javadoc.dir}"> <copy todir="${dist.javadoc.dir}">
@ -728,7 +879,7 @@ is divided into following sections:
<target if="do.depend.true" name="-compile-test-depend"> <target if="do.depend.true" name="-compile-test-depend">
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/> <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
</target> </target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test"> <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/> <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
<copy todir="${build.test.classes.dir}"> <copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
@ -743,7 +894,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single"> <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/> <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/> <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>

View File

@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=23b52058 nbproject/build-impl.xml.data.CRC32=23b52058
nbproject/build-impl.xml.script.CRC32=05ef9bdb nbproject/build-impl.xml.script.CRC32=9ea63390
nbproject/build-impl.xml.stylesheet.CRC32=f33e10ff@1.38.2.45 nbproject/build-impl.xml.stylesheet.CRC32=0ae3a408@1.44.1.45

View File

@ -1,9 +1,9 @@
annotation.processing.enabled=true annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false annotation.processing.enabled.in.editor=false
annotation.processing.processor.options=
annotation.processing.processors.list=
annotation.processing.run.all.processors=true annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=MoppyDesk
application.vendor=Sam
build.classes.dir=${build.dir}/classes build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned: # This directory is removed when the project is cleaned:
@ -24,6 +24,7 @@ debug.test.classpath=\
dist.dir=dist dist.dir=dist
dist.jar=${dist.dir}/MoppyDesk.jar dist.jar=${dist.dir}/MoppyDesk.jar
dist.javadoc.dir=${dist.dir}/javadoc dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes= excludes=
file.reference.RXTXcomm.jar=lib\\RXTXcomm.jar file.reference.RXTXcomm.jar=lib\\RXTXcomm.jar
includes=** includes=**
@ -39,9 +40,7 @@ javac.source=1.5
javac.target=1.5 javac.target=1.5
javac.test.classpath=\ javac.test.classpath=\
${javac.classpath}:\ ${javac.classpath}:\
${build.classes.dir}:\ ${build.classes.dir}
${libs.junit.classpath}:\
${libs.junit_4.classpath}
javac.test.processorpath=\ javac.test.processorpath=\
${javac.test.classpath} ${javac.test.classpath}
javadoc.additionalparam= javadoc.additionalparam=
@ -58,6 +57,7 @@ javadoc.windowtitle=
main.class=moppydesk.Main main.class=moppydesk.Main
manifest.file=manifest.mf manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform platform.active=default_platform
run.classpath=\ run.classpath=\
${javac.classpath}:\ ${javac.classpath}:\
@ -65,7 +65,7 @@ run.classpath=\
# Space-separated list of JVM arguments used when running the project # Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value # (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests): # or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs= run.jvmargs=-Djava.library.path="../SerialDrivers/rxtx-2.1-7-bins-r2/Windows/ch-rxtx-2.2-20081207-win-x64;${env_var:PATH}"
run.test.classpath=\ run.test.classpath=\
${javac.test.classpath}:\ ${javac.test.classpath}:\
${build.test.classes.dir} ${build.test.classes.dir}

View File

@ -1,26 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk;
/**
*
* @author Sam
*/
public class MIDINotes {
public static int[] microPeriods = {
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,21622,20409,19263,18182,17161,16198, //C1 - B1
15289,14436,13621,12856,12135,11454,10811,10205,9632,9091,8581,8099, //C2 - B2
7645,7218,6811,6428,6068,5727,5406,5103,4816,4546,4291,4050, //C3 - B3
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0
};
}

View File

@ -1,12 +1,8 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk; package moppydesk;
/** /**
* *
* @author Sam * @author Sammy1Am
*/ */
import gnu.io.NoSuchPortException; import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException; import gnu.io.PortInUseException;
@ -34,19 +30,17 @@ public class Main {
MoppyPlayer mp = null; MoppyPlayer mp = null;
try { try {
mb = new MoppyBridge("COM3"); mb = new MoppyBridge("COM6"); //Create MoppyBridge on the COM port with the Arduino
mp = new MoppyPlayer(mb); mp = new MoppyPlayer(mb);
mb.resetDrives(); mb.resetDrives();
//Load a MIDI file (TODO: Make this an argument, or a GUI window)
Sequence sequence = MidiSystem.getSequence(new File("samplesongs/KirbysTheme.mid"));
Sequence sequence = MidiSystem.getSequence(new File("songs/ImperialMarch.mid"));
final Sequencer sequencer = MidiSystem.getSequencer(false); final Sequencer sequencer = MidiSystem.getSequencer(false);
//Start a new thread to listen on the command-line to exit the program early
new Thread(){ new Thread(){
@Override @Override
public void run(){ public void run(){
@ -54,6 +48,8 @@ public class Main {
while (true){ while (true){
try { try {
if (br.readLine().equalsIgnoreCase("exit")) { if (br.readLine().equalsIgnoreCase("exit")) {
sequencer.stop();
sequencer.close();
System.exit(0); System.exit(0);
} }
} catch (IOException ex) { } catch (IOException ex) {
@ -63,16 +59,22 @@ public class Main {
} }
}.start(); }.start();
//Start the sequencer, and set the tempo (not being read from file!)
sequencer.open(); sequencer.open();
sequencer.setSequence(sequence); sequencer.setSequence(sequence);
sequencer.setTempoInBPM(110); sequencer.setTempoInBPM(160);
System.out.println(sequence.getTracks().length); System.out.println(sequence.getTracks().length);
sequencer.getTransmitter().setReceiver(mp); sequencer.getTransmitter().setReceiver(mp); // Set MoppyPlayer as a receiver.
sequencer.start(); sequencer.start(); //GO!
//Wait til the sequence is done...
while (sequencer.isRunning()){ while (sequencer.isRunning()){
Thread.sleep(3000); Thread.sleep(3000);
} }
//Close the sequencer
sequencer.close(); sequencer.close();
} catch (MidiUnavailableException ex) { } catch (MidiUnavailableException ex) {
@ -90,7 +92,7 @@ public class Main {
} catch (IOException ex) { } catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} finally { } finally {
//Reset everything and close down cleanly (hopefully)
if (mb != null){ if (mb != null){
mb.resetDrives(); mb.resetDrives();
mb.close(); mb.close();

View File

@ -1,8 +1,3 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk; package moppydesk;
import gnu.io.CommPortIdentifier; import gnu.io.CommPortIdentifier;
@ -17,10 +12,13 @@ import java.util.logging.Logger;
/** /**
* *
* @author Sam * @author Sammy1Am
*/ */
public class MoppyBridge { public class MoppyBridge {
static int FIRST_PIN = 2;
static int MAX_PIN = 9;
int SERIAL_RATE = 9600; int SERIAL_RATE = 9600;
OutputStream os; OutputStream os;
SerialPort com; SerialPort com;
@ -32,10 +30,22 @@ public class MoppyBridge {
os = com.getOutputStream(); os = com.getOutputStream();
} }
/**
* Convenience method that splits the periodData int
* into two bytes for sending over serial.
* @param pin Controller pin to handle ntoe
* @param periodData length of period in microSeconds
*/
public void sendEvent(byte pin, int periodData){ public void sendEvent(byte pin, int periodData){
sendEvent(pin, (byte)((periodData >> 8) & 0xFF), (byte)(periodData & 0xFF)); sendEvent(pin, (byte)((periodData >> 8) & 0xFF), (byte)(periodData & 0xFF));
} }
/**
* Sends an event to the Arduino.
* @param pin Controller pin
* @param b1
* @param b2
*/
public void sendEvent(byte pin, byte b1, byte b2){ public void sendEvent(byte pin, byte b1, byte b2){
sendArray(new byte[] {pin, b1, b2}); sendArray(new byte[] {pin, b1, b2});
} }
@ -49,13 +59,19 @@ public class MoppyBridge {
} }
} }
/**
* Sends a '0' period to all drives to silence them.
*/
private void silenceDrives(){ private void silenceDrives(){
// Stop notes // Stop notes
for (int d=2;d<=6;d+=2){ for (int d=FIRST_PIN;d<=MAX_PIN;d+=2){
sendArray(new byte[] {(byte)d,(byte)0,(byte)0}); sendArray(new byte[] {(byte)d,(byte)0,(byte)0});
} }
} }
/**
* Sends a special code (first byte=100) to reset the drives
*/
public void resetDrives(){ public void resetDrives(){
silenceDrives(); silenceDrives();
//Send reset code //Send reset code
@ -68,8 +84,8 @@ public class MoppyBridge {
} }
public void close(){ public void close(){
silenceDrives();
if (os != null){ if (os != null){
silenceDrives();
try { try {
os.close(); os.close();
} catch (IOException ex) { } catch (IOException ex) {

View File

@ -1,7 +1,3 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk; package moppydesk;
import gnu.io.SerialPort; import gnu.io.SerialPort;
@ -9,10 +5,17 @@ import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver; import javax.sound.midi.Receiver;
/** /**
* *
* @author Sam * @author Sammy1Am
*/ */
public class MoppyPlayer implements Receiver { public class MoppyPlayer implements Receiver {
/**
* The periods for each MIDI note in an array. The floppy drives
* don't really do well outside of the defined range, so skip those notes.
* Periods are in microseconds because that's what the Arduino uses for its
* clock-cycles in the micro() function, and because milliseconds aren't
* precise enough for musical notes.
*/
public static int[] microPeriods = { public static int[] microPeriods = {
0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,
@ -36,15 +39,26 @@ public class MoppyPlayer implements Receiver {
mb.close(); mb.close();
} }
//Is called by Java MIDI libraries for each MIDI message encountered.
public void send(MidiMessage message, long timeStamp) { public void send(MidiMessage message, long timeStamp) {
if (message.getStatus() > 127 && message.getStatus() < 144){ // Note OFF if (message.getStatus() > 127 && message.getStatus() < 144){ // Note OFF
//Convert the MIDI channel being used to the controller pin on the
//Arduino by multipying by 2.
byte pin = (byte)(2*(message.getStatus() - 127)); byte pin = (byte)(2*(message.getStatus() - 127));
//System.out.println("Got note OFF on pin: " + (channel & 0xFF)); //System.out.println("Got note OFF on pin: " + (channel & 0xFF));
mb.sendEvent(pin, 0); mb.sendEvent(pin, 0);
} }
else if (message.getStatus() > 143 && message.getStatus() < 160){ // Note ON else if (message.getStatus() > 143 && message.getStatus() < 160){ // Note ON
//Convert the MIDI channel being used to the controller pin on the
//Arduino by multipying by 2.
byte pin = (byte)(2*(message.getStatus() - 143)); byte pin = (byte)(2*(message.getStatus() - 143));
//Get note number from MIDI message, and look up the period.
//NOTE: Java bytes range from -128 to 127, but we need to make them
//0-255 to use for lookups. & 0xFF does the trick.
int period = microPeriods[(message.getMessage()[1] & 0xff)]; int period = microPeriods[(message.getMessage()[1] & 0xff)];
//System.out.println("Got note ON on pin: " + (pin & 0xFF) + " with period " + period); //System.out.println("Got note ON on pin: " + (pin & 0xFF) + " with period " + period);
mb.sendEvent(pin, period); mb.sendEvent(pin, period);
} }

View File

@ -1,67 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package moppydesk;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.ControllerEventListener;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
/**
*
* @author Sam
*/
public class MoppyPlayer1 implements Receiver {
OutputStream os;
SerialPort com;
public MoppyPlayer1(String portName) throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException, IOException {
CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier(portName);
com = (SerialPort) cpi.open("MoppyDesk", 2000);
com.setSerialPortParams(31250, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
os = com.getOutputStream();
}
public void close(){
if (os!=null){
try {
os.close();
} catch (IOException ex) {
Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (com!=null){
com.close();
}
}
public void send(MidiMessage message, long timeStamp) {
if (message.getStatus() > 127 && message.getStatus() < 160){
try {
ShortMessage sm = (ShortMessage) message;
//System.out.println(sm.getChannel());
//TODO Channels start at 0??
sm.setMessage(sm.getStatus()+1, sm.getData1(), sm.getData2()); //Try shifting channel
os.write(sm.getMessage());
} catch (InvalidMidiDataException ex) {
Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}

37
README.txt Normal file
View File

@ -0,0 +1,37 @@
__ ___
/ |/ /__ ___ ___ __ __
/ /|_/ / _ \/ _ \/ _ \/ // /
/_/ /_/\___/ .__/ .__/\_, /
/_/ /_/ /___/
by Sammy1Am
Moppy is a M_usical Fl_oppy controller program built for the Ardiuno UNO.
--INSTALLATION--
Upload the included Arduino code to the Arduino of your choice, and open up the included Java code in your favorite IDE. This code includes a NetBeans project for your convenience, so you should be able to open the project directly in NetBeans.
--HARDWARE--
I built Moppy using an Arduino UNO, though it should work just fine on most Arduinos. The pins are connected in pairs to floppy drives as follows: Even pins (2,4,6...) are connected to the drive's STEP pin, the matching odd pins (3,5,7...) are connected to the drive's DIRECTION control pin.
Some pinout information can be found here: http://pinouts.ru/Storage/InternalDisk_pinout.shtml
Make sure you short the correct drive-select pin, or the drive won't respond to any input. Also, it's VERY IMPORTANT that your Arduino is grounded with the drives, or the drives will not register the pulses correctly.
--CONFIGURAITON / USE--
Right now, there is no configuration for MoppyDesk (the Moppy Desktop application for controlling) and any variables need to be changed in the code itself. This will be improved in the future.
Edit the code to select the appropriate COM port, and point to the correct MIDI file. Don't forget to edit the tempo in the code as well.
MIDI files should have one MIDI track for each controller pin on the Arduino. Track 1 will be sent to pin2, track 2 to pin4, &c.
Run the java code, cross your fingers, and enjoy!
--HELP/CONTRIBUTIONS--
https://github.com/SammyIAm/Moppy