Added README and updated Java code with comments!
This commit is contained in:
parent
9728c2992c
commit
be30db892e
|
@ -55,7 +55,14 @@ is divided into following sections:
|
|||
</target>
|
||||
<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="${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">
|
||||
<and>
|
||||
<isset property="main.class"/>
|
||||
|
@ -70,8 +77,14 @@ is divided into following sections:
|
|||
<isset property="main.class.available"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="do.archive">
|
||||
<not>
|
||||
<istrue value="${jar.archive.disabled}"/>
|
||||
</not>
|
||||
</condition>
|
||||
<condition property="do.mkdist">
|
||||
<and>
|
||||
<isset property="do.archive"/>
|
||||
<isset property="libs.CopyLibs.classpath"/>
|
||||
<not>
|
||||
<istrue value="${mkdist.disabled}"/>
|
||||
|
@ -84,40 +97,41 @@ is divided into following sections:
|
|||
<isset property="do.mkdist"/>
|
||||
</and>
|
||||
</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">
|
||||
<and>
|
||||
<isset property="manifest.available"/>
|
||||
<istrue value="${do.archive}"/>
|
||||
</and>
|
||||
</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">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class}"/>
|
||||
<istrue value="${do.archive}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="do.archive+manifest.available+main.class+mkdist.available">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class+mkdist.available}"/>
|
||||
<istrue value="${do.archive}"/>
|
||||
</and>
|
||||
<condition property="manifest.available-mkdist.available">
|
||||
<or>
|
||||
<istrue value="${manifest.available}"/>
|
||||
<isset property="do.mkdist"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/>
|
||||
<istrue value="${do.archive}"/>
|
||||
</and>
|
||||
<condition property="manifest.available+main.class-mkdist.available">
|
||||
<or>
|
||||
<istrue value="${manifest.available+main.class}"/>
|
||||
<isset property="do.mkdist"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="have.tests">
|
||||
<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}'">
|
||||
<length length="0" string="${endorsed.classpath}" when="greater"/>
|
||||
</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.metainf" value="${jar.index}"/>
|
||||
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
|
||||
</target>
|
||||
<target name="-post-init">
|
||||
|
@ -291,14 +314,19 @@ is divided into following sections:
|
|||
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||
<sequential>
|
||||
<fail unless="javac.includes">Must set javac.includes</fail>
|
||||
<pathconvert pathsep="," property="javac.includes.binary">
|
||||
<pathconvert pathsep="${line.separator}" property="javac.includes.binary">
|
||||
<path>
|
||||
<filelist dir="@{destdir}" files="${javac.includes}"/>
|
||||
</path>
|
||||
<globmapper from="*.java" to="*.class"/>
|
||||
</pathconvert>
|
||||
<tempfile deleteonexit="true" property="javac.includesfile.binary"/>
|
||||
<echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
|
||||
<delete>
|
||||
<files includes="${javac.includes.binary}"/>
|
||||
<files includesfile="${javac.includesfile.binary}"/>
|
||||
</delete>
|
||||
<delete>
|
||||
<fileset file="${javac.includesfile.binary}"/>
|
||||
</delete>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
@ -309,7 +337,8 @@ is divided into following sections:
|
|||
<attribute default="${excludes}" name="excludes"/>
|
||||
<attribute default="**" name="testincludes"/>
|
||||
<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}">
|
||||
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
|
||||
<filename name="@{testincludes}"/>
|
||||
|
@ -325,11 +354,56 @@ is divided into following sections:
|
|||
<formatter type="brief" usefile="false"/>
|
||||
<formatter type="xml"/>
|
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
|
||||
<jvmarg value="-ea"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
</junit>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</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">
|
||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute default="${main.class}" name="name"/>
|
||||
|
@ -424,6 +498,7 @@ is divided into following sections:
|
|||
</target>
|
||||
<target name="-init-macrodef-copylibs">
|
||||
<macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${manifest.file}" name="manifest"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||
|
@ -439,7 +514,7 @@ is divided into following sections:
|
|||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<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}"/>
|
||||
<manifest>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
|
@ -568,10 +643,10 @@ is divided into following sections:
|
|||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</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/>
|
||||
</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}"/>
|
||||
</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">
|
||||
|
@ -580,44 +655,53 @@ is divided into following sections:
|
|||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||
</j2seproject1:manifest>
|
||||
</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="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<pathconvert property="run.classpath.with.dist.jar">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||
</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 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"/>
|
||||
<mkdir dir="${build.classes.dir}/META-INF"/>
|
||||
<copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
|
||||
<j2seproject3:copylibs>
|
||||
<customize>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<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>
|
||||
<manifest file="${tmp.manifest.file}" mode="update">
|
||||
<attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
|
||||
</manifest>
|
||||
</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">
|
||||
<j2seproject3:copylibs>
|
||||
<customize>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
</customize>
|
||||
</j2seproject3:copylibs>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<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 manifest="${tmp.manifest.file}"/>
|
||||
<echo level="info">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>
|
||||
<echo level="info">java -jar "${dist.jar.resolved}"</echo>
|
||||
</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">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</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
|
||||
|
@ -682,6 +766,72 @@ is divided into following sections:
|
|||
<j2seproject1:nbjpdareload/>
|
||||
</target>
|
||||
<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
|
||||
|
@ -693,11 +843,12 @@ is divided into following sections:
|
|||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
||||
<fileset dir="${src.dir}" excludes="*.java,${excludes}" includes="${includes}">
|
||||
<filename name="**/*.java"/>
|
||||
</fileset>
|
||||
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
|
||||
<include name="**/*.java"/>
|
||||
<exclude name="*.java"/>
|
||||
</fileset>
|
||||
</javadoc>
|
||||
<copy todir="${dist.javadoc.dir}">
|
||||
|
@ -728,7 +879,7 @@ is divided into following sections:
|
|||
<target if="do.depend.true" name="-compile-test-depend">
|
||||
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||
</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}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<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. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</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>
|
||||
<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}"/>
|
||||
|
|
|
@ -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.
|
||||
# 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.script.CRC32=05ef9bdb
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=f33e10ff@1.38.2.45
|
||||
nbproject/build-impl.xml.script.CRC32=9ea63390
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=0ae3a408@1.44.1.45
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
annotation.processing.enabled=true
|
||||
annotation.processing.enabled.in.editor=false
|
||||
annotation.processing.processor.options=
|
||||
annotation.processing.processors.list=
|
||||
annotation.processing.run.all.processors=true
|
||||
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.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
|
@ -24,6 +24,7 @@ debug.test.classpath=\
|
|||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/MoppyDesk.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
endorsed.classpath=
|
||||
excludes=
|
||||
file.reference.RXTXcomm.jar=lib\\RXTXcomm.jar
|
||||
includes=**
|
||||
|
@ -39,9 +40,7 @@ javac.source=1.5
|
|||
javac.target=1.5
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}:\
|
||||
${libs.junit.classpath}:\
|
||||
${libs.junit_4.classpath}
|
||||
${build.classes.dir}
|
||||
javac.test.processorpath=\
|
||||
${javac.test.classpath}
|
||||
javadoc.additionalparam=
|
||||
|
@ -58,6 +57,7 @@ javadoc.windowtitle=
|
|||
main.class=moppydesk.Main
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=false
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
|
@ -65,7 +65,7 @@ run.classpath=\
|
|||
# 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
|
||||
# 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=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
}
|
|
@ -1,12 +1,8 @@
|
|||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package moppydesk;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Sam
|
||||
* @author Sammy1Am
|
||||
*/
|
||||
import gnu.io.NoSuchPortException;
|
||||
import gnu.io.PortInUseException;
|
||||
|
@ -34,19 +30,17 @@ public class Main {
|
|||
MoppyPlayer mp = null;
|
||||
|
||||
try {
|
||||
mb = new MoppyBridge("COM3");
|
||||
mb = new MoppyBridge("COM6"); //Create MoppyBridge on the COM port with the Arduino
|
||||
mp = new MoppyPlayer(mb);
|
||||
|
||||
mb.resetDrives();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Sequence sequence = MidiSystem.getSequence(new File("songs/ImperialMarch.mid"));
|
||||
//Load a MIDI file (TODO: Make this an argument, or a GUI window)
|
||||
Sequence sequence = MidiSystem.getSequence(new File("samplesongs/KirbysTheme.mid"));
|
||||
|
||||
final Sequencer sequencer = MidiSystem.getSequencer(false);
|
||||
|
||||
//Start a new thread to listen on the command-line to exit the program early
|
||||
new Thread(){
|
||||
@Override
|
||||
public void run(){
|
||||
|
@ -54,6 +48,8 @@ public class Main {
|
|||
while (true){
|
||||
try {
|
||||
if (br.readLine().equalsIgnoreCase("exit")) {
|
||||
sequencer.stop();
|
||||
sequencer.close();
|
||||
System.exit(0);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
|
@ -63,16 +59,22 @@ public class Main {
|
|||
}
|
||||
}.start();
|
||||
|
||||
|
||||
//Start the sequencer, and set the tempo (not being read from file!)
|
||||
sequencer.open();
|
||||
sequencer.setSequence(sequence);
|
||||
sequencer.setTempoInBPM(110);
|
||||
sequencer.setTempoInBPM(160);
|
||||
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()){
|
||||
Thread.sleep(3000);
|
||||
}
|
||||
|
||||
//Close the sequencer
|
||||
sequencer.close();
|
||||
|
||||
} catch (MidiUnavailableException ex) {
|
||||
|
@ -90,7 +92,7 @@ public class Main {
|
|||
} catch (IOException ex) {
|
||||
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||
} finally {
|
||||
|
||||
//Reset everything and close down cleanly (hopefully)
|
||||
if (mb != null){
|
||||
mb.resetDrives();
|
||||
mb.close();
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package moppydesk;
|
||||
|
||||
import gnu.io.CommPortIdentifier;
|
||||
|
@ -17,10 +12,13 @@ import java.util.logging.Logger;
|
|||
|
||||
/**
|
||||
*
|
||||
* @author Sam
|
||||
* @author Sammy1Am
|
||||
*/
|
||||
public class MoppyBridge {
|
||||
|
||||
static int FIRST_PIN = 2;
|
||||
static int MAX_PIN = 9;
|
||||
|
||||
int SERIAL_RATE = 9600;
|
||||
OutputStream os;
|
||||
SerialPort com;
|
||||
|
@ -32,10 +30,22 @@ public class MoppyBridge {
|
|||
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){
|
||||
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){
|
||||
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(){
|
||||
// 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});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a special code (first byte=100) to reset the drives
|
||||
*/
|
||||
public void resetDrives(){
|
||||
silenceDrives();
|
||||
//Send reset code
|
||||
|
@ -68,8 +84,8 @@ public class MoppyBridge {
|
|||
}
|
||||
|
||||
public void close(){
|
||||
silenceDrives();
|
||||
if (os != null){
|
||||
silenceDrives();
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException ex) {
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package moppydesk;
|
||||
|
||||
import gnu.io.SerialPort;
|
||||
|
@ -9,10 +5,17 @@ import javax.sound.midi.MidiMessage;
|
|||
import javax.sound.midi.Receiver;
|
||||
/**
|
||||
*
|
||||
* @author Sam
|
||||
* @author Sammy1Am
|
||||
*/
|
||||
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 = {
|
||||
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();
|
||||
}
|
||||
|
||||
//Is called by Java MIDI libraries for each MIDI message encountered.
|
||||
public void send(MidiMessage message, long timeStamp) {
|
||||
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));
|
||||
|
||||
//System.out.println("Got note OFF on pin: " + (channel & 0xFF));
|
||||
mb.sendEvent(pin, 0);
|
||||
}
|
||||
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));
|
||||
|
||||
//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)];
|
||||
|
||||
//System.out.println("Got note ON on pin: " + (pin & 0xFF) + " with period " + period);
|
||||
mb.sendEvent(pin, period);
|
||||
}
|
||||
|
|
|
@ -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
37
README.txt
Normal 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
|
Loading…
Reference in New Issue
Block a user