changeset 1:5df24c91468d

Oh my what a mess.
author samer
date Fri, 05 Apr 2019 16:26:00 +0100
parents bf79fb79ee13
children 74cc9e431818
files .hgignore build/samer/applet/ButtonsApplet.class build/samer/applet/ConsoleApplet.class build/samer/applet/JApplet$1$1.class build/samer/applet/JApplet$1.class build/samer/applet/JApplet.class build/samer/applet/JAppletShell$VContainer.class build/samer/applet/JAppletShell.class build/samer/applet/Sierpinski$1.class build/samer/applet/Sierpinski.class build/samer/applet/WindowApplet.class build/samer/audio/AudioSink$Util.class build/samer/audio/AudioSink.class build/samer/audio/AudioSource$Util.class build/samer/audio/AudioSource.class build/samer/audio/FileSink$1.class build/samer/audio/FileSink$2.class build/samer/audio/FileSink.class build/samer/audio/FileSource$1.class build/samer/audio/FileSource$2.class build/samer/audio/FileSource$3.class build/samer/audio/FileSource$FileSourceViewer.class build/samer/audio/FileSource.class build/samer/audio/LineSink$1.class build/samer/audio/LineSink$2.class build/samer/audio/LineSink$Writer.class build/samer/audio/LineSink.class build/samer/audio/LineSource$1.class build/samer/audio/LineSource$2.class build/samer/audio/LineSource$Reader.class build/samer/audio/LineSource.class build/samer/audio/VLine$LineViewer.class build/samer/audio/VLine.class build/samer/core/Agent$Registry.class build/samer/core/Agent.class build/samer/core/CompoundAgent.class build/samer/core/DefaultShell.class build/samer/core/DoubleFormat.class build/samer/core/Environment$1.class build/samer/core/Environment$2$1.class build/samer/core/Environment$2.class build/samer/core/Environment$Autocoder.class build/samer/core/Environment$Binding.class build/samer/core/Environment$Codec.class build/samer/core/Environment$CompoundIterator.class build/samer/core/Environment$Datum.class build/samer/core/Environment$Iterator.class build/samer/core/Environment.class build/samer/core/Node.class build/samer/core/NumberSink.class build/samer/core/NumberViewer.class build/samer/core/Registry.class build/samer/core/Saveable.class build/samer/core/Saver.class build/samer/core/Shell$1.class build/samer/core/Shell$2.class build/samer/core/Shell$3.class build/samer/core/Shell$Dialog.class build/samer/core/Shell$Interface.class build/samer/core/Shell$Interpreter.class build/samer/core/Shell$ViewerWindowListener$1.class build/samer/core/Shell$ViewerWindowListener.class build/samer/core/Shell$Window.class build/samer/core/Shell.class build/samer/core/Variable.class build/samer/core/Viewable$1.class build/samer/core/Viewable$Vector.class build/samer/core/Viewable.class build/samer/core/Viewer.class build/samer/core/X$1.class build/samer/core/X$2.class build/samer/core/X$3.class build/samer/core/X$4.class build/samer/core/X$5.class build/samer/core/X$6.class build/samer/core/X$7.class build/samer/core/X$BaseCodec.class build/samer/core/X.class build/samer/core/shells/AWTShell$VContainer.class build/samer/core/shells/AWTShell.class build/samer/core/shells/BevelWindow.class build/samer/core/shells/DesktopShell$1.class build/samer/core/shells/DesktopShell$VContainer.class build/samer/core/shells/DesktopShell.class build/samer/core/shells/SwingShell$1.class build/samer/core/shells/SwingShell$VContainer.class build/samer/core/shells/SwingShell.class build/samer/core/types/DoubleModel.class build/samer/core/types/VBoolean.class build/samer/core/types/VColor.class build/samer/core/types/VDouble.class build/samer/core/types/VFile.class build/samer/core/types/VInteger.class build/samer/core/types/VParameter.class build/samer/core/types/VRectangle.class build/samer/core/types/VString.class build/samer/core/util/AgentAdapter.class build/samer/core/util/BaseViewer.class build/samer/core/util/ConsoleEnvironment$Texton.class build/samer/core/util/ConsoleEnvironment.class build/samer/core/util/DefaultViewer.class build/samer/core/util/FileFilter.class build/samer/core/util/FilteredEnvironment.class build/samer/core/util/HashMap$1.class build/samer/core/util/HashMap$Entry.class build/samer/core/util/HashMap.class build/samer/core/util/IMap.class build/samer/core/util/LinearMap.class build/samer/core/util/LogMap.class build/samer/core/util/MouseRetarget.class build/samer/core/util/Properties$1.class build/samer/core/util/Properties$Property.class build/samer/core/util/Properties.class build/samer/core/util/StackLayout.class build/samer/core/util/Tools.class build/samer/core/util/UserEnvironment$1.class build/samer/core/util/UserEnvironment$2.class build/samer/core/util/UserEnvironment$3.class build/samer/core/util/UserEnvironment$4.class build/samer/core/util/UserEnvironment$5.class build/samer/core/util/UserEnvironment$Gluon.class build/samer/core/util/UserEnvironment$Thingy.class build/samer/core/util/UserEnvironment.class build/samer/core/util/VLayout.class build/samer/core/util/VMap$Adjuster.class build/samer/core/util/VMap.class build/samer/core/util/VariableViewer.class build/samer/core/util/heavy/Border$1.class build/samer/core/util/heavy/Border$Base.class build/samer/core/util/heavy/Border$BevelInfo.class build/samer/core/util/heavy/Border$Empty.class build/samer/core/util/heavy/Border$In.class build/samer/core/util/heavy/Border$Interface.class build/samer/core/util/heavy/Border$Null.class build/samer/core/util/heavy/Border$Out.class build/samer/core/util/heavy/Border.class build/samer/core/util/heavy/Borders$AbstractBorder.class build/samer/core/util/heavy/Borders$CompoundBorder.class build/samer/core/util/heavy/Borders$EllipticalBorder.class build/samer/core/util/heavy/Borders$EmptyBorder.class build/samer/core/util/heavy/Borders$LoweredBevelBorder.class build/samer/core/util/heavy/Borders$ParentBgBorder.class build/samer/core/util/heavy/Borders$RaisedBevelBorder.class build/samer/core/util/heavy/Borders$RoundedBorder.class build/samer/core/util/heavy/Borders$SimpleBorder.class build/samer/core/util/heavy/Borders.class build/samer/core/util/heavy/ButtonBar.class build/samer/core/util/heavy/CommandField$Handler.class build/samer/core/util/heavy/CommandField.class build/samer/core/util/heavy/Console$OutputStream.class build/samer/core/util/heavy/Console$Writer.class build/samer/core/util/heavy/Console.class build/samer/core/util/heavy/Dialog$1.class build/samer/core/util/heavy/Dialog.class build/samer/core/util/heavy/Frame.class build/samer/core/util/heavy/JPanel.class build/samer/core/util/heavy/MenuBuilder.class build/samer/core/util/heavy/Meter$1.class build/samer/core/util/heavy/Meter.class build/samer/core/util/heavy/PopupHandler.class build/samer/core/util/heavy/TextualNumberViewer.class build/samer/core/util/heavy/VCanvas$1.class build/samer/core/util/heavy/VCanvas.class build/samer/core/util/heavy/VPanel.class build/samer/core/util/shell/AgentManager$1.class build/samer/core/util/shell/AgentManager.class build/samer/core/util/shell/AppShellBase.class build/samer/core/util/shell/ViewableManager$1.class build/samer/core/util/shell/ViewableManager$2.class build/samer/core/util/shell/ViewableManager$3.class build/samer/core/util/shell/ViewableManager$VblEntry.class build/samer/core/util/shell/ViewableManager$ViewerContainer.class build/samer/core/util/shell/ViewableManager$VwrEntry.class build/samer/core/util/shell/ViewableManager.class build/samer/core/util/swing/ButtonBar.class build/samer/core/util/swing/CommandField$Handler.class build/samer/core/util/swing/CommandField.class build/samer/core/util/swing/Console$OutputStream.class build/samer/core/util/swing/Console$Writer.class build/samer/core/util/swing/Console.class build/samer/core/util/swing/DarkMetalTheme.class build/samer/core/util/swing/Dialog.class build/samer/core/util/swing/DynamicPopupHandler.class build/samer/core/util/swing/Frame.class build/samer/core/util/swing/InternalFrame$1.class build/samer/core/util/swing/InternalFrame.class build/samer/core/util/swing/LED.class build/samer/core/util/swing/MenuBuilder.class build/samer/core/util/swing/Meter$1.class build/samer/core/util/swing/Meter.class build/samer/core/util/swing/PopupHandler.class build/samer/core/util/swing/SilkyMetalTheme.class build/samer/core/util/swing/TextualNumberViewer.class build/samer/core/util/swing/VCanvas$1.class build/samer/core/util/swing/VCanvas.class build/samer/core/util/swing/VContainerBase.class build/samer/core/util/swing/VPanel.class build/samer/core/viewers/BooleanViewer.class build/samer/core/viewers/ColorButton.class build/samer/core/viewers/ColorSwatch.class build/samer/core/viewers/ColorViewer.class build/samer/core/viewers/DoubleViewer.class build/samer/core/viewers/FileViewer.class build/samer/core/viewers/IntegerViewer.class build/samer/core/viewers/NumberViewer.class build/samer/core/viewers/ParameterViewer.class build/samer/core/viewers/StringViewer.class build/samer/core/viewers/swing/BooleanViewer.class build/samer/core/viewers/swing/ColorButton.class build/samer/core/viewers/swing/ColorChooserViewer$ColorModelAdapter.class build/samer/core/viewers/swing/ColorChooserViewer.class build/samer/core/viewers/swing/ColorSwatch.class build/samer/core/viewers/swing/ColorViewer.class build/samer/core/viewers/swing/DoubleViewer$1.class build/samer/core/viewers/swing/DoubleViewer.class build/samer/core/viewers/swing/FileChooserViewer.class build/samer/core/viewers/swing/FileViewer.class build/samer/core/viewers/swing/IntegerViewer.class build/samer/core/viewers/swing/NumberViewer.class build/samer/core/viewers/swing/ParameterViewer.class build/samer/core/viewers/swing/StringViewer.class build/samer/core/viewers/swing/Swatch.class build/samer/functions/Abs.class build/samer/functions/Add.class build/samer/functions/Atanh.class build/samer/functions/BiLaplacian$1.class build/samer/functions/BiLaplacian.class build/samer/functions/BiLaplacianBlend$1.class build/samer/functions/BiLaplacianBlend.class build/samer/functions/CauchyInfomax.class build/samer/functions/CompoundFunction$1.class build/samer/functions/CompoundFunction$2.class build/samer/functions/CompoundFunction.class build/samer/functions/Exp.class build/samer/functions/ExponentialSquashing.class build/samer/functions/Gamma.class build/samer/functions/HalfSquare.class build/samer/functions/Hamming.class build/samer/functions/Hanning.class build/samer/functions/HybridFunction.class build/samer/functions/Log.class build/samer/functions/LogAbs.class build/samer/functions/LogCauchy.class build/samer/functions/LogCosh$1.class build/samer/functions/LogCosh.class build/samer/functions/LogGenCosh$1.class build/samer/functions/LogGenCosh.class build/samer/functions/LogGenExp$1.class build/samer/functions/LogGenExp$2.class build/samer/functions/LogGenExp.class build/samer/functions/LogGenExp2$1.class build/samer/functions/LogGenExp2$2.class build/samer/functions/LogGenExp2$3.class build/samer/functions/LogGenExp2.class build/samer/functions/LogisiticInfomax.class build/samer/functions/LogisticHyperplane.class build/samer/functions/Negate.class build/samer/functions/Power.class build/samer/functions/Quadratic.class build/samer/functions/RaleighLogPrior$1.class build/samer/functions/RaleighLogPrior.class build/samer/functions/Reciprocal.class build/samer/functions/Scale.class build/samer/functions/ScaledFunction.class build/samer/functions/Sgn.class build/samer/functions/SparseExponential$1.class build/samer/functions/SparseExponential.class build/samer/functions/Sqrt.class build/samer/functions/Square.class build/samer/functions/Step.class build/samer/functions/Tanh$1.class build/samer/functions/Tanh.class build/samer/functions/ThresholdLog.class build/samer/functions/WinnerTakeAll.class build/samer/j3d/Axes.class build/samer/j3d/FPS.class build/samer/j3d/ImmediateRenderer.class build/samer/j3d/MatrixPointArray$1.class build/samer/j3d/MatrixPointArray.class build/samer/j3d/MatrixPointArrayAlpha$1.class build/samer/j3d/MatrixPointArrayAlpha.class build/samer/j3d/MatrixPointArrayRef$1.class build/samer/j3d/MatrixPointArrayRef.class build/samer/j3d/MatrixPoints4D$1.class build/samer/j3d/MatrixPoints4D.class build/samer/j3d/MonoView.class build/samer/j3d/MorphPoints$MorphBehavior.class build/samer/j3d/MorphPoints.class build/samer/j3d/PatchArray$1.class build/samer/j3d/PatchArray.class build/samer/j3d/PatchArrayAlpha$1.class build/samer/j3d/PatchArrayAlpha.class build/samer/j3d/Patches$1.class build/samer/j3d/Patches.class build/samer/j3d/PatchesAlpha$1.class build/samer/j3d/PatchesAlpha.class build/samer/j3d/Points3D$1.class build/samer/j3d/Points3D.class build/samer/j3d/Points3DAlpha$1.class build/samer/j3d/Points3DAlpha.class build/samer/j3d/Points3DRef$1.class build/samer/j3d/Points3DRef.class build/samer/j3d/Points4D$1.class build/samer/j3d/Points4D.class build/samer/j3d/Root.class build/samer/j3d/StereoView.class build/samer/j3d/Util.class build/samer/j3d/ViewBase.class build/samer/j3d/ViewGroup.class build/samer/maths/ClippedDivide.class build/samer/maths/ComplexVector.class build/samer/maths/Constant.class build/samer/maths/Difference.class build/samer/maths/Function.class build/samer/maths/FunctionMap.class build/samer/maths/FunctionOfGenerator.class build/samer/maths/FunctionOfVector.class build/samer/maths/FunctionPlotter$1.class build/samer/maths/FunctionPlotter$FunctionIterator.class build/samer/maths/FunctionPlotter.class build/samer/maths/Generator.class build/samer/maths/Identity.class build/samer/maths/IntArrayEditor.class build/samer/maths/IteratorImageSource.class build/samer/maths/LineTrace.class build/samer/maths/Linear.class build/samer/maths/Mat.class build/samer/maths/MatEditor.class build/samer/maths/Mathx.class build/samer/maths/Matrix$1$1.class build/samer/maths/Matrix$1$2.class build/samer/maths/Matrix$1.class build/samer/maths/Matrix$Column$1.class build/samer/maths/Matrix$Column.class build/samer/maths/Matrix$Row$1.class build/samer/maths/Matrix$Row.class build/samer/maths/Matrix$Slice.class build/samer/maths/Matrix$Vbl.class build/samer/maths/Matrix.class build/samer/maths/MatrixAgent.class build/samer/maths/MatrixImage.class build/samer/maths/MatrixImageSource.class build/samer/maths/MatrixImageSourceF.class build/samer/maths/MatrixPanel$Field.class build/samer/maths/MatrixPanel.class build/samer/maths/MatrixPlotter$1.class build/samer/maths/MatrixPlotter.class build/samer/maths/MatrixTImageSource.class build/samer/maths/MatrixTImageSourceF.class build/samer/maths/MatrixTimesVector.class build/samer/maths/MatrixTransposeTimesVector.class build/samer/maths/Neg.class build/samer/maths/Ops$1.class build/samer/maths/Ops$2.class build/samer/maths/Ops$3.class build/samer/maths/Ops$4.class build/samer/maths/Ops$5.class build/samer/maths/Ops$6.class build/samer/maths/Ops$7.class build/samer/maths/Ops$8.class build/samer/maths/Ops$9.class build/samer/maths/Ops$ArrayCopy.class build/samer/maths/Ops$IteratorCopy.class build/samer/maths/Ops.class build/samer/maths/Parameter.class build/samer/maths/Probe.class build/samer/maths/Product.class build/samer/maths/RowColumn.class build/samer/maths/SparseMatrix.class build/samer/maths/Sum.class build/samer/maths/VFunction$1.class build/samer/maths/VFunction$2.class build/samer/maths/VFunction.class build/samer/maths/VGenerator$UI.class build/samer/maths/VGenerator.class build/samer/maths/VVector$1.class build/samer/maths/VVector$2.class build/samer/maths/VVector.class build/samer/maths/Vec$ForArray$InputIterator.class build/samer/maths/Vec$ForArray$Iterator.class build/samer/maths/Vec$ForArray.class build/samer/maths/Vec$InputIterator.class build/samer/maths/Vec$Iterator.class build/samer/maths/Vec.class build/samer/maths/VectorEditor.class build/samer/maths/VectorFunctionOfVector.class build/samer/maths/VectorPlotter.class build/samer/maths/VectorPlusEqualsVector.class build/samer/maths/VectorTimesEqualsScalar.class build/samer/maths/VectorTrace.class build/samer/maths/VectorTraceObs.class build/samer/maths/Zero.class build/samer/maths/opt/AbsXFConvergence.class build/samer/maths/opt/Condition.class build/samer/maths/opt/ConjGrad.class build/samer/maths/opt/ConstrainedConjGrad.class build/samer/maths/opt/ConstrainedGillMurray.class build/samer/maths/opt/ConstrainedMinimiser.class build/samer/maths/opt/Constraints$Factory.class build/samer/maths/opt/Constraints.class build/samer/maths/opt/CubicLineSearch.class build/samer/maths/opt/Datum.class build/samer/maths/opt/Functionx.class build/samer/maths/opt/GConvergence.class build/samer/maths/opt/GillMurray.class build/samer/maths/opt/MinimiserBase$1.class build/samer/maths/opt/MinimiserBase$2.class build/samer/maths/opt/MinimiserBase$3.class build/samer/maths/opt/MinimiserBase$4.class build/samer/maths/opt/MinimiserBase$5.class build/samer/maths/opt/MinimiserBase$LSCondition$1.class build/samer/maths/opt/MinimiserBase$LSCondition.class build/samer/maths/opt/MinimiserBase.class build/samer/maths/opt/PolynomialLineSearch.class build/samer/maths/opt/Positivity$1.class build/samer/maths/opt/Positivity$2.class build/samer/maths/opt/Positivity.class build/samer/maths/opt/State.class build/samer/maths/opt/SubspaceFunctionx.class build/samer/maths/opt/UnconstrainedConjGrad$1.class build/samer/maths/opt/UnconstrainedConjGrad.class build/samer/maths/opt/UnconstrainedMinimiser.class build/samer/maths/opt/Util.class build/samer/maths/opt/XFConvergence.class build/samer/maths/opt/ZeroCrossingSparsity$1.class build/samer/maths/opt/ZeroCrossingSparsity$2.class build/samer/maths/opt/ZeroCrossingSparsity$3.class build/samer/maths/opt/ZeroCrossingSparsity$4.class build/samer/maths/opt/ZeroCrossingSparsity.class build/samer/maths/random/BaseRandom.class build/samer/maths/random/Binary.class build/samer/maths/random/BinaryVec.class build/samer/maths/random/BipolarUniform.class build/samer/maths/random/BoundedHyperbolic.class build/samer/maths/random/BoundedUniform.class build/samer/maths/random/Brownian.class build/samer/maths/random/Cauchy.class build/samer/maths/random/Exponential.class build/samer/maths/random/Gaussian.class build/samer/maths/random/GeneralisedExponential.class build/samer/maths/random/GeneralisedLaplacian.class build/samer/maths/random/Laplacian.class build/samer/maths/random/Logistic.class build/samer/maths/random/Mixture.class build/samer/maths/random/MixtureVec.class build/samer/maths/random/NormalisedGaussian.class build/samer/maths/random/PosteriorSampler.class build/samer/maths/random/PowerLaw.class build/samer/maths/random/Raleigh.class build/samer/maths/random/RectifiedCauchy.class build/samer/maths/random/RectifiedGaussian.class build/samer/maths/random/RectifiedLogistic.class build/samer/maths/random/SparseMixture.class build/samer/maths/random/Ternary.class build/samer/maths/random/Uniform.class build/samer/mds/CorrelationTask.class build/samer/mds/CovarianceTask.class build/samer/mds/DistanceTask.class build/samer/mds/Euclidean.class build/samer/mds/GeometricFilter.class build/samer/mds/MDS$Metric.class build/samer/mds/MDS$SamerStress.class build/samer/mds/MDS$Stress.class build/samer/mds/MDS.class build/samer/mds/MDSBase.class build/samer/mds/Manhatten.class build/samer/mds/MatrixPointViewer2.class build/samer/mds/Minkowski.class build/samer/mds/NewMDS$Laplacian.class build/samer/mds/NewMDS$Stress.class build/samer/mds/NewMDS.class build/samer/mds/ProximityFilter.class build/samer/midi/MidiRecorder.class build/samer/midi/MidiRecorderBase.class build/samer/midi/MidiSynth$1.class build/samer/midi/MidiSynth$Editor.class build/samer/midi/MidiSynth.class build/samer/midi/MidiWithAftertouch.class build/samer/models/AlignedGaussian$1.class build/samer/models/AlignedGaussian.class build/samer/models/BatchedTrainer.class build/samer/models/Covariance.class build/samer/models/DiffScaler$1.class build/samer/models/DiffScaler$OffsetTrainer.class build/samer/models/DiffScaler$ScaleTrainer.class build/samer/models/DiffScaler$TensionedTrainer.class build/samer/models/DiffScaler$Trainer.class build/samer/models/DiffScaler.class build/samer/models/Edge.class build/samer/models/GaussianStats.class build/samer/models/GaussianStatsOnline.class build/samer/models/GeneralisedExponential$1.class build/samer/models/GeneralisedExponential$Trainer.class build/samer/models/GeneralisedExponential.class build/samer/models/ICA$1.class build/samer/models/ICA$NewtonTrainer.class build/samer/models/ICA$ON2DecayWhenActive.class build/samer/models/ICA$ON2Trainer.class build/samer/models/ICA$ON3Trainer.class build/samer/models/ICA.class build/samer/models/ICAScalerSync.class build/samer/models/ICAWithScaler$DifferentialTrainer.class build/samer/models/ICAWithScaler$ScalerTrainer.class build/samer/models/ICAWithScaler.class build/samer/models/IIDPrior$1.class build/samer/models/IIDPrior.class build/samer/models/JointHistogramBase.class build/samer/models/MOGModel$1.class build/samer/models/MOGModel$2.class build/samer/models/MOGModel.class build/samer/models/MOGVector$1.class build/samer/models/MOGVector$2.class build/samer/models/MOGVector$PDF.class build/samer/models/MOGVector.class build/samer/models/MatrixTrainer.class build/samer/models/Mixture$Trainer.class build/samer/models/Mixture.class build/samer/models/Model$Trainer.class build/samer/models/Model.class build/samer/models/NoisyICA$1.class build/samer/models/NoisyICA$2.class build/samer/models/NoisyICA$3.class build/samer/models/NoisyICA.class build/samer/models/Scaler$1.class build/samer/models/Scaler$OffsetTrainer.class build/samer/models/Scaler$ScaleTrainer.class build/samer/models/Scaler$Trainer.class build/samer/models/Scaler.class build/samer/models/SignalHistogram.class build/samer/models/SmoothGeneralisedExponential$1.class build/samer/models/SmoothGeneralisedExponential.class build/samer/models/SparseICA$ON2Trainer.class build/samer/models/SparseICA$ON3Trainer.class build/samer/models/SparseICA.class build/samer/models/VarianceICA$1.class build/samer/models/VarianceICA$2.class build/samer/models/VarianceICA$3.class build/samer/models/VarianceICA.class build/samer/silk/JavaProcedure.class build/samer/silk/SchemeList$Iterator.class build/samer/silk/SchemeList.class build/samer/silk/SilkCompleter.class build/samer/silk/SilkFunction.class build/samer/silk/SilkObserver.class build/samer/silk/SilkTask.class build/samer/silk/Terminal$Transfer.class build/samer/silk/Terminal.class build/samer/tools/AnonymousTask.class build/samer/tools/ArrayImageSource.class build/samer/tools/ArrayVImageSource.class build/samer/tools/ColorRamp.class build/samer/tools/CompoundTask$Iterator.class build/samer/tools/CompoundTask$TaskLink.class build/samer/tools/CompoundTask.class build/samer/tools/ImageSourceBase.class build/samer/tools/ImageTrace.class build/samer/tools/ImageTraceBase.class build/samer/tools/ImageVTrace.class build/samer/tools/ImageViewer$1.class build/samer/tools/ImageViewer.class build/samer/tools/NamedTask.class build/samer/tools/NullTask.class build/samer/tools/Plotter$Pen.class build/samer/tools/Plotter.class build/samer/tools/RThread$Kill.class build/samer/tools/RThread$UI.class build/samer/tools/RThread.class build/samer/tools/RateSchedule.class build/samer/tools/Renderer$Fill.class build/samer/tools/Renderer$Fill3D.class build/samer/tools/Renderer$Line.class build/samer/tools/Renderer$Steps.class build/samer/tools/Renderer.class build/samer/tools/SafeTask.class build/samer/tools/ScatterPlot.class build/samer/tools/SignalTrace.class build/samer/tools/SubrateTask.class build/samer/tools/SwitchTask.class build/samer/tools/Task.class build/samer/tools/Trace.class build/samer/tools/vec2.class build/samer/units/Clicker.class build/samer/units/DoubleToStream.class build/samer/units/DoubleWriter.class build/samer/units/EnergyOperator.class build/samer/units/FFT.class build/samer/units/FFTVector$1.class build/samer/units/FFTVector$2.class build/samer/units/FFTVector$3.class build/samer/units/FFTVector$4.class build/samer/units/FFTVector.class build/samer/units/FIRFilter.class build/samer/units/Filter.class build/samer/units/FilterVector.class build/samer/units/FilteredGenerator.class build/samer/units/GenerateDouble.class build/samer/units/GenerateVector.class build/samer/units/Histogram$Equaliser.class build/samer/units/Histogram.class build/samer/units/IIRFilter.class build/samer/units/JointHistogram.class build/samer/units/Latch.class build/samer/units/LineIn.class build/samer/units/LineOut.class build/samer/units/Matrices.class build/samer/units/MousePosition.class build/samer/units/NoisyLinearSource.class build/samer/units/OnsetMap.class build/samer/units/Oscillator$1.class build/samer/units/Oscillator.class build/samer/units/OverlapAndAdd.class build/samer/units/RescaledIFT.class build/samer/units/SignalWindow$1.class build/samer/units/SignalWindow.class build/samer/units/SpectralFIR.class build/samer/units/Stacker.class build/samer/units/Stacker2.class build/samer/units/StreamToDouble.class build/samer/units/StreamToVec.class build/samer/units/SumFnVec.class build/samer/units/Trigger.class build/samer/units/VecToDouble.class build/samer/units/VecToStream$ArrayObjectWriter.class build/samer/units/VecToStream$IteratorFloatWriter.class build/samer/units/VecToStream.class build/samer/units/VecWriter.class build/samer/units/Wavetable.class examples/gui/awt/Light.java examples/gui/awt/LightS.java examples/gui/awt/Lightweight.java examples/gui/awt/light.html examples/gui/awt/light2.html examples/gui/awt/tester.java examples/gui/swing/BLDComponent.java examples/gui/swing/BoxLayoutDemo.java examples/gui/swing/ConversionPanel.java examples/gui/swing/Converter.java examples/gui/swing/MenuDemo.java examples/gui/swing/MenuLookDemo.java examples/gui/swing/PopupMenuDemo.java examples/java3d/Axis.java examples/java3d/FPS.java examples/java3d/LocalUniverse.java examples/java3d/MatrixPointArray.java examples/java3d/Viewer.java examples/java3d/abs3d.txt examples/java3d/args examples/java3d/hello1.java examples/java3d/hello10.java examples/java3d/hello11.java examples/java3d/hello12.java examples/java3d/hello2.java examples/java3d/hello3.java examples/java3d/hello4.java examples/java3d/hello5.java examples/java3d/hello6.java examples/java3d/hello7.java examples/java3d/hello8.java examples/java3d/hello9.java examples/java3d/util.java examples/maths/GaussianForm.java examples/maths/Inf.java examples/maths/Optimizer.java examples/maths/QuadraticForm.java examples/mds/args examples/mds/mds.scm examples/mds/mds2.scm examples/misc/args examples/misc/meters.scm examples/misc/mouse.scm examples/misc/scope.props examples/misc/scope.scm examples/misc/vtrace.scm examples/misc/x.vector examples/sockets/obj examples/sockets/ostream.scm examples/sockets/recv.scm examples/sockets/recv.silk examples/sound/midi/args examples/sound/midi/args.old examples/sound/midi/plinky.scm examples/sound/midi/plinky.silk examples/sound/sampled/args examples/sound/sampled/args.old examples/sound/sampled/linein.scm local/schemerc.scm local/silk local/swingrc.scm src/samer/applet/CVS/Entries src/samer/applet/CVS/Repository src/samer/applet/CVS/Root src/samer/applet/CVS/Template src/samer/audio/AudioSource.java src/samer/audio/CVS/Entries src/samer/audio/CVS/Repository src/samer/audio/CVS/Root src/samer/audio/CVS/Template src/samer/audio/FileSource.java src/samer/audio/FileSource2.java src/samer/audio/LineSource.java src/samer/audio/MultiFileAudioStream.java src/samer/audio/StreamSource.java src/samer/audio/StreamSource.java.old src/samer/audio/VLine.java src/samer/core_/CVS/Entries src/samer/core_/CVS/Repository src/samer/core_/CVS/Root src/samer/core_/CVS/Template src/samer/core_/Shell.java src/samer/core_/shells/CVS/Entries src/samer/core_/shells/CVS/Repository src/samer/core_/shells/CVS/Root src/samer/core_/shells/CVS/Template src/samer/core_/types/CVS/Entries src/samer/core_/types/CVS/Repository src/samer/core_/types/CVS/Root src/samer/core_/types/CVS/Template src/samer/core_/util/CVS/Entries src/samer/core_/util/CVS/Repository src/samer/core_/util/CVS/Root src/samer/core_/util/CVS/Template src/samer/core_/util/heavy/CVS/Entries src/samer/core_/util/heavy/CVS/Repository src/samer/core_/util/heavy/CVS/Root src/samer/core_/util/heavy/CVS/Template src/samer/core_/util/shell/CVS/Entries src/samer/core_/util/shell/CVS/Repository src/samer/core_/util/shell/CVS/Root src/samer/core_/util/shell/CVS/Template src/samer/core_/util/swing/CVS/Entries src/samer/core_/util/swing/CVS/Repository src/samer/core_/util/swing/CVS/Root src/samer/core_/util/swing/CVS/Template src/samer/core_/viewers/CVS/Entries src/samer/core_/viewers/CVS/Repository src/samer/core_/viewers/CVS/Root src/samer/core_/viewers/CVS/Template src/samer/core_/viewers/swing/CVS/Entries src/samer/core_/viewers/swing/CVS/Repository src/samer/core_/viewers/swing/CVS/Root src/samer/core_/viewers/swing/CVS/Template src/samer/functions/CVS/Entries src/samer/functions/CVS/Repository src/samer/functions/CVS/Root src/samer/functions/CVS/Template src/samer/j3d/CVS/Entries src/samer/j3d/CVS/Repository src/samer/j3d/CVS/Root src/samer/j3d/CVS/Template src/samer/maths/CVS/Entries src/samer/maths/CVS/Repository src/samer/maths/CVS/Root src/samer/maths/CVS/Template src/samer/maths/opt/CVS/Entries src/samer/maths/opt/CVS/Repository src/samer/maths/opt/CVS/Root src/samer/maths/opt/CVS/Template src/samer/maths/random/CVS/Entries src/samer/maths/random/CVS/Repository src/samer/maths/random/CVS/Root src/samer/maths/random/CVS/Template src/samer/mds/CVS/Entries src/samer/mds/CVS/Repository src/samer/mds/CVS/Root src/samer/mds/CVS/Template src/samer/midi/CVS/Entries src/samer/midi/CVS/Repository src/samer/midi/CVS/Root src/samer/midi/CVS/Template src/samer/midi/MidiSynth.java src/samer/midi/MidiWithAftertouch.java src/samer/models/CVS/Entries src/samer/models/CVS/Repository src/samer/models/CVS/Root src/samer/models/CVS/Template src/samer/models/notyet/CVS/Entries src/samer/models/notyet/CVS/Repository src/samer/models/notyet/CVS/Root src/samer/models/notyet/CVS/Template src/samer/silk/CVS/Entries src/samer/silk/CVS/Repository src/samer/silk/CVS/Root src/samer/silk/CVS/Template src/samer/tools/CVS/Entries src/samer/tools/CVS/Repository src/samer/tools/CVS/Root src/samer/tools/CVS/Template src/samer/units/CVS/Entries src/samer/units/CVS/Repository src/samer/units/CVS/Root src/samer/units/CVS/Template src/scheme/audio.scm src/scheme/midi.scm src/scheme/readline.scm src/scheme/sockets.scm src/scheme/streams.scm src/scheme/weird.scm
diffstat 774 files changed, 4969 insertions(+), 759 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,5 @@
+doc
+.*\.class
+dist/lib/.*\.jar
+.jscheme_history
+args.old
Binary file build/samer/applet/ButtonsApplet.class has changed
Binary file build/samer/applet/ConsoleApplet.class has changed
Binary file build/samer/applet/JApplet$1$1.class has changed
Binary file build/samer/applet/JApplet$1.class has changed
Binary file build/samer/applet/JApplet.class has changed
Binary file build/samer/applet/JAppletShell$VContainer.class has changed
Binary file build/samer/applet/JAppletShell.class has changed
Binary file build/samer/applet/Sierpinski$1.class has changed
Binary file build/samer/applet/Sierpinski.class has changed
Binary file build/samer/applet/WindowApplet.class has changed
Binary file build/samer/audio/AudioSink$Util.class has changed
Binary file build/samer/audio/AudioSink.class has changed
Binary file build/samer/audio/AudioSource$Util.class has changed
Binary file build/samer/audio/AudioSource.class has changed
Binary file build/samer/audio/FileSink$1.class has changed
Binary file build/samer/audio/FileSink$2.class has changed
Binary file build/samer/audio/FileSink.class has changed
Binary file build/samer/audio/FileSource$1.class has changed
Binary file build/samer/audio/FileSource$2.class has changed
Binary file build/samer/audio/FileSource$3.class has changed
Binary file build/samer/audio/FileSource$FileSourceViewer.class has changed
Binary file build/samer/audio/FileSource.class has changed
Binary file build/samer/audio/LineSink$1.class has changed
Binary file build/samer/audio/LineSink$2.class has changed
Binary file build/samer/audio/LineSink$Writer.class has changed
Binary file build/samer/audio/LineSink.class has changed
Binary file build/samer/audio/LineSource$1.class has changed
Binary file build/samer/audio/LineSource$2.class has changed
Binary file build/samer/audio/LineSource$Reader.class has changed
Binary file build/samer/audio/LineSource.class has changed
Binary file build/samer/audio/VLine$LineViewer.class has changed
Binary file build/samer/audio/VLine.class has changed
Binary file build/samer/core/Agent$Registry.class has changed
Binary file build/samer/core/Agent.class has changed
Binary file build/samer/core/CompoundAgent.class has changed
Binary file build/samer/core/DefaultShell.class has changed
Binary file build/samer/core/DoubleFormat.class has changed
Binary file build/samer/core/Environment$1.class has changed
Binary file build/samer/core/Environment$2$1.class has changed
Binary file build/samer/core/Environment$2.class has changed
Binary file build/samer/core/Environment$Autocoder.class has changed
Binary file build/samer/core/Environment$Binding.class has changed
Binary file build/samer/core/Environment$Codec.class has changed
Binary file build/samer/core/Environment$CompoundIterator.class has changed
Binary file build/samer/core/Environment$Datum.class has changed
Binary file build/samer/core/Environment$Iterator.class has changed
Binary file build/samer/core/Environment.class has changed
Binary file build/samer/core/Node.class has changed
Binary file build/samer/core/NumberSink.class has changed
Binary file build/samer/core/NumberViewer.class has changed
Binary file build/samer/core/Registry.class has changed
Binary file build/samer/core/Saveable.class has changed
Binary file build/samer/core/Saver.class has changed
Binary file build/samer/core/Shell$1.class has changed
Binary file build/samer/core/Shell$2.class has changed
Binary file build/samer/core/Shell$3.class has changed
Binary file build/samer/core/Shell$Dialog.class has changed
Binary file build/samer/core/Shell$Interface.class has changed
Binary file build/samer/core/Shell$Interpreter.class has changed
Binary file build/samer/core/Shell$ViewerWindowListener$1.class has changed
Binary file build/samer/core/Shell$ViewerWindowListener.class has changed
Binary file build/samer/core/Shell$Window.class has changed
Binary file build/samer/core/Shell.class has changed
Binary file build/samer/core/Variable.class has changed
Binary file build/samer/core/Viewable$1.class has changed
Binary file build/samer/core/Viewable$Vector.class has changed
Binary file build/samer/core/Viewable.class has changed
Binary file build/samer/core/Viewer.class has changed
Binary file build/samer/core/X$1.class has changed
Binary file build/samer/core/X$2.class has changed
Binary file build/samer/core/X$3.class has changed
Binary file build/samer/core/X$4.class has changed
Binary file build/samer/core/X$5.class has changed
Binary file build/samer/core/X$6.class has changed
Binary file build/samer/core/X$7.class has changed
Binary file build/samer/core/X$BaseCodec.class has changed
Binary file build/samer/core/X.class has changed
Binary file build/samer/core/shells/AWTShell$VContainer.class has changed
Binary file build/samer/core/shells/AWTShell.class has changed
Binary file build/samer/core/shells/BevelWindow.class has changed
Binary file build/samer/core/shells/DesktopShell$1.class has changed
Binary file build/samer/core/shells/DesktopShell$VContainer.class has changed
Binary file build/samer/core/shells/DesktopShell.class has changed
Binary file build/samer/core/shells/SwingShell$1.class has changed
Binary file build/samer/core/shells/SwingShell$VContainer.class has changed
Binary file build/samer/core/shells/SwingShell.class has changed
Binary file build/samer/core/types/DoubleModel.class has changed
Binary file build/samer/core/types/VBoolean.class has changed
Binary file build/samer/core/types/VColor.class has changed
Binary file build/samer/core/types/VDouble.class has changed
Binary file build/samer/core/types/VFile.class has changed
Binary file build/samer/core/types/VInteger.class has changed
Binary file build/samer/core/types/VParameter.class has changed
Binary file build/samer/core/types/VRectangle.class has changed
Binary file build/samer/core/types/VString.class has changed
Binary file build/samer/core/util/AgentAdapter.class has changed
Binary file build/samer/core/util/BaseViewer.class has changed
Binary file build/samer/core/util/ConsoleEnvironment$Texton.class has changed
Binary file build/samer/core/util/ConsoleEnvironment.class has changed
Binary file build/samer/core/util/DefaultViewer.class has changed
Binary file build/samer/core/util/FileFilter.class has changed
Binary file build/samer/core/util/FilteredEnvironment.class has changed
Binary file build/samer/core/util/HashMap$1.class has changed
Binary file build/samer/core/util/HashMap$Entry.class has changed
Binary file build/samer/core/util/HashMap.class has changed
Binary file build/samer/core/util/IMap.class has changed
Binary file build/samer/core/util/LinearMap.class has changed
Binary file build/samer/core/util/LogMap.class has changed
Binary file build/samer/core/util/MouseRetarget.class has changed
Binary file build/samer/core/util/Properties$1.class has changed
Binary file build/samer/core/util/Properties$Property.class has changed
Binary file build/samer/core/util/Properties.class has changed
Binary file build/samer/core/util/StackLayout.class has changed
Binary file build/samer/core/util/Tools.class has changed
Binary file build/samer/core/util/UserEnvironment$1.class has changed
Binary file build/samer/core/util/UserEnvironment$2.class has changed
Binary file build/samer/core/util/UserEnvironment$3.class has changed
Binary file build/samer/core/util/UserEnvironment$4.class has changed
Binary file build/samer/core/util/UserEnvironment$5.class has changed
Binary file build/samer/core/util/UserEnvironment$Gluon.class has changed
Binary file build/samer/core/util/UserEnvironment$Thingy.class has changed
Binary file build/samer/core/util/UserEnvironment.class has changed
Binary file build/samer/core/util/VLayout.class has changed
Binary file build/samer/core/util/VMap$Adjuster.class has changed
Binary file build/samer/core/util/VMap.class has changed
Binary file build/samer/core/util/VariableViewer.class has changed
Binary file build/samer/core/util/heavy/Border$1.class has changed
Binary file build/samer/core/util/heavy/Border$Base.class has changed
Binary file build/samer/core/util/heavy/Border$BevelInfo.class has changed
Binary file build/samer/core/util/heavy/Border$Empty.class has changed
Binary file build/samer/core/util/heavy/Border$In.class has changed
Binary file build/samer/core/util/heavy/Border$Interface.class has changed
Binary file build/samer/core/util/heavy/Border$Null.class has changed
Binary file build/samer/core/util/heavy/Border$Out.class has changed
Binary file build/samer/core/util/heavy/Border.class has changed
Binary file build/samer/core/util/heavy/Borders$AbstractBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$CompoundBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$EllipticalBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$EmptyBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$LoweredBevelBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$ParentBgBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$RaisedBevelBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$RoundedBorder.class has changed
Binary file build/samer/core/util/heavy/Borders$SimpleBorder.class has changed
Binary file build/samer/core/util/heavy/Borders.class has changed
Binary file build/samer/core/util/heavy/ButtonBar.class has changed
Binary file build/samer/core/util/heavy/CommandField$Handler.class has changed
Binary file build/samer/core/util/heavy/CommandField.class has changed
Binary file build/samer/core/util/heavy/Console$OutputStream.class has changed
Binary file build/samer/core/util/heavy/Console$Writer.class has changed
Binary file build/samer/core/util/heavy/Console.class has changed
Binary file build/samer/core/util/heavy/Dialog$1.class has changed
Binary file build/samer/core/util/heavy/Dialog.class has changed
Binary file build/samer/core/util/heavy/Frame.class has changed
Binary file build/samer/core/util/heavy/JPanel.class has changed
Binary file build/samer/core/util/heavy/MenuBuilder.class has changed
Binary file build/samer/core/util/heavy/Meter$1.class has changed
Binary file build/samer/core/util/heavy/Meter.class has changed
Binary file build/samer/core/util/heavy/PopupHandler.class has changed
Binary file build/samer/core/util/heavy/TextualNumberViewer.class has changed
Binary file build/samer/core/util/heavy/VCanvas$1.class has changed
Binary file build/samer/core/util/heavy/VCanvas.class has changed
Binary file build/samer/core/util/heavy/VPanel.class has changed
Binary file build/samer/core/util/shell/AgentManager$1.class has changed
Binary file build/samer/core/util/shell/AgentManager.class has changed
Binary file build/samer/core/util/shell/AppShellBase.class has changed
Binary file build/samer/core/util/shell/ViewableManager$1.class has changed
Binary file build/samer/core/util/shell/ViewableManager$2.class has changed
Binary file build/samer/core/util/shell/ViewableManager$3.class has changed
Binary file build/samer/core/util/shell/ViewableManager$VblEntry.class has changed
Binary file build/samer/core/util/shell/ViewableManager$ViewerContainer.class has changed
Binary file build/samer/core/util/shell/ViewableManager$VwrEntry.class has changed
Binary file build/samer/core/util/shell/ViewableManager.class has changed
Binary file build/samer/core/util/swing/ButtonBar.class has changed
Binary file build/samer/core/util/swing/CommandField$Handler.class has changed
Binary file build/samer/core/util/swing/CommandField.class has changed
Binary file build/samer/core/util/swing/Console$OutputStream.class has changed
Binary file build/samer/core/util/swing/Console$Writer.class has changed
Binary file build/samer/core/util/swing/Console.class has changed
Binary file build/samer/core/util/swing/DarkMetalTheme.class has changed
Binary file build/samer/core/util/swing/Dialog.class has changed
Binary file build/samer/core/util/swing/DynamicPopupHandler.class has changed
Binary file build/samer/core/util/swing/Frame.class has changed
Binary file build/samer/core/util/swing/InternalFrame$1.class has changed
Binary file build/samer/core/util/swing/InternalFrame.class has changed
Binary file build/samer/core/util/swing/LED.class has changed
Binary file build/samer/core/util/swing/MenuBuilder.class has changed
Binary file build/samer/core/util/swing/Meter$1.class has changed
Binary file build/samer/core/util/swing/Meter.class has changed
Binary file build/samer/core/util/swing/PopupHandler.class has changed
Binary file build/samer/core/util/swing/SilkyMetalTheme.class has changed
Binary file build/samer/core/util/swing/TextualNumberViewer.class has changed
Binary file build/samer/core/util/swing/VCanvas$1.class has changed
Binary file build/samer/core/util/swing/VCanvas.class has changed
Binary file build/samer/core/util/swing/VContainerBase.class has changed
Binary file build/samer/core/util/swing/VPanel.class has changed
Binary file build/samer/core/viewers/BooleanViewer.class has changed
Binary file build/samer/core/viewers/ColorButton.class has changed
Binary file build/samer/core/viewers/ColorSwatch.class has changed
Binary file build/samer/core/viewers/ColorViewer.class has changed
Binary file build/samer/core/viewers/DoubleViewer.class has changed
Binary file build/samer/core/viewers/FileViewer.class has changed
Binary file build/samer/core/viewers/IntegerViewer.class has changed
Binary file build/samer/core/viewers/NumberViewer.class has changed
Binary file build/samer/core/viewers/ParameterViewer.class has changed
Binary file build/samer/core/viewers/StringViewer.class has changed
Binary file build/samer/core/viewers/swing/BooleanViewer.class has changed
Binary file build/samer/core/viewers/swing/ColorButton.class has changed
Binary file build/samer/core/viewers/swing/ColorChooserViewer$ColorModelAdapter.class has changed
Binary file build/samer/core/viewers/swing/ColorChooserViewer.class has changed
Binary file build/samer/core/viewers/swing/ColorSwatch.class has changed
Binary file build/samer/core/viewers/swing/ColorViewer.class has changed
Binary file build/samer/core/viewers/swing/DoubleViewer$1.class has changed
Binary file build/samer/core/viewers/swing/DoubleViewer.class has changed
Binary file build/samer/core/viewers/swing/FileChooserViewer.class has changed
Binary file build/samer/core/viewers/swing/FileViewer.class has changed
Binary file build/samer/core/viewers/swing/IntegerViewer.class has changed
Binary file build/samer/core/viewers/swing/NumberViewer.class has changed
Binary file build/samer/core/viewers/swing/ParameterViewer.class has changed
Binary file build/samer/core/viewers/swing/StringViewer.class has changed
Binary file build/samer/core/viewers/swing/Swatch.class has changed
Binary file build/samer/functions/Abs.class has changed
Binary file build/samer/functions/Add.class has changed
Binary file build/samer/functions/Atanh.class has changed
Binary file build/samer/functions/BiLaplacian$1.class has changed
Binary file build/samer/functions/BiLaplacian.class has changed
Binary file build/samer/functions/BiLaplacianBlend$1.class has changed
Binary file build/samer/functions/BiLaplacianBlend.class has changed
Binary file build/samer/functions/CauchyInfomax.class has changed
Binary file build/samer/functions/CompoundFunction$1.class has changed
Binary file build/samer/functions/CompoundFunction$2.class has changed
Binary file build/samer/functions/CompoundFunction.class has changed
Binary file build/samer/functions/Exp.class has changed
Binary file build/samer/functions/ExponentialSquashing.class has changed
Binary file build/samer/functions/Gamma.class has changed
Binary file build/samer/functions/HalfSquare.class has changed
Binary file build/samer/functions/Hamming.class has changed
Binary file build/samer/functions/Hanning.class has changed
Binary file build/samer/functions/HybridFunction.class has changed
Binary file build/samer/functions/Log.class has changed
Binary file build/samer/functions/LogAbs.class has changed
Binary file build/samer/functions/LogCauchy.class has changed
Binary file build/samer/functions/LogCosh$1.class has changed
Binary file build/samer/functions/LogCosh.class has changed
Binary file build/samer/functions/LogGenCosh$1.class has changed
Binary file build/samer/functions/LogGenCosh.class has changed
Binary file build/samer/functions/LogGenExp$1.class has changed
Binary file build/samer/functions/LogGenExp$2.class has changed
Binary file build/samer/functions/LogGenExp.class has changed
Binary file build/samer/functions/LogGenExp2$1.class has changed
Binary file build/samer/functions/LogGenExp2$2.class has changed
Binary file build/samer/functions/LogGenExp2$3.class has changed
Binary file build/samer/functions/LogGenExp2.class has changed
Binary file build/samer/functions/LogisiticInfomax.class has changed
Binary file build/samer/functions/LogisticHyperplane.class has changed
Binary file build/samer/functions/Negate.class has changed
Binary file build/samer/functions/Power.class has changed
Binary file build/samer/functions/Quadratic.class has changed
Binary file build/samer/functions/RaleighLogPrior$1.class has changed
Binary file build/samer/functions/RaleighLogPrior.class has changed
Binary file build/samer/functions/Reciprocal.class has changed
Binary file build/samer/functions/Scale.class has changed
Binary file build/samer/functions/ScaledFunction.class has changed
Binary file build/samer/functions/Sgn.class has changed
Binary file build/samer/functions/SparseExponential$1.class has changed
Binary file build/samer/functions/SparseExponential.class has changed
Binary file build/samer/functions/Sqrt.class has changed
Binary file build/samer/functions/Square.class has changed
Binary file build/samer/functions/Step.class has changed
Binary file build/samer/functions/Tanh$1.class has changed
Binary file build/samer/functions/Tanh.class has changed
Binary file build/samer/functions/ThresholdLog.class has changed
Binary file build/samer/functions/WinnerTakeAll.class has changed
Binary file build/samer/j3d/Axes.class has changed
Binary file build/samer/j3d/FPS.class has changed
Binary file build/samer/j3d/ImmediateRenderer.class has changed
Binary file build/samer/j3d/MatrixPointArray$1.class has changed
Binary file build/samer/j3d/MatrixPointArray.class has changed
Binary file build/samer/j3d/MatrixPointArrayAlpha$1.class has changed
Binary file build/samer/j3d/MatrixPointArrayAlpha.class has changed
Binary file build/samer/j3d/MatrixPointArrayRef$1.class has changed
Binary file build/samer/j3d/MatrixPointArrayRef.class has changed
Binary file build/samer/j3d/MatrixPoints4D$1.class has changed
Binary file build/samer/j3d/MatrixPoints4D.class has changed
Binary file build/samer/j3d/MonoView.class has changed
Binary file build/samer/j3d/MorphPoints$MorphBehavior.class has changed
Binary file build/samer/j3d/MorphPoints.class has changed
Binary file build/samer/j3d/PatchArray$1.class has changed
Binary file build/samer/j3d/PatchArray.class has changed
Binary file build/samer/j3d/PatchArrayAlpha$1.class has changed
Binary file build/samer/j3d/PatchArrayAlpha.class has changed
Binary file build/samer/j3d/Patches$1.class has changed
Binary file build/samer/j3d/Patches.class has changed
Binary file build/samer/j3d/PatchesAlpha$1.class has changed
Binary file build/samer/j3d/PatchesAlpha.class has changed
Binary file build/samer/j3d/Points3D$1.class has changed
Binary file build/samer/j3d/Points3D.class has changed
Binary file build/samer/j3d/Points3DAlpha$1.class has changed
Binary file build/samer/j3d/Points3DAlpha.class has changed
Binary file build/samer/j3d/Points3DRef$1.class has changed
Binary file build/samer/j3d/Points3DRef.class has changed
Binary file build/samer/j3d/Points4D$1.class has changed
Binary file build/samer/j3d/Points4D.class has changed
Binary file build/samer/j3d/Root.class has changed
Binary file build/samer/j3d/StereoView.class has changed
Binary file build/samer/j3d/Util.class has changed
Binary file build/samer/j3d/ViewBase.class has changed
Binary file build/samer/j3d/ViewGroup.class has changed
Binary file build/samer/maths/ClippedDivide.class has changed
Binary file build/samer/maths/ComplexVector.class has changed
Binary file build/samer/maths/Constant.class has changed
Binary file build/samer/maths/Difference.class has changed
Binary file build/samer/maths/Function.class has changed
Binary file build/samer/maths/FunctionMap.class has changed
Binary file build/samer/maths/FunctionOfGenerator.class has changed
Binary file build/samer/maths/FunctionOfVector.class has changed
Binary file build/samer/maths/FunctionPlotter$1.class has changed
Binary file build/samer/maths/FunctionPlotter$FunctionIterator.class has changed
Binary file build/samer/maths/FunctionPlotter.class has changed
Binary file build/samer/maths/Generator.class has changed
Binary file build/samer/maths/Identity.class has changed
Binary file build/samer/maths/IntArrayEditor.class has changed
Binary file build/samer/maths/IteratorImageSource.class has changed
Binary file build/samer/maths/LineTrace.class has changed
Binary file build/samer/maths/Linear.class has changed
Binary file build/samer/maths/Mat.class has changed
Binary file build/samer/maths/MatEditor.class has changed
Binary file build/samer/maths/Mathx.class has changed
Binary file build/samer/maths/Matrix$1$1.class has changed
Binary file build/samer/maths/Matrix$1$2.class has changed
Binary file build/samer/maths/Matrix$1.class has changed
Binary file build/samer/maths/Matrix$Column$1.class has changed
Binary file build/samer/maths/Matrix$Column.class has changed
Binary file build/samer/maths/Matrix$Row$1.class has changed
Binary file build/samer/maths/Matrix$Row.class has changed
Binary file build/samer/maths/Matrix$Slice.class has changed
Binary file build/samer/maths/Matrix$Vbl.class has changed
Binary file build/samer/maths/Matrix.class has changed
Binary file build/samer/maths/MatrixAgent.class has changed
Binary file build/samer/maths/MatrixImage.class has changed
Binary file build/samer/maths/MatrixImageSource.class has changed
Binary file build/samer/maths/MatrixImageSourceF.class has changed
Binary file build/samer/maths/MatrixPanel$Field.class has changed
Binary file build/samer/maths/MatrixPanel.class has changed
Binary file build/samer/maths/MatrixPlotter$1.class has changed
Binary file build/samer/maths/MatrixPlotter.class has changed
Binary file build/samer/maths/MatrixTImageSource.class has changed
Binary file build/samer/maths/MatrixTImageSourceF.class has changed
Binary file build/samer/maths/MatrixTimesVector.class has changed
Binary file build/samer/maths/MatrixTransposeTimesVector.class has changed
Binary file build/samer/maths/Neg.class has changed
Binary file build/samer/maths/Ops$1.class has changed
Binary file build/samer/maths/Ops$2.class has changed
Binary file build/samer/maths/Ops$3.class has changed
Binary file build/samer/maths/Ops$4.class has changed
Binary file build/samer/maths/Ops$5.class has changed
Binary file build/samer/maths/Ops$6.class has changed
Binary file build/samer/maths/Ops$7.class has changed
Binary file build/samer/maths/Ops$8.class has changed
Binary file build/samer/maths/Ops$9.class has changed
Binary file build/samer/maths/Ops$ArrayCopy.class has changed
Binary file build/samer/maths/Ops$IteratorCopy.class has changed
Binary file build/samer/maths/Ops.class has changed
Binary file build/samer/maths/Parameter.class has changed
Binary file build/samer/maths/Probe.class has changed
Binary file build/samer/maths/Product.class has changed
Binary file build/samer/maths/RowColumn.class has changed
Binary file build/samer/maths/SparseMatrix.class has changed
Binary file build/samer/maths/Sum.class has changed
Binary file build/samer/maths/VFunction$1.class has changed
Binary file build/samer/maths/VFunction$2.class has changed
Binary file build/samer/maths/VFunction.class has changed
Binary file build/samer/maths/VGenerator$UI.class has changed
Binary file build/samer/maths/VGenerator.class has changed
Binary file build/samer/maths/VVector$1.class has changed
Binary file build/samer/maths/VVector$2.class has changed
Binary file build/samer/maths/VVector.class has changed
Binary file build/samer/maths/Vec$ForArray$InputIterator.class has changed
Binary file build/samer/maths/Vec$ForArray$Iterator.class has changed
Binary file build/samer/maths/Vec$ForArray.class has changed
Binary file build/samer/maths/Vec$InputIterator.class has changed
Binary file build/samer/maths/Vec$Iterator.class has changed
Binary file build/samer/maths/Vec.class has changed
Binary file build/samer/maths/VectorEditor.class has changed
Binary file build/samer/maths/VectorFunctionOfVector.class has changed
Binary file build/samer/maths/VectorPlotter.class has changed
Binary file build/samer/maths/VectorPlusEqualsVector.class has changed
Binary file build/samer/maths/VectorTimesEqualsScalar.class has changed
Binary file build/samer/maths/VectorTrace.class has changed
Binary file build/samer/maths/VectorTraceObs.class has changed
Binary file build/samer/maths/Zero.class has changed
Binary file build/samer/maths/opt/AbsXFConvergence.class has changed
Binary file build/samer/maths/opt/Condition.class has changed
Binary file build/samer/maths/opt/ConjGrad.class has changed
Binary file build/samer/maths/opt/ConstrainedConjGrad.class has changed
Binary file build/samer/maths/opt/ConstrainedGillMurray.class has changed
Binary file build/samer/maths/opt/ConstrainedMinimiser.class has changed
Binary file build/samer/maths/opt/Constraints$Factory.class has changed
Binary file build/samer/maths/opt/Constraints.class has changed
Binary file build/samer/maths/opt/CubicLineSearch.class has changed
Binary file build/samer/maths/opt/Datum.class has changed
Binary file build/samer/maths/opt/Functionx.class has changed
Binary file build/samer/maths/opt/GConvergence.class has changed
Binary file build/samer/maths/opt/GillMurray.class has changed
Binary file build/samer/maths/opt/MinimiserBase$1.class has changed
Binary file build/samer/maths/opt/MinimiserBase$2.class has changed
Binary file build/samer/maths/opt/MinimiserBase$3.class has changed
Binary file build/samer/maths/opt/MinimiserBase$4.class has changed
Binary file build/samer/maths/opt/MinimiserBase$5.class has changed
Binary file build/samer/maths/opt/MinimiserBase$LSCondition$1.class has changed
Binary file build/samer/maths/opt/MinimiserBase$LSCondition.class has changed
Binary file build/samer/maths/opt/MinimiserBase.class has changed
Binary file build/samer/maths/opt/PolynomialLineSearch.class has changed
Binary file build/samer/maths/opt/Positivity$1.class has changed
Binary file build/samer/maths/opt/Positivity$2.class has changed
Binary file build/samer/maths/opt/Positivity.class has changed
Binary file build/samer/maths/opt/State.class has changed
Binary file build/samer/maths/opt/SubspaceFunctionx.class has changed
Binary file build/samer/maths/opt/UnconstrainedConjGrad$1.class has changed
Binary file build/samer/maths/opt/UnconstrainedConjGrad.class has changed
Binary file build/samer/maths/opt/UnconstrainedMinimiser.class has changed
Binary file build/samer/maths/opt/Util.class has changed
Binary file build/samer/maths/opt/XFConvergence.class has changed
Binary file build/samer/maths/opt/ZeroCrossingSparsity$1.class has changed
Binary file build/samer/maths/opt/ZeroCrossingSparsity$2.class has changed
Binary file build/samer/maths/opt/ZeroCrossingSparsity$3.class has changed
Binary file build/samer/maths/opt/ZeroCrossingSparsity$4.class has changed
Binary file build/samer/maths/opt/ZeroCrossingSparsity.class has changed
Binary file build/samer/maths/random/BaseRandom.class has changed
Binary file build/samer/maths/random/Binary.class has changed
Binary file build/samer/maths/random/BinaryVec.class has changed
Binary file build/samer/maths/random/BipolarUniform.class has changed
Binary file build/samer/maths/random/BoundedHyperbolic.class has changed
Binary file build/samer/maths/random/BoundedUniform.class has changed
Binary file build/samer/maths/random/Brownian.class has changed
Binary file build/samer/maths/random/Cauchy.class has changed
Binary file build/samer/maths/random/Exponential.class has changed
Binary file build/samer/maths/random/Gaussian.class has changed
Binary file build/samer/maths/random/GeneralisedExponential.class has changed
Binary file build/samer/maths/random/GeneralisedLaplacian.class has changed
Binary file build/samer/maths/random/Laplacian.class has changed
Binary file build/samer/maths/random/Logistic.class has changed
Binary file build/samer/maths/random/Mixture.class has changed
Binary file build/samer/maths/random/MixtureVec.class has changed
Binary file build/samer/maths/random/NormalisedGaussian.class has changed
Binary file build/samer/maths/random/PosteriorSampler.class has changed
Binary file build/samer/maths/random/PowerLaw.class has changed
Binary file build/samer/maths/random/Raleigh.class has changed
Binary file build/samer/maths/random/RectifiedCauchy.class has changed
Binary file build/samer/maths/random/RectifiedGaussian.class has changed
Binary file build/samer/maths/random/RectifiedLogistic.class has changed
Binary file build/samer/maths/random/SparseMixture.class has changed
Binary file build/samer/maths/random/Ternary.class has changed
Binary file build/samer/maths/random/Uniform.class has changed
Binary file build/samer/mds/CorrelationTask.class has changed
Binary file build/samer/mds/CovarianceTask.class has changed
Binary file build/samer/mds/DistanceTask.class has changed
Binary file build/samer/mds/Euclidean.class has changed
Binary file build/samer/mds/GeometricFilter.class has changed
Binary file build/samer/mds/MDS$Metric.class has changed
Binary file build/samer/mds/MDS$SamerStress.class has changed
Binary file build/samer/mds/MDS$Stress.class has changed
Binary file build/samer/mds/MDS.class has changed
Binary file build/samer/mds/MDSBase.class has changed
Binary file build/samer/mds/Manhatten.class has changed
Binary file build/samer/mds/MatrixPointViewer2.class has changed
Binary file build/samer/mds/Minkowski.class has changed
Binary file build/samer/mds/NewMDS$Laplacian.class has changed
Binary file build/samer/mds/NewMDS$Stress.class has changed
Binary file build/samer/mds/NewMDS.class has changed
Binary file build/samer/mds/ProximityFilter.class has changed
Binary file build/samer/midi/MidiRecorder.class has changed
Binary file build/samer/midi/MidiRecorderBase.class has changed
Binary file build/samer/midi/MidiSynth$1.class has changed
Binary file build/samer/midi/MidiSynth$Editor.class has changed
Binary file build/samer/midi/MidiSynth.class has changed
Binary file build/samer/midi/MidiWithAftertouch.class has changed
Binary file build/samer/models/AlignedGaussian$1.class has changed
Binary file build/samer/models/AlignedGaussian.class has changed
Binary file build/samer/models/BatchedTrainer.class has changed
Binary file build/samer/models/Covariance.class has changed
Binary file build/samer/models/DiffScaler$1.class has changed
Binary file build/samer/models/DiffScaler$OffsetTrainer.class has changed
Binary file build/samer/models/DiffScaler$ScaleTrainer.class has changed
Binary file build/samer/models/DiffScaler$TensionedTrainer.class has changed
Binary file build/samer/models/DiffScaler$Trainer.class has changed
Binary file build/samer/models/DiffScaler.class has changed
Binary file build/samer/models/Edge.class has changed
Binary file build/samer/models/GaussianStats.class has changed
Binary file build/samer/models/GaussianStatsOnline.class has changed
Binary file build/samer/models/GeneralisedExponential$1.class has changed
Binary file build/samer/models/GeneralisedExponential$Trainer.class has changed
Binary file build/samer/models/GeneralisedExponential.class has changed
Binary file build/samer/models/ICA$1.class has changed
Binary file build/samer/models/ICA$NewtonTrainer.class has changed
Binary file build/samer/models/ICA$ON2DecayWhenActive.class has changed
Binary file build/samer/models/ICA$ON2Trainer.class has changed
Binary file build/samer/models/ICA$ON3Trainer.class has changed
Binary file build/samer/models/ICA.class has changed
Binary file build/samer/models/ICAScalerSync.class has changed
Binary file build/samer/models/ICAWithScaler$DifferentialTrainer.class has changed
Binary file build/samer/models/ICAWithScaler$ScalerTrainer.class has changed
Binary file build/samer/models/ICAWithScaler.class has changed
Binary file build/samer/models/IIDPrior$1.class has changed
Binary file build/samer/models/IIDPrior.class has changed
Binary file build/samer/models/JointHistogramBase.class has changed
Binary file build/samer/models/MOGModel$1.class has changed
Binary file build/samer/models/MOGModel$2.class has changed
Binary file build/samer/models/MOGModel.class has changed
Binary file build/samer/models/MOGVector$1.class has changed
Binary file build/samer/models/MOGVector$2.class has changed
Binary file build/samer/models/MOGVector$PDF.class has changed
Binary file build/samer/models/MOGVector.class has changed
Binary file build/samer/models/MatrixTrainer.class has changed
Binary file build/samer/models/Mixture$Trainer.class has changed
Binary file build/samer/models/Mixture.class has changed
Binary file build/samer/models/Model$Trainer.class has changed
Binary file build/samer/models/Model.class has changed
Binary file build/samer/models/NoisyICA$1.class has changed
Binary file build/samer/models/NoisyICA$2.class has changed
Binary file build/samer/models/NoisyICA$3.class has changed
Binary file build/samer/models/NoisyICA.class has changed
Binary file build/samer/models/Scaler$1.class has changed
Binary file build/samer/models/Scaler$OffsetTrainer.class has changed
Binary file build/samer/models/Scaler$ScaleTrainer.class has changed
Binary file build/samer/models/Scaler$Trainer.class has changed
Binary file build/samer/models/Scaler.class has changed
Binary file build/samer/models/SignalHistogram.class has changed
Binary file build/samer/models/SmoothGeneralisedExponential$1.class has changed
Binary file build/samer/models/SmoothGeneralisedExponential.class has changed
Binary file build/samer/models/SparseICA$ON2Trainer.class has changed
Binary file build/samer/models/SparseICA$ON3Trainer.class has changed
Binary file build/samer/models/SparseICA.class has changed
Binary file build/samer/models/VarianceICA$1.class has changed
Binary file build/samer/models/VarianceICA$2.class has changed
Binary file build/samer/models/VarianceICA$3.class has changed
Binary file build/samer/models/VarianceICA.class has changed
Binary file build/samer/silk/JavaProcedure.class has changed
Binary file build/samer/silk/SchemeList$Iterator.class has changed
Binary file build/samer/silk/SchemeList.class has changed
Binary file build/samer/silk/SilkCompleter.class has changed
Binary file build/samer/silk/SilkFunction.class has changed
Binary file build/samer/silk/SilkObserver.class has changed
Binary file build/samer/silk/SilkTask.class has changed
Binary file build/samer/silk/Terminal$Transfer.class has changed
Binary file build/samer/silk/Terminal.class has changed
Binary file build/samer/tools/AnonymousTask.class has changed
Binary file build/samer/tools/ArrayImageSource.class has changed
Binary file build/samer/tools/ArrayVImageSource.class has changed
Binary file build/samer/tools/ColorRamp.class has changed
Binary file build/samer/tools/CompoundTask$Iterator.class has changed
Binary file build/samer/tools/CompoundTask$TaskLink.class has changed
Binary file build/samer/tools/CompoundTask.class has changed
Binary file build/samer/tools/ImageSourceBase.class has changed
Binary file build/samer/tools/ImageTrace.class has changed
Binary file build/samer/tools/ImageTraceBase.class has changed
Binary file build/samer/tools/ImageVTrace.class has changed
Binary file build/samer/tools/ImageViewer$1.class has changed
Binary file build/samer/tools/ImageViewer.class has changed
Binary file build/samer/tools/NamedTask.class has changed
Binary file build/samer/tools/NullTask.class has changed
Binary file build/samer/tools/Plotter$Pen.class has changed
Binary file build/samer/tools/Plotter.class has changed
Binary file build/samer/tools/RThread$Kill.class has changed
Binary file build/samer/tools/RThread$UI.class has changed
Binary file build/samer/tools/RThread.class has changed
Binary file build/samer/tools/RateSchedule.class has changed
Binary file build/samer/tools/Renderer$Fill.class has changed
Binary file build/samer/tools/Renderer$Fill3D.class has changed
Binary file build/samer/tools/Renderer$Line.class has changed
Binary file build/samer/tools/Renderer$Steps.class has changed
Binary file build/samer/tools/Renderer.class has changed
Binary file build/samer/tools/SafeTask.class has changed
Binary file build/samer/tools/ScatterPlot.class has changed
Binary file build/samer/tools/SignalTrace.class has changed
Binary file build/samer/tools/SubrateTask.class has changed
Binary file build/samer/tools/SwitchTask.class has changed
Binary file build/samer/tools/Task.class has changed
Binary file build/samer/tools/Trace.class has changed
Binary file build/samer/tools/vec2.class has changed
Binary file build/samer/units/Clicker.class has changed
Binary file build/samer/units/DoubleToStream.class has changed
Binary file build/samer/units/DoubleWriter.class has changed
Binary file build/samer/units/EnergyOperator.class has changed
Binary file build/samer/units/FFT.class has changed
Binary file build/samer/units/FFTVector$1.class has changed
Binary file build/samer/units/FFTVector$2.class has changed
Binary file build/samer/units/FFTVector$3.class has changed
Binary file build/samer/units/FFTVector$4.class has changed
Binary file build/samer/units/FFTVector.class has changed
Binary file build/samer/units/FIRFilter.class has changed
Binary file build/samer/units/Filter.class has changed
Binary file build/samer/units/FilterVector.class has changed
Binary file build/samer/units/FilteredGenerator.class has changed
Binary file build/samer/units/GenerateDouble.class has changed
Binary file build/samer/units/GenerateVector.class has changed
Binary file build/samer/units/Histogram$Equaliser.class has changed
Binary file build/samer/units/Histogram.class has changed
Binary file build/samer/units/IIRFilter.class has changed
Binary file build/samer/units/JointHistogram.class has changed
Binary file build/samer/units/Latch.class has changed
Binary file build/samer/units/LineIn.class has changed
Binary file build/samer/units/LineOut.class has changed
Binary file build/samer/units/Matrices.class has changed
Binary file build/samer/units/MousePosition.class has changed
Binary file build/samer/units/NoisyLinearSource.class has changed
Binary file build/samer/units/OnsetMap.class has changed
Binary file build/samer/units/Oscillator$1.class has changed
Binary file build/samer/units/Oscillator.class has changed
Binary file build/samer/units/OverlapAndAdd.class has changed
Binary file build/samer/units/RescaledIFT.class has changed
Binary file build/samer/units/SignalWindow$1.class has changed
Binary file build/samer/units/SignalWindow.class has changed
Binary file build/samer/units/SpectralFIR.class has changed
Binary file build/samer/units/Stacker.class has changed
Binary file build/samer/units/Stacker2.class has changed
Binary file build/samer/units/StreamToDouble.class has changed
Binary file build/samer/units/StreamToVec.class has changed
Binary file build/samer/units/SumFnVec.class has changed
Binary file build/samer/units/Trigger.class has changed
Binary file build/samer/units/VecToDouble.class has changed
Binary file build/samer/units/VecToStream$ArrayObjectWriter.class has changed
Binary file build/samer/units/VecToStream$IteratorFloatWriter.class has changed
Binary file build/samer/units/VecToStream.class has changed
Binary file build/samer/units/VecWriter.class has changed
Binary file build/samer/units/Wavetable.class has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/Light.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,42 @@
+// program to test lightweight  components
+package test.awt;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+
+public class Light extends Applet 
+{
+	public static void run(Container c) 
+	{
+		c.setLayout(new FlowLayout());
+		c.add( new Button("Hello!"));
+		c.add( new Lightweight(Color.green,"harpo"));
+		c.add( new Lightweight(Color.blue,"groucho"));
+		c.add( new Lightweight(Color.red,"zeppo"));
+		c.validate();
+	}
+
+	public static void main(String[] args) 
+	{
+		Frame fr=new Frame("Lightweight test");
+		fr.addWindowListener(new WindowAdapter() {
+			public void windowClosing(WindowEvent e) {
+				System.exit(0);
+			}
+		} );
+		fr.setSize(400,100);
+		fr.show();
+		run(fr);
+	}
+
+	public void init()
+	{
+		setBackground( Color.black);
+		setForeground( Color.yellow);
+		getParent().setBackground( Color.red);
+		run(this);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/LightS.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,43 @@
+// program to test lightweight  components (Swing version)
+package test.awt;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+// this is a lightweight component
+
+
+public class LightS extends JApplet 
+{
+	public static void run(Container c) 
+	{
+		JButton b = new JButton("Hello!");
+
+		c.setLayout(new FlowLayout());
+		c.add( b);
+		c.add( new Lightweight(Color.green,"harpo"));
+		c.add( new Lightweight(Color.blue,"groucho"));
+		c.add( new Lightweight(Color.red,"zeppo"));
+		c.validate();
+	}
+
+	public static void main(String[] args) 
+	{
+		JFrame fr=new JFrame("Lightweight test");
+		fr.addWindowListener(new WindowAdapter() {
+			public void windowClosing(WindowEvent e) {
+				System.exit(0);
+			}
+		} );
+		fr.setSize(400,100);
+		fr.show();
+		run(fr.getContentPane());
+	}
+
+	public void init()
+	{
+		getParent().setBackground( Color.red);
+		run(getContentPane());
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/Lightweight.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,32 @@
+// program to test lightweight  components
+package test.awt;
+import java.awt.*;
+
+// this is a lightweight component
+
+public class Lightweight extends Component
+{
+	Color	col;
+	String	text;
+
+	Lightweight(Color color, String label) { 
+		text=label; col=color; 
+		setBackground(Color.getHSBColor(0.3F,0.4F,0.7F));
+	}
+
+	public void paint(Graphics g) 
+	{
+		Dimension d=getSize();
+		g.setColor(getBackground());
+		g.fillRect(0,0,getWidth(),getHeight());
+		g.setColor(getForeground());
+		g.drawString(text,10,16);
+	}
+
+	public boolean isOpaque() { return true; }
+	public Dimension getPreferredSize() 
+	{
+		return new Dimension(80,20);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/light.html	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,33 @@
+<head>
+<title>Test Applet</title>
+<link rel=stylesheet type="text/css" href="../styles/base.css"> 
+</head>
+<style>
+	body { background: #404060; color: #f0f0f0; font-family: "Verdana" }
+	h1	{ font: bold italic; color: #48d }
+	applet { width: 60%; height: 60%; margin: 2em; 
+	}
+
+</style>
+
+<body>
+<p>
+<title>Lightweight Components</title>
+<h1>a test applet</h1>
+<p>
+This is blah blah
+<br>
+<center>
+<applet code=Light>
+	<param name=font-size value=18>
+	<param name=foreground value=#90b0f0>
+	<param name=background value=#000000>
+	<param name=pagebg     value=#404060>
+	<param name=borderType  value=rounded>
+	<param name=borderWidth value=2>
+	<param name=corner  value=24>
+	<param name=border		value=#f0f0f0>
+	<param name=padding		value=6>
+</applet>
+</center>
+<body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/light2.html	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,33 @@
+<head>
+<title>Test Applet</title>
+<link rel=stylesheet type="text/css" href="../styles/base.css"> 
+</head>
+<style>
+	body { background: #404060; color: #f0f0f0; font-family: "Verdana" }
+	h1	{ font: bold italic; color: #48d }
+	applet { width: 60%; height: 60%; margin: 2em; 
+	}
+
+</style>
+
+<body>
+<p>
+<title>Lightweight Components</title>
+<h1>a test applet</h1>
+<p>
+This is blah blah
+<br>
+<center>
+<applet code=LightS>
+	<param name=font-size value=18>
+	<param name=foreground value=#90b0f0>
+	<param name=background value=#000000>
+	<param name=pagebg     value=#404060>
+	<param name=borderType  value=rounded>
+	<param name=borderWidth value=2>
+	<param name=corner  value=24>
+	<param name=border		value=#f0f0f0>
+	<param name=padding		value=6>
+</applet>
+</center>
+<body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/awt/tester.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,70 @@
+/*
+ *	AppletBorders.java	
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
+ *	without even the implied warranty of MERCHANTABILITY or 
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+package test;
+import  samer.core.*;
+import  samer.core.util.*;
+import  samer.core.util.heavy.*;
+import  samer.core.util.heavy.Borders.*;
+import  samer.core.util.Tools;
+import	java.awt.*;
+
+public class tester
+{
+	public static void main(String args[])
+	{
+		new samer.core.shells.AppShell();
+
+		final Shell.Window win=Shell.getWindow("tester");
+
+		win.container().setBackground(Color.white);
+		// win.container().setForeground(Color.white);
+
+		win.container().setLayout(new StackLayout(0));
+		win.container().add(Shell.createLabel("hmmm..."));
+		win.container().add(createBlock(new Color(200,160,180), "the world"));
+		win.container().add(createBlock(new Color(200,180,160), "welcome to"));
+		win.container().add(createBlock(new Color(180,200,160), "i like"));
+		win.container().add(createBlock(new Color(160,200,180), "of borders"));
+		win.container().add(createBlock(new Color(160,180,200), "these colours"));
+		win.container().add(createBlock(new Color(180,160,200), "hello there!"));
+		win.expose();
+
+		Agent agent=new Agent() {
+			public void getCommands(Agent.Registry r) { r.add("repaint"); }
+			public void execute(String cmd, Environment env) {
+				if (cmd.equals("repaint")) {
+					win.container().repaint();
+				}
+			}
+		};
+		Shell.exposeCommands(agent);
+		Shell.registerAgent(agent);
+	}
+
+	static Border.Interface border = new CompoundBorder(
+		new ParentBgBorder(12),
+		new RoundedBorder(3,26,3) {
+			protected Color getDefaultColor(Component c) { 
+				return c.getBackground().darker(); // brighter(); 
+			}
+		}
+	);
+
+	static Component createBlock(Color bg, String msg)
+	{
+		JPanel	p1=new JPanel(border);
+		p1.setLayout(new FlowLayout());
+		p1.setBackground(bg);
+		p1.setForeground(bg.darker().darker().darker());
+		p1.add(Shell.createLabel(msg));
+		return p1;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/BLDComponent.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,101 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+/** A rectangle that has a fixed size. */
+class BLDComponent extends JComponent {
+    private Color normalHue;
+    private final Dimension preferredSize;
+    private String name;
+    private boolean restrictMaximumSize;
+    private boolean printSize;
+
+    public BLDComponent(float alignmentX, float hue, 
+                     int shortSideSize,
+                     boolean restrictSize, 
+                     boolean printSize, 
+                     String name) {
+        this.name = name;
+        this.restrictMaximumSize = restrictSize;
+        this.printSize = printSize;
+        setAlignmentX(alignmentX);
+        normalHue = Color.getHSBColor(hue, 0.4f, 0.85f);
+        preferredSize = new Dimension(shortSideSize*2, shortSideSize);
+
+        MouseListener l = new MouseAdapter() {
+            public void mousePressed(MouseEvent e) {
+                int width = getWidth();
+                float alignment = (float)(e.getX())
+                                / (float)width;
+
+                // Round to the nearest 1/10th.
+                int tmp = Math.round(alignment * 10.0f); 
+                alignment = (float)tmp / 10.0f;
+
+                setAlignmentX(alignment);
+                revalidate(); // this GUI needs relayout
+                repaint();
+            }
+        };
+        addMouseListener(l);
+    }
+
+    /**
+     * Our BLDComponents are completely opaque, so we override
+     * this method to return true.  This lets the painting
+     * system know that it doesn't need to paint any covered
+     * part of the components underneath this component.  The
+     * end result is possibly improved painting performance.
+     */
+    public boolean isOpaque() {
+        return true;
+    }
+
+    public void paint(Graphics g) {
+        int width = getWidth();
+        int height = getHeight();
+        float alignmentX = getAlignmentX();
+
+        g.setColor(normalHue);
+        g.fill3DRect(0, 0, width, height, true);
+
+        /* Draw a vertical white line at the alignment point.*/
+        // XXX: This code is probably not the best.
+        g.setColor(Color.white);
+        int x = (int)(alignmentX * (float)width) - 1;
+        g.drawLine(x, 0, x, height - 1);
+
+        /* Say what the alignment point is. */
+        g.setColor(Color.black);
+        g.drawString(Float.toString(alignmentX), 3, height - 3);
+
+        if (printSize) {
+            System.out.println("BLDComponent " + name + ": size is " 
+                               + width + "x" + height
+                               + "; preferred size is " 
+                               + getPreferredSize().width + "x"
+                               + getPreferredSize().height);
+        }
+    }
+
+    public Dimension getPreferredSize() {
+        return preferredSize;
+    }
+
+    public Dimension getMinimumSize() {
+        return preferredSize;
+    }
+
+    public Dimension getMaximumSize() {
+        if (restrictMaximumSize) {
+            return preferredSize;
+        } else {
+            return super.getMaximumSize();
+        }
+    }
+
+    public void setSizeRestriction(boolean restrictSize) {
+        restrictMaximumSize = restrictSize;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/BoxLayoutDemo.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,77 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+public class BoxLayoutDemo {
+    protected static int NUM_COMPONENTS = 3;
+    protected static float[] xAlignment = {Component.LEFT_ALIGNMENT,
+                                 Component.CENTER_ALIGNMENT,
+                                 Component.RIGHT_ALIGNMENT};
+    protected static float[] hue = {0.0f, 0.33f, 0.67f};
+    protected static boolean restrictSize = true;
+    protected static boolean sizeIsRandom = false;
+    protected static BLDComponent[] bldComponent = 
+        new BLDComponent[NUM_COMPONENTS];
+
+    public static void main(String[] args) {
+        final JPanel panel = new JPanel();
+        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+
+        //Create the rectangles.
+        int shortSideSize = 15;
+        for (int i = 0; i < NUM_COMPONENTS; i++) {
+            if (sizeIsRandom) {
+                shortSideSize = (int)(30.0 * Math.random()) + 30;
+            } else {
+                shortSideSize += 10;
+            }
+            bldComponent[i] = new BLDComponent(xAlignment[i], hue[i], 
+                                             shortSideSize, 
+                                             restrictSize,
+                                             sizeIsRandom,
+                                             String.valueOf(i));
+            panel.add(bldComponent[i]);
+        }
+
+        //Create the instructions.
+        JLabel label = new JLabel("Click a rectangle to "
+                                + "change its X alignment.");
+        JCheckBox cb = new JCheckBox("Restrict maximum rectangle size.");
+        cb.setSelected(restrictSize);
+        cb.addItemListener(new ItemListener() {
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    restrictSize = true;
+                } else {
+                    restrictSize = false;
+                }
+                notifyBLDComponents();
+            }
+        });
+
+        JFrame f = new JFrame("BoxLayoutDemo");
+        Container contentPane = f.getContentPane();
+        contentPane.add(panel, BorderLayout.CENTER);
+        panel.setBorder(BorderFactory.createLineBorder(Color.red));
+
+        Box box = Box.createVerticalBox();
+        box.add(label);
+        box.add(cb);
+
+        contentPane.add(box, BorderLayout.SOUTH);
+        f.addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                System.exit(0);
+            }
+        });
+        f.pack();
+        f.setVisible(true);
+    }
+
+    static public void notifyBLDComponents() {
+        for (int i = 0; i < NUM_COMPONENTS; i++) {
+            bldComponent[i].setSizeRestriction(restrictSize);
+        }
+        bldComponent[0].revalidate();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/ConversionPanel.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,117 @@
+/*
+ * 1.1+Swing version.
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import java.text.NumberFormat;
+
+public class ConversionPanel extends JPanel {
+    DecimalField textField;
+    JComboBox unitChooser;
+    JSlider slider;
+    ConverterRangeModel sliderModel;
+    Converter controller;
+    Unit[] units;
+    String title;
+    final static boolean DEBUG = false;
+    final static boolean COLORS = false;
+    final static int MAX = 10000;
+
+    ConversionPanel(Converter myController, String myTitle, 
+                    Unit[] myUnits,
+                    ConverterRangeModel myModel) {
+        if (COLORS) {
+            setBackground(Color.cyan);
+        }
+        setBorder(BorderFactory.createCompoundBorder(
+                        BorderFactory.createTitledBorder(myTitle),
+                        BorderFactory.createEmptyBorder(5,5,5,5)));
+
+        //Save arguments in instance variables.
+        controller = myController;
+        units = myUnits;
+        title = myTitle;
+        sliderModel = myModel;
+
+        //Add the text field.  It initially displays "0" and needs
+        //to be at least 10 columns wide.
+        NumberFormat numberFormat = NumberFormat.getNumberInstance();
+        numberFormat.setMaximumFractionDigits(2);
+        textField = new DecimalField(0, 10, numberFormat); 
+        textField.setValue(sliderModel.getDoubleValue());
+        textField.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                sliderModel.setDoubleValue(textField.getValue());
+            }
+        });
+
+        //Add the combo box.
+        unitChooser = new JComboBox(); 
+        for (int i = 0; i < units.length; i++) { //Populate it.
+            unitChooser.addItem(units[i].description);
+        }
+        unitChooser.setSelectedIndex(0);
+        sliderModel.setMultiplier(units[0].multiplier);
+        unitChooser.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                //Set new maximums for the sliders.
+                int i = unitChooser.getSelectedIndex();
+                sliderModel.setMultiplier(units[i].multiplier);
+                controller.resetMaxValues(false);
+            }
+        });
+
+        //Add the slider.
+        slider = new JSlider(sliderModel);
+        sliderModel.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                textField.setValue(sliderModel.getDoubleValue());
+            }
+        });
+
+        //Make the textfield/slider group a fixed size.
+        JPanel unitGroup = new JPanel() {
+            public Dimension getMinimumSize() {
+                return getPreferredSize();
+            }
+            public Dimension getPreferredSize() {
+                return new Dimension(150,
+                                     super.getPreferredSize().height);
+            }
+            public Dimension getMaximumSize() {
+                return getPreferredSize();
+            }
+        };
+        if (COLORS) {
+            unitGroup.setBackground(Color.blue);
+        }
+        unitGroup.setBorder(BorderFactory.createEmptyBorder(
+                                                0,0,0,5));
+        unitGroup.setLayout(new BoxLayout(unitGroup, 
+                                          BoxLayout.Y_AXIS));
+        unitGroup.add(textField);
+        unitGroup.add(slider);
+
+        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+        add(unitGroup);
+        add(unitChooser);
+        unitGroup.setAlignmentY(TOP_ALIGNMENT);
+        unitChooser.setAlignmentY(TOP_ALIGNMENT);
+    }
+
+    /** 
+     * Returns the multiplier (units/meter) for the currently
+     * selected unit of measurement.
+     */
+    public double getMultiplier() {
+        return sliderModel.getMultiplier();
+    }
+
+    public double getValue() {
+        return sliderModel.getDoubleValue();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/Converter.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,157 @@
+/*
+ * 1.1+Swing version.
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+public class Converter {
+    ConversionPanel metricPanel, usaPanel;
+    Unit[] metricDistances = new Unit[3];
+    Unit[] usaDistances = new Unit[4];
+    final static boolean COLORS = false;
+    final static boolean DEBUG = false;
+    final static String LOOKANDFEEL = null;
+    ConverterRangeModel dataModel = new ConverterRangeModel();
+    JPanel mainPane;
+
+    /** 
+     * Create the ConversionPanels (one for metric, another for U.S.).
+     * I used "U.S." because although Imperial and U.S. distance
+     * measurements are the same, this program could be extended to
+     * include volume measurements, which aren't the same.
+     *
+     * Put the ConversionPanels into a frame, and bring up the frame.
+     */
+    public Converter() {
+        //Create Unit objects for metric distances, and then 
+        //instantiate a ConversionPanel with these Units.
+        metricDistances[0] = new Unit("Centimeters", 0.01);
+        metricDistances[1] = new Unit("Meters", 1.0);
+        metricDistances[2] = new Unit("Kilometers", 1000.0);
+        metricPanel = new ConversionPanel(this, "Metric System",
+                                          metricDistances,
+                                          dataModel);
+
+        //Create Unit objects for U.S. distances, and then 
+        //instantiate a ConversionPanel with these Units.
+        usaDistances[0] = new Unit("Inches", 0.0254);
+        usaDistances[1] = new Unit("Feet", 0.305);
+        usaDistances[2] = new Unit("Yards", 0.914);
+        usaDistances[3] = new Unit("Miles", 1613.0);
+        usaPanel = new ConversionPanel(this, "U.S. System",
+                                       usaDistances,
+                                       new FollowerRangeModel(dataModel));
+
+        //Create a JPanel, and add the ConversionPanels to it.
+        mainPane = new JPanel();
+        if (COLORS) {
+            mainPane.setBackground(Color.red);
+        }
+        mainPane.setLayout(new GridLayout(2,1,5,5));
+        mainPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+        mainPane.add(metricPanel);
+        mainPane.add(usaPanel);
+        resetMaxValues(true);
+    }
+
+    public void resetMaxValues(boolean resetCurrentValues) {
+        double metricMultiplier = metricPanel.getMultiplier();
+        double usaMultiplier = usaPanel.getMultiplier();
+        int maximum = ConversionPanel.MAX;
+
+        if (metricMultiplier > usaMultiplier) {
+            maximum = (int)(ConversionPanel.MAX *
+                      (usaMultiplier/metricMultiplier));
+        }
+
+        if (DEBUG) {
+            System.out.println("in Converter resetMaxValues");
+            System.out.println("  metricMultiplier = " 
+                                + metricMultiplier
+                             + "; usaMultiplier = "
+                                + usaMultiplier
+                             + "; maximum = " 
+                                + maximum);
+        }
+
+        dataModel.setMaximum(maximum);
+
+        if (resetCurrentValues) {
+            dataModel.setDoubleValue(maximum);
+        }
+    }
+
+    private static void initLookAndFeel() { 
+        String lookAndFeel = null;
+
+        if (LOOKANDFEEL != null) {
+            if (LOOKANDFEEL.equals("Metal")) {
+                lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
+            } else if (LOOKANDFEEL.equals("System")) {
+                lookAndFeel = UIManager.getSystemLookAndFeelClassName();
+            } else if (LOOKANDFEEL.equals("Mac")) {
+                lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";
+                //PENDING: check!
+            } else if (LOOKANDFEEL.equals("Windows")) {
+                lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
+            } else if (LOOKANDFEEL.equals("Motif")) {
+                lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
+            }
+
+            if (DEBUG) {
+                System.out.println("About to request look and feel: " 
+                                   + lookAndFeel);
+            }
+
+            try {
+                UIManager.setLookAndFeel(lookAndFeel);
+            } catch (ClassNotFoundException e) {
+                System.err.println("Couldn't find class for specified look and feel:"
+                                   + lookAndFeel);
+                System.err.println("Did you include the L&F library in the class path?");
+                System.err.println("Using the default look and feel.");
+            } catch (UnsupportedLookAndFeelException e) {
+                System.err.println("Can't use the specified look and feel ("
+                                   + lookAndFeel
+                                   + ") on this platform.");
+                System.err.println("Using the default look and feel.");
+            } catch (Exception e) { 
+                System.err.println("Couldn't get specified look and feel ("
+                                   + lookAndFeel
+                                   + "), for some reason.");
+                System.err.println("Using the default look and feel.");
+                e.printStackTrace();
+            } 
+        }
+    }
+
+    public static void main(String[] args) {
+        initLookAndFeel();
+        Converter converter = new Converter();
+
+        //Create a new window.
+        JFrame f = new JFrame("Converter");
+        f.addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                System.exit(0);
+            }
+        });
+
+        //Add the JPanel to the window and display the window.
+        //We can use a JPanel for the content pane because
+        //JPanel is opaque.
+        f.setContentPane(converter.mainPane);
+        if (COLORS) {
+           //This has no effect, since the JPanel completely
+           //covers the content pane.
+           f.getContentPane().setBackground(Color.green);
+        }
+
+        f.pack();        //Resizes the window to its natural size.
+        f.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/MenuDemo.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,164 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenuBar;
+import javax.swing.KeyStroke;
+import javax.swing.ImageIcon;
+
+import javax.swing.JTextArea;
+import javax.swing.JScrollPane;
+import javax.swing.JFrame;
+
+/*
+ * This class adds event handling to MenuLookDemo.
+ */
+public class MenuDemo extends JFrame 
+                      implements ActionListener, ItemListener {
+    JTextArea output;
+    JScrollPane scrollPane;
+    String newline = "\n";
+
+    public MenuDemo() {
+        JMenuBar menuBar;
+        JMenu menu, submenu;
+        JMenuItem menuItem;
+        JRadioButtonMenuItem rbMenuItem;
+        JCheckBoxMenuItem cbMenuItem;
+
+        addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                System.exit(0);
+            }
+        });
+
+        //Add regular components to the window, using the default BorderLayout.
+        Container contentPane = getContentPane();
+        output = new JTextArea(5, 30);
+        output.setEditable(false);
+        scrollPane = new JScrollPane(output);
+        contentPane.add(scrollPane, BorderLayout.CENTER);
+
+        //Create the menu bar.
+        menuBar = new JMenuBar();
+        setJMenuBar(menuBar);
+
+        //Build the first menu.
+        menu = new JMenu("A Menu");
+        menu.setMnemonic(KeyEvent.VK_A);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "The only menu in this program that has menu items");
+        menuBar.add(menu);
+
+        //a group of JMenuItems
+        menuItem = new JMenuItem("A text-only menu item",
+                                 KeyEvent.VK_T);
+        //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_1, ActionEvent.ALT_MASK));
+        menuItem.getAccessibleContext().setAccessibleDescription(
+                "This doesn't really do anything");
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+
+        menuItem = new JMenuItem("Both text and icon", 
+                                 new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_B);
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+
+        menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_D);
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+
+        //a group of radio button menu items
+        menu.addSeparator();
+        ButtonGroup group = new ButtonGroup();
+        rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
+        rbMenuItem.setSelected(true);
+        rbMenuItem.setMnemonic(KeyEvent.VK_R);
+        group.add(rbMenuItem);
+        rbMenuItem.addActionListener(this);
+        menu.add(rbMenuItem);
+        rbMenuItem = new JRadioButtonMenuItem("Another one");
+        rbMenuItem.setMnemonic(KeyEvent.VK_O);
+        group.add(rbMenuItem);
+        rbMenuItem.addActionListener(this);
+        menu.add(rbMenuItem);
+
+        //a group of check box menu items
+        menu.addSeparator();
+        cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
+        cbMenuItem.setMnemonic(KeyEvent.VK_C);
+        cbMenuItem.addItemListener(this);
+        menu.add(cbMenuItem);
+        cbMenuItem = new JCheckBoxMenuItem("Another one");
+        cbMenuItem.setMnemonic(KeyEvent.VK_H);
+        cbMenuItem.addItemListener(this);
+        menu.add(cbMenuItem);
+
+        //a submenu
+        menu.addSeparator();
+        submenu = new JMenu("A submenu");
+        submenu.setMnemonic(KeyEvent.VK_S);
+
+        menuItem = new JMenuItem("An item in the submenu");
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_2, ActionEvent.ALT_MASK));
+        menuItem.addActionListener(this);
+        submenu.add(menuItem);
+
+        menuItem = new JMenuItem("Another item");
+        menuItem.addActionListener(this);
+        submenu.add(menuItem);
+        menu.add(submenu);
+
+        //Build second menu in the menu bar.
+        menu = new JMenu("Another Menu");
+        menu.setMnemonic(KeyEvent.VK_N);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "This menu does nothing");
+        menuBar.add(menu);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        JMenuItem source = (JMenuItem)(e.getSource());
+        String s = "Action event detected."
+                   + newline
+                   + "    Event source: " + source.getText()
+                   + " (an instance of " + getClassName(source) + ")";
+        output.append(s + newline);
+    }
+
+    public void itemStateChanged(ItemEvent e) {
+        JMenuItem source = (JMenuItem)(e.getSource());
+        String s = "Item event detected."
+                   + newline
+                   + "    Event source: " + source.getText()
+                   + " (an instance of " + getClassName(source) + ")"
+                   + newline
+                   + "    New state: " 
+                   + ((e.getStateChange() == ItemEvent.SELECTED) ?
+                     "selected":"unselected");
+        output.append(s + newline);
+    }
+
+    // Returns just the class name -- no package info.
+    protected String getClassName(Object o) {
+        String classString = o.getClass().getName();
+        int dotIndex = classString.lastIndexOf(".");
+        return classString.substring(dotIndex+1);
+    }
+
+    public static void main(String[] args) {
+        MenuDemo window = new MenuDemo();
+
+        window.setTitle("MenuDemo");
+        window.setSize(450, 260);
+        window.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/MenuLookDemo.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,128 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenuBar;
+import javax.swing.KeyStroke;
+import javax.swing.ImageIcon;
+
+import javax.swing.JTextArea;
+import javax.swing.JScrollPane;
+import javax.swing.JFrame;
+
+/*
+ * This class exists solely to show you what menus look like.
+ * It has no menu-related event handling.
+ */
+public class MenuLookDemo extends JFrame {
+    JTextArea output;
+    JScrollPane scrollPane;
+
+    public MenuLookDemo() {
+        JMenuBar menuBar;
+        JMenu menu, submenu;
+        JMenuItem menuItem;
+        JCheckBoxMenuItem cbMenuItem;
+        JRadioButtonMenuItem rbMenuItem;
+
+        addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                System.exit(0);
+            }
+        });
+
+        //Add regular components to the window, using the default BorderLayout.
+        Container contentPane = getContentPane();
+        output = new JTextArea(5, 30);
+        output.setEditable(false);
+        scrollPane = new JScrollPane(output);
+        contentPane.add(scrollPane, BorderLayout.CENTER);
+
+        //Create the menu bar.
+        menuBar = new JMenuBar();
+        setJMenuBar(menuBar);
+
+        //Build the first menu.
+        menu = new JMenu("A Menu");
+        menu.setMnemonic(KeyEvent.VK_A);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "The only menu in this program that has menu items");
+        menuBar.add(menu);
+
+        //a group of JMenuItems
+        menuItem = new JMenuItem("A text-only menu item",
+                                 KeyEvent.VK_T);
+        //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_1, ActionEvent.ALT_MASK));
+        menuItem.getAccessibleContext().setAccessibleDescription(
+                "This doesn't really do anything");
+        menu.add(menuItem);
+
+        menuItem = new JMenuItem("Both text and icon", 
+                                 new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_B);
+        menu.add(menuItem);
+
+        menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_D);
+        menu.add(menuItem);
+
+        //a group of radio button menu items
+        menu.addSeparator();
+        ButtonGroup group = new ButtonGroup();
+
+        rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
+        rbMenuItem.setSelected(true);
+        rbMenuItem.setMnemonic(KeyEvent.VK_R);
+        group.add(rbMenuItem);
+        menu.add(rbMenuItem);
+
+        rbMenuItem = new JRadioButtonMenuItem("Another one");
+        rbMenuItem.setMnemonic(KeyEvent.VK_O);
+        group.add(rbMenuItem);
+        menu.add(rbMenuItem);
+
+        //a group of check box menu items
+        menu.addSeparator();
+        cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
+        cbMenuItem.setMnemonic(KeyEvent.VK_C);
+        menu.add(cbMenuItem);
+
+        cbMenuItem = new JCheckBoxMenuItem("Another one");
+        cbMenuItem.setMnemonic(KeyEvent.VK_H);
+        menu.add(cbMenuItem);
+
+        //a submenu
+        menu.addSeparator();
+        submenu = new JMenu("A submenu");
+        submenu.setMnemonic(KeyEvent.VK_S);
+
+        menuItem = new JMenuItem("An item in the submenu");
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_2, ActionEvent.ALT_MASK));
+        submenu.add(menuItem);
+
+        menuItem = new JMenuItem("Another item");
+        submenu.add(menuItem);
+        menu.add(submenu);
+
+        //Build second menu in the menu bar.
+        menu = new JMenu("Another Menu");
+        menu.setMnemonic(KeyEvent.VK_N);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "This menu does nothing");
+        menuBar.add(menu);
+    }
+
+    public static void main(String[] args) {
+        MenuLookDemo window = new MenuLookDemo();
+
+        window.setTitle("MenuLookDemo");
+        window.setSize(450, 260);
+        window.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/gui/swing/PopupMenuDemo.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,196 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.JPopupMenu;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenuBar;
+import javax.swing.KeyStroke;
+import javax.swing.ImageIcon;
+
+import javax.swing.JTextArea;
+import javax.swing.JScrollPane;
+import javax.swing.JFrame;
+
+/*
+ * This class adds popup menus to MenuDemo.
+ */
+public class PopupMenuDemo extends JFrame 
+                           implements ActionListener, ItemListener {
+    JTextArea output;
+    JScrollPane scrollPane;
+    String newline = "\n";
+    JPopupMenu popup;
+
+    public PopupMenuDemo() {
+        JMenuBar menuBar;
+        JMenu menu, submenu;
+        JMenuItem menuItem;
+        JRadioButtonMenuItem rbMenuItem;
+        JCheckBoxMenuItem cbMenuItem;
+
+        addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                System.exit(0);
+            }
+        });
+
+        //Add regular components to the window, using the default BorderLayout.
+        Container contentPane = getContentPane();
+        output = new JTextArea(5, 30);
+        output.setEditable(false);
+        scrollPane = new JScrollPane(output);
+        contentPane.add(scrollPane, BorderLayout.CENTER);
+
+        //Create the menu bar.
+        menuBar = new JMenuBar();
+        setJMenuBar(menuBar);
+
+        //Build the first menu.
+        menu = new JMenu("A Menu");
+        menu.setMnemonic(KeyEvent.VK_A);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "The only menu in this program that has menu items");
+        menuBar.add(menu);
+
+        //a group of JMenuItems
+        menuItem = new JMenuItem("A text-only menu item",
+                                 KeyEvent.VK_T);
+        //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_1, ActionEvent.ALT_MASK));
+        menuItem.getAccessibleContext().setAccessibleDescription(
+                "This doesn't really do anything");
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+        menuItem = new JMenuItem("Both text and icon", 
+                                 new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_B);
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+        menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
+        menuItem.setMnemonic(KeyEvent.VK_D);
+        menuItem.addActionListener(this);
+        menu.add(menuItem);
+
+        //a group of radio button menu items
+        menu.addSeparator();
+        ButtonGroup group = new ButtonGroup();
+        rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
+        rbMenuItem.setSelected(true);
+        rbMenuItem.setMnemonic(KeyEvent.VK_R);
+        group.add(rbMenuItem);
+        rbMenuItem.addActionListener(this);
+        menu.add(rbMenuItem);
+        rbMenuItem = new JRadioButtonMenuItem("Another one");
+        rbMenuItem.setMnemonic(KeyEvent.VK_O);
+        group.add(rbMenuItem);
+        rbMenuItem.addActionListener(this);
+        menu.add(rbMenuItem);
+
+        //a group of check box menu items
+        menu.addSeparator();
+        cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
+        cbMenuItem.setMnemonic(KeyEvent.VK_C);
+        cbMenuItem.addItemListener(this);
+        menu.add(cbMenuItem);
+        cbMenuItem = new JCheckBoxMenuItem("Another one");
+        cbMenuItem.setMnemonic(KeyEvent.VK_H);
+        cbMenuItem.addItemListener(this);
+        menu.add(cbMenuItem);
+
+        //a submenu
+        menu.addSeparator();
+        submenu = new JMenu("A submenu");
+        submenu.setMnemonic(KeyEvent.VK_S);
+
+        menuItem = new JMenuItem("An item in the submenu");
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(
+                KeyEvent.VK_2, ActionEvent.ALT_MASK));
+        menuItem.addActionListener(this);
+        submenu.add(menuItem);
+
+        menuItem = new JMenuItem("Another item");
+        menuItem.addActionListener(this);
+        submenu.add(menuItem);
+        menu.add(submenu);
+
+        //Build second menu in the menu bar.
+        menu = new JMenu("Another Menu");
+        menu.setMnemonic(KeyEvent.VK_N);
+        menu.getAccessibleContext().setAccessibleDescription(
+                "This menu does nothing");
+        menuBar.add(menu);
+
+        //Create the popup menu.
+        popup = new JPopupMenu();
+        menuItem = new JMenuItem("A popup menu item");
+        menuItem.addActionListener(this);
+        popup.add(menuItem);
+        menuItem = new JMenuItem("Another popup menu item");
+        menuItem.addActionListener(this);
+        popup.add(menuItem);
+
+        //Add listener to components that can bring up popup menus.
+        MouseListener popupListener = new PopupListener();
+        output.addMouseListener(popupListener);
+        scrollPane.addMouseListener(popupListener);
+        menuBar.addMouseListener(popupListener);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        JMenuItem source = (JMenuItem)(e.getSource());
+        String s = "Action event detected."
+                   + newline
+                   + "    Event source: " + source.getText()
+                   + " (an instance of " + getClassName(source) + ")";
+        output.append(s + newline);
+    }
+
+    public void itemStateChanged(ItemEvent e) {
+        JMenuItem source = (JMenuItem)(e.getSource());
+        String s = "Item event detected."
+                   + newline
+                   + "    Event source: " + source.getText()
+                   + " (an instance of " + getClassName(source) + ")"
+                   + newline
+                   + "    New state: " 
+                   + ((e.getStateChange() == ItemEvent.SELECTED) ?
+                     "selected":"unselected");
+        output.append(s + newline);
+    }
+
+    // Returns just the class name -- no package info.
+    protected String getClassName(Object o) {
+        String classString = o.getClass().getName();
+        int dotIndex = classString.lastIndexOf(".");
+        return classString.substring(dotIndex+1);
+    }
+
+    public static void main(String[] args) {
+        PopupMenuDemo window = new PopupMenuDemo();
+
+        window.setTitle("PopupMenuDemo");
+        window.setSize(450, 260);
+        window.setVisible(true);
+    }
+
+    class PopupListener extends MouseAdapter {
+        public void mousePressed(MouseEvent e) {
+            maybeShowPopup(e);
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            maybeShowPopup(e);
+        }
+
+        private void maybeShowPopup(MouseEvent e) {
+            if (e.isPopupTrigger()) {
+                popup.show(e.getComponent(),
+                           e.getX(), e.getY());
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/Axis.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,119 @@
+/*
+ *      Axis.java 1.0 98/11/25
+ *
+ * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
+ * modify and redistribute this software in source and binary code form,
+ * provided that i) this copyright notice and license appear on all copies of
+ * the software; and ii) Licensee does not utilize the software in a manner
+ * which is disparaging to Sun.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * This software is not designed or intended for use in on-line control of
+ * aircraft, air traffic, aircraft navigation or aircraft communications; or in
+ * the design, construction, operation or maintenance of any nuclear
+ * facility. Licensee represents and warrants that it will not use or
+ * redistribute the Software for such purposes.
+ */
+
+/*
+ * Getting Started with the Java 3D API
+ * written in Java 3D
+ *
+ * This program demonstrates:
+ *   1. writing a visual object class
+ *      In this program, Axis class defines a visual object
+ *      This particular class extends Shape3D
+ *      See the text for a discussion.
+ *   2. Using LineArray to draw 3D lines.
+ */
+
+
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+
+    public class Axis extends Shape3D{
+
+	////////////////////////////////////////////
+	//
+	// create axis visual object
+	//
+	public Axis() {
+	
+	    this.setGeometry(createGeometry());
+
+	}
+
+	private Geometry createGeometry(){
+	    // create line for X axis
+            IndexedLineArray axisLines = new IndexedLineArray(18, GeometryArray.COORDINATES, 30);
+
+	    axisLines.setCoordinate( 0, new Point3f(-1.0f, 0.0f, 0.0f));
+	    axisLines.setCoordinate( 1, new Point3f( 1.0f, 0.0f, 0.0f));
+	    axisLines.setCoordinate( 2, new Point3f( 0.9f, 0.1f, 0.1f));
+	    axisLines.setCoordinate( 3, new Point3f( 0.9f,-0.1f, 0.1f));
+	    axisLines.setCoordinate( 4, new Point3f( 0.9f, 0.1f,-0.1f));
+	    axisLines.setCoordinate( 5, new Point3f( 0.9f,-0.1f,-0.1f));
+	    axisLines.setCoordinate( 6, new Point3f( 0.0f,-1.0f, 0.0f));
+	    axisLines.setCoordinate( 7, new Point3f( 0.0f, 1.0f, 0.0f));
+	    axisLines.setCoordinate( 8, new Point3f( 0.1f, 0.9f, 0.1f));
+	    axisLines.setCoordinate( 9, new Point3f(-0.1f, 0.9f, 0.1f));
+	    axisLines.setCoordinate(10, new Point3f( 0.1f, 0.9f,-0.1f));
+	    axisLines.setCoordinate(11, new Point3f(-0.1f, 0.9f,-0.1f));
+	    axisLines.setCoordinate(12, new Point3f( 0.0f, 0.0f,-1.0f));
+	    axisLines.setCoordinate(13, new Point3f( 0.0f, 0.0f, 1.0f));
+	    axisLines.setCoordinate(14, new Point3f( 0.1f, 0.1f, 0.9f));
+	    axisLines.setCoordinate(15, new Point3f(-0.1f, 0.1f, 0.9f));
+	    axisLines.setCoordinate(16, new Point3f( 0.1f,-0.1f, 0.9f));
+	    axisLines.setCoordinate(17, new Point3f(-0.1f,-0.1f, 0.9f));
+
+            axisLines.setCoordinateIndex( 0, 0);
+            axisLines.setCoordinateIndex( 1, 1);
+            axisLines.setCoordinateIndex( 2, 2);
+            axisLines.setCoordinateIndex( 3, 1);
+            axisLines.setCoordinateIndex( 4, 3);
+            axisLines.setCoordinateIndex( 5, 1);
+            axisLines.setCoordinateIndex( 6, 4);
+            axisLines.setCoordinateIndex( 7, 1);
+            axisLines.setCoordinateIndex( 8, 5);
+            axisLines.setCoordinateIndex( 9, 1);
+            axisLines.setCoordinateIndex(10, 6);
+            axisLines.setCoordinateIndex(11, 7);
+            axisLines.setCoordinateIndex(12, 8);
+            axisLines.setCoordinateIndex(13, 7);
+            axisLines.setCoordinateIndex(14, 9);
+            axisLines.setCoordinateIndex(15, 7);
+            axisLines.setCoordinateIndex(16,10);
+            axisLines.setCoordinateIndex(17, 7);
+            axisLines.setCoordinateIndex(18,11);
+            axisLines.setCoordinateIndex(19, 7);
+            axisLines.setCoordinateIndex(20,12);
+            axisLines.setCoordinateIndex(21,13);
+            axisLines.setCoordinateIndex(22,14);
+            axisLines.setCoordinateIndex(23,13);
+            axisLines.setCoordinateIndex(24,15);
+            axisLines.setCoordinateIndex(25,13);
+            axisLines.setCoordinateIndex(26,16);
+            axisLines.setCoordinateIndex(27,13);
+            axisLines.setCoordinateIndex(28,17);
+            axisLines.setCoordinateIndex(29,13);
+
+            return axisLines;
+
+	} // end of Axis createGeometry()
+
+
+    } // end of class Axis
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/FPS.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,32 @@
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import java.util.Enumeration;
+
+final class FPS extends Behavior {
+
+    protected int nFrames;
+    protected long startTime;
+    protected final WakeupCondition w;
+
+    public FPS(int nFrames){
+        this.nFrames=nFrames;
+        w=new WakeupOnElapsedFrames(nFrames);        
+    }
+
+    public FPS(){
+        this(100);
+    }
+
+    public void initialize(){
+        setSchedulingBounds(new BoundingSphere(new Point3d(),1000));
+        startTime=System.currentTimeMillis();
+        wakeupOn(w);
+    }
+
+    public void processStimulus(Enumeration criteria){
+        long time=System.currentTimeMillis();
+        System.err.println("fps: "+ 1000 * (double) nFrames / (double) (time-startTime));
+        startTime=time;
+        wakeupOn(w);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/LocalUniverse.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,12 @@
+//import samer.core.*;
+import javax.media.j3d.*;
+
+public class LocalUniverse extends VirtualUniverse
+{
+	Locale		locale;
+
+	public LocalUniverse() { locale=new Locale(this); }
+	public BranchGroup addGroup(BranchGroup bg) {
+		 locale.addBranchGraph(bg); return bg;
+	}
+}		
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/MatrixPointArray.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,73 @@
+import samer.core.types.*;
+import samer.maths.*;
+import java.util.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+
+public class MatrixPointArray extends PointArray implements Observer
+{
+	int			N;	// number of points
+	Matrix		P;	// 3d positions of points
+	VVector		A;	// scalar activations
+	VDouble		K;  // slaing factor for activations
+	float		carray[];	// array for holding colours
+
+
+	public MatrixPointArray(Matrix points, VVector activities)
+	{
+		super(points.getRowDimension(), COORDINATES | COLOR_3);
+
+		N=points.getRowDimension();
+		P=points;
+		A=activities;
+		carray=new float[3*N];
+		K=new VDouble("scale",1);
+
+		// set capabilities for subsequent updates
+		setCapability(ALLOW_COORDINATE_WRITE);
+		setCapability(ALLOW_COLOR_WRITE);
+
+		{
+			double [] a=A.array();
+			for (int i=0; i<N; i++) a[i]=1;
+		}
+
+		updatePoints();
+		updateActivities();
+
+		A.addObserver(this);
+	}
+
+
+	public void update(Observable o, Object a)
+	{
+		updateActivities();
+	}
+
+	public void updatePoints()
+	{
+		// load points into point array
+		double [][] PA=P.getArray();
+		double []	row;
+		for (int i=0; i<N; i++) {
+			row=PA[i];
+			setCoordinate(i,row);
+		}
+	}
+
+	public void updateActivities()
+	{
+		// load colours
+		double [] a=A.array();
+		double	  k=K.value;
+
+		for (int i=0, j=0; i<N; i++,j+=3) {
+			float ai=(float)(a[i]*k);
+			carray[j]=ai;
+			carray[j+1]=0.8f*ai;
+			carray[j+2]=0.4f*ai;
+		}
+		setColors(0,carray);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/Viewer.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,97 @@
+/*
+		Viewer.java
+
+		A View branch group containing a ViewPlatform
+		and associated View, Canvas etc. Creates a
+		window for itself. Can be added dynamically
+		to a live universe.
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.behaviors.keyboard.*;
+
+import samer.core.Node;
+
+public class Viewer extends BranchGroup implements Agent
+{
+	Node			node;
+	Canvas3D		canvas;
+	TransformGroup	VT=new TransformGroup();
+	View			V=new View();
+	Shell.Window	win;
+
+	public void lookFrom(Point3d eye, Vector3d up)
+	{
+		// view platform placement			
+		Transform3D		t=new Transform3D();
+		t.lookAt(eye, new Point3d(0,0,0), up);
+		t.invert();
+		VT.setTransform(t);
+	}
+
+	public Viewer(String name)
+	{
+		node=new Node(name);
+		Shell.push(node);
+
+		// create view bits
+		canvas=new Canvas3D(util.getGraphicsConfiguration());
+
+		// view platform placement			
+		ViewPlatform	VP=new ViewPlatform();
+
+		lookFrom(new Point3d(0,1,6), new Vector3d(0,1,0));
+
+		if (Shell.getBoolean("keynav",false)) {
+			// !!! all key navigators seem to be slaved!			
+			util.addKeyNavigator(VT,util.readwrite(VT));
+		}
+
+		VT.addChild(VP);
+		addChild(VT);
+
+		// view itself
+		V.addCanvas3D(canvas);
+		V.setPhysicalBody(new PhysicalBody());
+		V.setPhysicalEnvironment(new PhysicalEnvironment());
+		V.attachViewPlatform(VP);
+		V.setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW);
+		V.setWindowResizePolicy(View.VIRTUAL_WORLD);
+		//V.setLocalEyeLightingEnable(true);
+		//v.setWindowMovementPolicy(View.VIRTUAL_WORLD);
+
+		setCapability(ALLOW_DETACH);
+		setCapability(ALLOW_CHILDREN_WRITE);
+		compile();
+		Shell.pop();
+
+		win=Shell.getWindow(name);
+		win.container().setLayout(new BorderLayout());
+		win.container().add(canvas);
+		win.expose();
+		win.addWindowListener(new WindowAdapter() {
+			public void windowClosing(WindowEvent e) { dispose(); }	
+		});
+
+		Shell.registerAgent(this);
+	}
+
+	public void dispose() 
+	{
+		Shell.deregisterAgent(this);
+		win.dispose(); 
+		detach();
+	}						
+
+	protected void finalize() { Shell.trace("finalizing view "+this); }
+
+	public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
+	public void execute(String cmd, Environment env) {
+		if (cmd.equals("start")) { V.startView(); } // canvas.startRenderer(); }
+		else if (cmd.equals("stop")) { V.stopView(); } // canvas.stopRenderer(); }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/abs3d.txt	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,512 @@
+ -1.2249771e+000  1.3287783e-001  3.6316273e-001
+  5.6866893e-001  2.4706921e-001  6.4439769e-001
+  3.7504430e-001 -3.2513718e-001  5.9658877e-001
+  3.6754884e-001 -7.5919150e-001  4.8736897e-001
+  5.6507900e-001  6.9792618e-001  9.1616350e-001
+ -2.2569936e-001 -9.2953282e-001 -6.2678996e-001
+  3.0538520e-001  8.3016525e-001  9.1519661e-001
+  1.5430264e-001 -1.1119975e+000 -2.3117656e-001
+  6.9066856e-001 -2.5418210e-001  3.5664763e-001
+  6.9980796e-001  1.8278967e-001  6.1979824e-001
+ -1.1532882e+000 -2.1568410e-001  1.7991022e-001
+  4.9968607e-002  9.2220134e-001  8.4540061e-001
+  2.2979367e-001 -1.0804708e+000  5.0259224e-002
+  5.5535796e-001 -6.1675250e-001  3.1565146e-001
+  6.8919935e-001 -1.8286010e-002  5.2443082e-001
+ -1.2134268e+000  7.7497023e-002  9.1196066e-001
+  8.5398150e-001  4.9583183e-001  7.0902568e-001
+  6.2656864e-001 -4.1922581e-001  3.5900705e-001
+  9.8326552e-003 -7.7545176e-001 -9.4175922e-001
+  1.2017954e-001  9.2910589e-001  8.3884032e-001
+  2.1741841e-001 -8.2069682e-001  5.1579118e-001
+  6.9905584e-001  6.5243045e-001  8.8225038e-001
+ -1.7091855e-001 -7.1160931e-001 -8.5837244e-001
+  8.1250132e-001 -1.2429555e-001  3.0436832e-001
+  3.5123679e-001 -7.1482772e-001  6.3406451e-001
+  4.6352566e-001  9.4847444e-001  7.2021656e-001
+ -9.3508282e-001 -6.2001412e-001  2.9622398e-002
+  7.8751885e-001 -3.3900961e-001  4.3343373e-002
+  9.0757769e-001  4.1352953e-001  6.1108867e-001
+  2.7476116e-001 -9.3862412e-001  2.7063779e-001
+ -1.0823106e+000 -2.5150467e-001  5.1247473e-001
+  3.9190065e-001  8.2985792e-001  8.7181711e-001
+  4.9714022e-001 -6.9929774e-001  3.7424518e-001
+  8.1561239e-001  1.6302169e-001  5.1661747e-001
+  1.1465140e-001 -1.0615828e+000 -5.0112390e-001
+  1.5539607e-001  9.0224675e-001  8.2988439e-001
+ -3.1937433e-002 -7.4063752e-001 -9.8092589e-001
+  6.5540766e-001 -5.0295084e-001  1.5185016e-001
+  9.7304307e-001  3.9605438e-001  4.6399442e-001
+ -1.0812221e+000 -2.4151822e-001  8.8746909e-001
+  6.7140210e-002  9.4623073e-001  7.8591784e-001
+  2.1728344e-001 -6.5289624e-001  7.5095008e-001
+  8.3519575e-001 -2.0627195e-001  1.1188658e-001
+  6.3577235e-001 -3.6579770e-001  2.7261375e-001
+ -1.1055404e-001 -6.0979877e-001 -1.0368371e+000
+  5.0754602e-001  7.3448889e-001  8.7889694e-001
+  1.3385426e-001 -7.0279596e-001  7.0034147e-001
+  7.6087621e-001  1.5698254e-001  5.1523853e-001
+ -8.8694668e-001 -7.5131757e-001 -2.5762013e-001
+  6.2819589e-001  1.0800498e+000  2.2863456e-001
+  1.0127869e-001 -1.1974721e+000 -5.1549747e-002
+  8.2948572e-001 -2.2409245e-001 -8.4095355e-003
+  5.3459408e-001 -6.2603215e-001  1.7343899e-001
+  3.6573419e-001  8.4830593e-001  8.3739313e-001
+ -1.3093233e+000  3.9897853e-001 -1.7128925e-001
+  3.8686755e-001 -6.8555202e-001  5.6823565e-001
+  6.2573073e-001  6.7931687e-001  8.4812873e-001
+  5.0393749e-002 -9.1493998e-001 -7.7663234e-001
+  9.2273564e-001  4.0021463e-001  5.1273496e-001
+  6.8954626e-001 -3.5960846e-001  1.4855770e-001
+ -5.9891952e-001 -7.9539432e-001 -5.0616146e-001
+  5.4556721e-001  1.0560608e+000  4.6247210e-001
+  1.9629614e-001 -9.6097245e-001  2.4711353e-001
+  7.3863657e-001  3.3852595e-002  4.2130957e-001
+ -1.0512002e+000 -4.4753412e-001  1.6460376e-001
+  5.8570233e-001  1.0613288e+000  3.3990103e-001
+  2.8163094e-001 -6.1491208e-001  7.0486415e-001
+  8.1808429e-001 -1.0213366e-001  1.3572510e-001
+ -1.9930934e-001 -9.6068260e-001 -5.5587344e-001
+  8.1832715e-001  5.7697870e-001  7.1715628e-001
+  5.1485401e-001 -3.0756617e-001  4.1655093e-001
+ -2.2060380e-001 -5.7890485e-001 -1.0435674e+000
+  9.1226627e-002  9.6960308e-001  7.2570494e-001
+  1.8689874e-001 -5.7272258e-001  7.6604976e-001
+  8.6207050e-001  2.5821471e-001  4.2289523e-001
+ -1.3700722e+000  8.8210756e-001  6.9983889e-001
+  3.3486025e-001  9.6155189e-001  7.2184876e-001
+  7.1280355e-002 -8.2407128e-001  5.3396201e-001
+  7.5949613e-001 -2.7489481e-001 -1.0815193e-001
+ -2.3580031e-002 -8.3838282e-001 -8.5778907e-001
+  5.4257275e-001  7.6711812e-001  8.0138971e-001
+  3.4754382e-001 -6.6814643e-001  5.3726078e-001
+  7.7113188e-001 -5.1983999e-002  2.2221381e-001
+ -1.1840847e+000 -2.0778654e-001 -6.0768541e-002
+  5.2934073e-001  1.0891914e+000  3.2458749e-001
+  5.7830066e-001 -4.9911982e-001  8.7000202e-002
+  9.3157543e-002 -1.1864719e+000 -2.7499631e-001
+  6.8707440e-001  7.1363458e-001  8.1053419e-001
+ -7.2183656e-001 -7.9208265e-001 -4.1487663e-001
+  8.8225736e-001  2.5297298e-001  3.5178588e-001
+  2.6147723e-001 -9.8614882e-001  8.0460520e-002
+ -5.9098894e-002  1.0070108e+000  6.6484117e-001
+  4.8605959e-001 -4.5720983e-001  2.5448300e-001
+ -9.5556366e-001 -6.6724251e-001 -8.9202327e-002
+  8.9484947e-001  4.6361716e-001  4.7239268e-001
+  7.9490314e-001 -1.6873919e-001 -7.9306814e-002
+ -1.3966315e+000  3.3010444e-001  5.8738258e-001
+  4.2136404e-001  8.9840463e-001  7.3971859e-001
+  4.0407557e-001 -6.0457484e-001  4.0796147e-001
+  4.0948126e-002 -7.0111590e-001  6.5529835e-001
+  5.5228355e-002  1.0381621e+000  6.7152293e-001
+ -1.5849147e-001 -6.4336697e-001 -1.0032187e+000
+  6.2788361e-001 -3.4921731e-001  3.7455595e-002
+  6.3731084e-001  1.5417729e-001  4.7060311e-001
+ -1.0880196e-001 -8.7159906e-001 -7.7723818e-001
+  3.7836833e-001  9.0780235e-001  7.4098932e-001
+ -1.2188357e+000 -1.6442510e-001  2.7041398e-001
+  7.6506513e-001  3.1585779e-001  4.5005367e-001
+  1.2476092e-001 -5.6361138e-001  7.7557163e-001
+  7.5010060e-001 -2.1338922e-001 -1.9156494e-001
+  4.9253610e-002 -1.1793000e+000  5.0330366e-002
+ -7.1279277e-002  1.0265424e+000  6.1648108e-001
+ -9.1241424e-001 -6.1737544e-001 -3.3209043e-001
+  7.3208732e-001  6.9955014e-001  7.5402225e-001
+  4.2556392e-001 -6.2350471e-001  2.3223260e-001
+  8.1008003e-001 -2.9769134e-002  3.5797584e-002
+ -1.0327523e-001 -7.7969756e-001 -9.0787692e-001
+  4.1097887e-001  1.0834755e+000  4.4787267e-001
+ -5.3737586e-001 -6.0285101e-002  1.9546735e+000
+  8.9496878e-001  4.9599086e-001  3.9449007e-001
+  2.7002616e-001 -6.0763894e-001  6.0519093e-001
+  6.4495602e-001 -3.1576605e-001 -9.4174932e-002
+  1.0107655e-001 -8.6677020e-001  3.6961323e-001
+  2.3887092e-001  9.8173916e-001  6.5824715e-001
+ -5.4630348e-001 -7.0285280e-001 -7.1265412e-001
+  7.4645518e-001  6.9097953e-001  6.7143879e-001
+  5.2124295e-001 -4.7592272e-001 -5.5617212e-002
+ -1.1310064e+000 -1.0429394e-001  6.7709394e-001
+  4.2464342e-001  1.1064266e+000  3.3032894e-001
+  8.6879134e-002 -5.9103812e-001  7.1171869e-001
+  7.8169632e-001  1.1734155e-001  1.8351068e-001
+  4.5532611e-002 -1.0917938e+000 -5.0985961e-001
+  9.2325967e-001  5.0421754e-001  3.3112549e-001
+  2.0650422e-001 -6.2137634e-001  6.0314296e-001
+  5.1712427e-001  1.1173658e+000  1.0166882e-001
+ -1.0001317e+000 -4.5600181e-001 -4.6048366e-001
+  7.3241432e-001 -1.6310948e-001 -2.5058806e-001
+  6.2948625e-001 -2.7732132e-001 -2.1700280e-001
+ -2.5273946e-001 -5.3349072e-001 -1.0683890e+000
+  5.0560239e-001  9.9320744e-001  5.0793579e-001
+  1.1490455e-001 -1.0574898e+000  4.9163969e-002
+  9.0899625e-001  3.6443720e-001  2.0695835e-001
+ -1.3616957e+000  4.8590074e-001  3.0367272e-001
+  4.7672397e-001  1.1121789e+000  1.9655260e-001
+ -5.7302768e-003 -9.0324802e-001  3.3870898e-001
+  7.8145906e-001 -1.8971463e-002 -9.8727345e-002
+  4.4404797e-001 -5.5875403e-001  3.1666778e-002
+ -1.3238705e+000  1.8717826e-001  1.4405312e-001
+  5.9440942e-001  8.6114843e-001  6.1920139e-001
+  7.2772056e-001  2.2477647e-001  2.5551678e-001
+  3.2709538e-001 -6.4739239e-001  3.3139849e-001
+ -4.6555541e-002 -8.8420170e-001 -7.9718659e-001
+  3.5615095e-001  1.0220340e+000  5.1776906e-001
+  4.1182594e-002 -5.2434221e-001  7.5509343e-001
+  4.5669467e-001  1.1254087e+000  1.0148420e-001
+ -6.3968979e-001 -7.0762812e-001 -6.2959085e-001
+  5.6164086e-001 -3.2221842e-001 -1.5463110e-001
+  7.8152220e-001  6.5901925e-001  5.6120577e-001
+ -8.0527564e-001 -8.2498829e-001 -3.6185404e-001
+  7.3952408e-001 -5.3875837e-002 -1.9200948e-001
+ -1.9342424e-002 -6.7191563e-001  5.8122858e-001
+  3.5816230e-001  1.0781945e+000  4.1852781e-001
+ -1.3678694e+000  2.8700284e-001 -4.8563330e-002
+  7.6612594e-001  2.7881860e-001  1.7446681e-001
+  3.7026859e-001 -2.2304394e-001  2.7353784e-001
+ -9.6424922e-004 -1.2063720e+000 -1.5901865e-001
+  3.9222699e-001  1.1201105e+000  2.2657724e-001
+  3.0723661e-003 -1.1616660e+000 -4.0710693e-001
+  3.3705136e-001 -5.6376300e-001  1.9489861e-001
+  9.0634916e-001  5.5462261e-001  2.7754448e-001
+ -1.1982513e+000  9.3633771e-003 -2.6230927e-001
+  5.7631860e-001  8.2815210e-001  6.6732267e-001
+  8.1648343e-002 -4.9610837e-001  7.2805646e-001
+  4.4017227e-001  1.1286154e+000  2.2280829e-002
+ -3.2383411e-001 -5.2712910e-001 -1.0264484e+000
+  6.9014664e-001 -8.5311329e-002 -2.8658910e-001
+  5.8222972e-001 -2.1143997e-001 -2.8613498e-001
+ -2.4721190e-001 -6.6281314e-001 -9.7874551e-001
+  6.9399516e-001  8.1243125e-001  6.3989488e-001
+  7.2015346e-001  5.8421867e-002 -9.5733957e-002
+ -1.3048222e+000  2.0568368e-001  8.5197114e-001
+  3.7905333e-001  1.1460350e+000  1.4625813e-001
+ -6.2486065e-003 -5.1362466e-001  7.1224207e-001
+  3.2633193e-002 -1.0001509e+000  6.0016524e-002
+  9.0108648e-001  4.5952505e-001  1.4127277e-001
+  2.3305100e-001 -4.9153793e-001  3.9236335e-001
+  2.8437576e-001  1.1437149e+000  3.0704445e-001
+ -1.1515127e+000  6.9300211e-002  6.3851073e-001
+  4.2395228e-001 -2.9290344e-001 -1.1322241e-001
+  7.5390907e-001  2.1514763e-001  1.0024542e-002
+ -7.5326270e-002 -9.0721901e-001 -7.4509414e-001
+  2.8202888e-001  1.0120079e+000  5.6023161e-001
+ -7.3320474e-001 -2.3611072e-001 -9.7109642e-001
+  7.8856744e-001  7.1223017e-001  4.7109226e-001
+ -8.3189939e-002 -7.5305926e-001  4.5661183e-001
+  1.5115992e-001 -2.5229684e-001  4.0773939e-001
+ -1.4088235e-001  1.0822877e+000  4.2002850e-001
+ -1.2168407e+000  1.4683669e-001  5.3543807e-001
+  4.3826915e-001 -1.3211062e-001 -5.8804152e-002
+  8.3849701e-001  3.7367379e-001  7.0144442e-002
+ -1.2184403e-001 -1.1845649e+000  3.2405390e-002
+  2.8364724e-001  1.0639143e+000  4.4959293e-001
+ -4.8279148e-001 -5.9718834e-001 -8.6901904e-001
+  2.6746909e-001 -2.3833694e-001  1.0728498e-001
+  6.5784268e-001  3.8078739e-003 -3.0640973e-001
+  1.8937780e-001  1.1588412e+000  2.5935472e-001
+ -8.4381118e-001 -2.1167876e-001 -8.7709571e-001
+ -8.1468226e-003 -4.3215820e-001  7.4013703e-001
+  6.9000346e-001  8.8275822e-001  5.1219175e-001
+ -7.8676826e-001  7.6325059e-002  1.9234762e+000
+  2.5136852e-001 -4.8944314e-001  7.4236459e-002
+  8.8126387e-001  5.9532016e-001  1.9526384e-001
+ -1.4750864e-001 -6.7178954e-001  4.9693915e-001
+  3.7728271e-001  1.1452593e+000 -4.7776930e-002
+ -7.0140839e-002 -1.0576812e+000 -5.5804412e-001
+  4.7148136e-001 -2.1173203e-001 -3.0017496e-001
+  7.1340045e-001  1.0026224e-001 -2.2631751e-001
+ -3.6282251e-001 -4.7969307e-001 -1.0506527e+000
+  1.9683852e-001  1.0439782e+000  5.2635804e-001
+ -7.7577178e-001  5.1880809e-001  1.7382744e+000
+  6.5818950e-001  3.0916527e-001  2.1768020e-002
+ -6.4902756e-001 -6.2635564e-001 -6.8793684e-001
+  2.9391592e-001  1.1557068e+000  2.0494968e-001
+ -9.3503446e-002 -1.1849156e+000 -2.2523147e-001
+  8.6220861e-001  6.1896179e-001  1.4540051e-001
+  1.6114430e-001 -5.3542537e-001  2.5213770e-001
+  5.4345685e-001 -1.2299442e-001 -3.9655218e-001
+ -5.8189578e-002 -4.1180570e-001  7.4746653e-001
+ -1.3765656e-001  1.1190232e+000  3.1912046e-001
+ -6.9493704e-002 -9.2961915e-001  2.0417468e-001
+  7.8502109e-001  7.3483217e-001  3.2863366e-001
+  1.8906179e-001 -2.4102354e-001 -1.4441241e-002
+ -1.0560447e+000 -5.7596895e-001  4.9081641e-002
+  2.2365845e-001  1.0985624e+000  4.3267234e-001
+ -2.9582890e-001 -7.6134237e-001 -8.8191716e-001
+  6.6587626e-001  1.1405872e-001 -3.0243906e-001
+ -8.7438305e-002 -4.4978708e-001  7.1472837e-001
+  2.8625812e-001  1.1676452e+000  1.3208489e-002
+ -1.3393759e+000  2.4093261e-001  1.9000618e-001
+  8.0650020e-001  4.0313616e-001 -3.8015218e-002
+  4.6292246e-002 -4.6900403e-001  4.0939556e-001
+  5.6172586e-001 -3.5907072e-002 -4.1982187e-001
+ -1.0610687e+000 -5.4421020e-001 -1.7846486e-001
+  5.4976153e-001  9.6876605e-001  4.1984781e-001
+ -1.7386445e-001 -7.7315850e-001  3.1917049e-001
+  2.6135671e-001  1.1907266e+000  5.7633707e-002
+ -1.0801336e-001 -9.9552822e-001 -6.4879486e-001
+  3.5102898e-001 -1.5843753e-001 -2.8958657e-001
+  8.2009201e-001  7.0045706e-001  1.8434131e-001
+ -1.3086183e+000  5.0744401e-001 -3.8520235e-001
+  2.0258478e-001  1.1197004e+000  3.5791173e-001
+ -1.5141047e-001 -5.6605040e-001  5.9482352e-001
+  2.0239655e-001 -3.0961846e-001 -1.5663472e-001
+  6.5217650e-001  2.0697701e-001 -2.4378567e-001
+ -5.1334022e-001 -5.4964478e-001 -9.2134882e-001
+ -1.8282223e-001  1.1362597e+000  2.0985741e-001
+ -1.6354575e-001 -1.0278726e+000  9.8484115e-002
+  7.9031836e-001  4.6299468e-001 -5.6587631e-002
+ -8.5119393e-001 -7.7094399e-001 -4.5329773e-001
+  6.2164651e-001  9.1908480e-001  5.0126003e-001
+  1.4087727e-002 -4.3010763e-001  2.8560182e-001
+  4.0105266e-001 -1.0485817e-001 -4.0284272e-001
+ -6.2011850e-001  1.8883123e-001  1.9265212e+000
+  1.4196252e-001  1.1863025e+000  2.0766888e-001
+ -1.1587699e-001 -4.5556811e-001  6.6012535e-001
+  5.9931061e-001  1.3247384e-001 -3.7713391e-001
+ -2.7139480e-001 -7.4053140e-001 -9.2469062e-001
+  2.1631569e-001  1.1780510e+000  1.2084433e-001
+ -1.1168847e+000 -4.4397841e-001  3.2812367e-002
+  7.8084534e-001  7.8151142e-001  2.0321158e-001
+ -1.5944397e-001 -4.3135578e-001  6.6899049e-001
+  7.4620546e-001  4.0677549e-001 -1.5840230e-001
+ -2.1687984e-001 -7.8900318e-001  2.1675727e-001
+ -1.8961840e-001  1.1436452e+000  1.3674443e-001
+ -1.2432090e+000  5.4237284e-002 -1.1068035e-001
+  4.9992491e-001 -1.9584176e-002 -4.7518866e-001
+  2.4916099e-001 -5.9178455e-002 -3.3844048e-001
+ -1.6302071e-001 -1.1344681e+000 -3.7906919e-001
+  1.4448871e-001  1.0862796e+000  3.5873693e-001
+ -3.1759887e-001 -5.9326826e-001 -1.0204091e+000
+  8.5887869e-001  5.9805720e-001 -2.7900995e-002
+ -9.8889085e-002 -3.4315011e-001  3.0963364e-001
+  7.0593790e-002  1.1726295e+000  2.5979942e-001
+ -5.9730872e-001 -5.7984866e-001 -7.9806097e-001
+  7.7447155e-002 -1.1465846e-001 -1.7792238e-001
+  5.7780401e-001  3.5449163e-001 -2.2802751e-001
+ -1.2811559e+000  2.6342614e-001  3.4882487e-001
+  2.1041625e-001  1.1863021e+000 -7.9888804e-002
+ -1.6087050e-001 -4.0019313e-001  5.2009479e-001
+ -2.6595911e-001 -5.8631644e-001  5.0251479e-001
+  7.2019664e-001  8.6080199e-001  4.3666269e-001
+ -6.9144471e-001 -6.8320339e-001 -5.6488231e-001
+  1.2510536e-001  1.0761321e+000  4.3269506e-001
+ -2.1133872e-001 -1.1400719e+000 -1.1452255e-001
+  5.7867640e-001  1.8941985e-001 -4.4137033e-001
+  4.5520759e-001  4.4285638e-003 -5.1948213e-001
+ -1.2141647e+000 -2.0071929e-001  4.0998977e-001
+  2.3727438e-001  1.1607165e+000 -1.7679477e-001
+ -7.2950656e-002 -2.8732844e-001  6.2612645e-002
+ -3.0591753e-001 -9.6805540e-001  1.2332995e-001
+  7.8798016e-001  7.6778559e-001  5.4077494e-002
+ -1.8179612e-001 -3.7962550e-001  7.1975813e-001
+  1.0120376e-001  1.2096586e+000  1.0039261e-001
+ -9.2926885e-001 -2.1992339e-001 -7.7596446e-001
+  2.2986298e-001  1.9058737e-002 -4.3341642e-001
+  7.3156907e-001  5.4254338e-001 -1.4611946e-001
+ -2.7652130e-001 -8.6669383e-001 -7.6770965e-001
+  3.8502939e-002  1.1368495e+000  3.3237013e-001
+ -4.2684635e-001 -4.7886002e-001 -1.0453755e+000
+  5.9082066e-001  3.1499190e-001 -3.6830832e-001
+ -4.2231660e-002 -1.6875995e-002 -1.4846978e-001
+ -1.9703586e-001 -3.3255390e-001  7.1306251e-001
+ -7.8080617e-002  1.1827778e+000  2.1261274e-002
+ -1.1493660e+000  8.5719216e-001  1.1502028e+000
+  4.5965367e-001  9.5776704e-001  5.2464857e-001
+ -3.2215140e-001 -6.7205453e-001  3.5562428e-001
+  5.2387642e-001  1.5832015e-001 -5.0365205e-001
+ -1.0310241e+000 -3.2834044e-001 -5.2174911e-001
+ -1.7336409e-004  1.1911539e+000  2.3083624e-001
+ -2.3305849e-001 -1.1358959e+000 -2.0241623e-001
+  7.9667579e-001  5.6942842e-001 -1.7279990e-001
+ -1.6948103e-001 -1.8129260e-001  9.9553301e-002
+ -1.4073692e-002  1.1895977e+000 -9.1735753e-002
+ -1.1307638e+000 -9.2619799e-002  9.2507534e-001
+ -2.7149639e-001 -3.0088729e-001  4.2420112e-001
+  4.0404965e-001  7.1542900e-002 -5.5325563e-001
+  7.5058167e-001  8.9590575e-001  2.2075439e-001
+ -4.4514720e-001 -5.6574458e-001 -1.0201613e+000
+ -2.7859663e-001 -4.3969850e-001  6.1727044e-001
+  1.1630343e-001  1.2234962e+000  3.8521919e-002
+ -6.6937627e-001 -5.6555070e-001 -7.6429270e-001
+  6.0798796e-001  4.9039672e-001 -3.0093760e-001
+  8.4856600e-002  7.4486724e-002 -3.9535055e-001
+ -2.9554570e-001 -1.9298139e-001  2.2019578e-001
+  9.5836419e-002  1.0481319e+000  4.8689889e-001
+ -1.1192201e+000  8.4697454e-002 -4.7790342e-001
+  1.1195394e-001  1.1855003e+000 -1.9041363e-001
+ -3.3344491e-001 -1.0944242e+000 -5.0544499e-001
+  4.4531826e-001  1.6878602e-001 -5.3704005e-001
+ -3.5975713e-001 -7.5527900e-001  2.2030268e-001
+  8.0465497e-001  7.4405889e-001 -7.7412972e-002
+ -1.3782487e+000  5.4366072e-001 -1.7627133e-001
+  2.6958701e-002  1.2126071e+000 -3.1567885e-002
+ -2.6016036e-001 -3.2301756e-001  6.8756322e-001
+ -1.1399458e-001  5.4588222e-002 -2.4898374e-001
+  5.0085013e-001  3.9718362e-001 -4.3756788e-001
+ -7.6670361e-001 -6.6807834e-001 -5.6977937e-001
+  8.6034464e-003  1.2020616e+000  1.4488796e-001
+ -3.8013518e-001 -7.9953182e-001 -8.2263242e-001
+  3.4198118e-001  9.7840464e-001  6.0038965e-001
+ -3.2526724e-002  1.4382287e-001 -3.7675614e-001
+ -1.1968159e+000 -1.7303508e-001  5.0577041e-001
+  6.8994786e-001  6.0632584e-001 -2.4949565e-001
+ -3.7223857e-001 -5.4156150e-001  4.4090330e-001
+ -1.2528995e-001  1.2008174e+000 -2.5139263e-002
+ -2.9725836e-001 -1.1142741e+000 -1.3643044e-001
+  3.9469020e-001  1.7852873e-001 -5.7832272e-001
+ -2.9466120e-001 -2.9708833e-001  6.3859137e-001
+  2.4827955e-002  1.0878739e+000  4.1610480e-001
+ -8.7324135e-001  2.7004915e-001  1.8612975e+000
+ -2.8139373e-001 -1.0902836e-001  7.6627497e-002
+ -2.1345423e-001  1.1866150e+000 -4.1327428e-002
+ -4.7588993e-001 -4.6362715e-001 -1.0631595e+000
+  3.1193383e-001  1.3951191e-001 -6.0410510e-001
+  7.3250007e-001  8.6431277e-001 -5.2717564e-002
+ -8.3568165e-001 -2.7571350e-001 -8.8177519e-001
+ -2.4799379e-001 -9.5178676e-003 -1.2454931e-001
+ -1.3198748e-001  1.2221217e+000  3.8831625e-002
+ -3.7375929e-001 -1.0402427e+000 -2.9599582e-003
+ -3.5211144e-001 -4.1092360e-001  5.6168276e-001
+  6.3222151e-001  6.2213666e-001 -3.0848813e-001
+  4.3623311e-001  3.3025901e-001 -5.4173344e-001
+ -1.2150115e+000  1.8654503e-002  5.0647027e-001
+  2.1967893e-001  1.2162910e+000 -1.2218730e-001
+ -3.7712358e-001 -2.4186813e-001  5.3943967e-001
+ -4.1103569e-001 -6.6133219e-001 -9.4987796e-001
+ -3.2245556e-002  1.1142778e+000  3.8610226e-001
+  7.6463137e-002  1.7026322e-001 -5.4880425e-001
+ -7.8916075e-001 -6.0287518e-001 -6.3608561e-001
+ -2.2790411e-001  1.1813259e+000 -1.2428902e-001
+ -3.6302162e-001 -7.7091446e-001  1.1694951e-001
+  5.4836108e-001  6.0505263e-001 -3.7182337e-001
+ -2.3319664e-001  1.3749414e-001 -2.2803409e-001
+ -1.1367547e+000 -2.4431661e-001 -2.3398633e-001
+  3.5031622e-001  8.8278449e-001  6.7047300e-001
+ -3.9333732e-001 -3.5758616e-001  5.4970775e-001
+  5.6035290e-002  1.2330164e+000 -1.6312599e-001
+ -1.0740026e+000 -1.2770392e-001  9.1795899e-001
+  2.9070257e-001  2.2304275e-001 -6.1703207e-001
+ -2.6902341e-001  2.4846243e-002 -2.0656343e-002
+ -3.8078027e-001 -1.1508586e+000 -4.0054906e-001
+ -9.0923270e-002  1.2197547e+000  1.4678556e-001
+  4.4115612e-001  5.9770955e-001 -4.0801420e-001
+ -6.0289433e-001 -4.9636872e-001 -9.3371426e-001
+  5.5510918e-001  8.0269701e-001  5.3377786e-001
+ -3.5022137e-001 -1.0817819e-001  3.7271752e-001
+ -4.1921399e-001 -8.5179790e-001 -7.7232806e-001
+ -1.7180637e-001  1.1881525e+000 -1.7580706e-001
+ -3.7956970e-001 -3.9835862e-002  1.7274883e-001
+  3.2721250e-001  3.7346330e-001 -5.8865596e-001
+ -1.2532149e+000  4.5102250e-001 -4.7572043e-001
+ -1.5811719e-002  1.2443101e+000  5.1459375e-002
+ -4.1887962e-001 -6.1888053e-001  2.3195046e-001
+ -9.1129479e-002  2.1434075e-001 -4.8197552e-001
+  7.7330617e-001  8.0226842e-001 -2.1385469e-001
+ -9.5695620e-001 -2.1642266e-001 -6.9172429e-001
+ -1.5078946e-001  1.2133680e+000 -1.3104913e-001
+ -4.4019926e-001 -8.1487875e-001  1.0637801e-001
+  2.1343683e-001  1.9569288e-001 -6.5617650e-001
+ -6.1910931e-001 -4.4509555e-001 -9.5729741e-001
+ -2.3871491e-002  1.2252579e+000 -1.9399555e-001
+ -3.2859526e-001 -2.5898814e-001  6.8419264e-001
+  4.0055170e-001  5.5164032e-001 -4.9620234e-001
+ -9.2722096e-001 -3.0623172e-001 -6.2785960e-001
+  3.6054216e-002  1.0617767e+000  5.5844792e-001
+ -3.5985821e-001  4.8991664e-002  5.1161908e-003
+ -1.3586240e+000  5.6215036e-001  6.7291527e-001
+  3.5090654e-001  1.1821025e+000 -2.3217549e-001
+ -4.3184613e-001 -8.7559111e-002  3.2464999e-001
+  7.8367310e-001  6.9106108e-001 -3.1825962e-001
+ -3.8076594e-001 -1.1140133e+000 -1.0666570e-001
+ -3.9522001e-001  5.5924291e-002 -1.1194310e-001
+ -1.1303749e-001  1.2032355e+000 -2.9499259e-001
+ -5.6601081e-001 -4.3979011e-001 -1.0537373e+000
+  3.8458513e-001  3.1310541e-001 -6.6357512e-001
+ -3.5050396e-002  2.6400012e-001 -5.8698622e-001
+ -1.1390185e+000  1.3647806e-001 -3.9626939e-001
+ -5.6974198e-002  1.2538710e+000 -1.3996955e-001
+ -4.5690387e-001 -3.8005739e-001  5.3599682e-001
+  6.3393539e-001  6.9416228e-001 -4.1749785e-001
+ -4.6883859e-001 -9.9269975e-001 -5.7786518e-001
+  9.6849785e-002  1.2147764e+000 -2.4476938e-001
+ -4.9612923e-001 -5.9779880e-001  2.9956775e-001
+  1.8661345e-001  3.3395002e-001 -6.6437478e-001
+ -1.2933383e+000  3.7917505e-001 -3.1790341e-001
+  1.6575339e-001  9.5084109e-001  7.0494519e-001
+ -4.5112609e-001 -1.5189905e-001  4.6321963e-001
+  2.1820118e-001  1.2132975e+000 -2.8217860e-001
+ -7.0362894e-001 -5.0008242e-001 -8.3806686e-001
+ -2.1226568e-001  2.3963812e-001 -4.6190595e-001
+  8.3504218e-001  7.6082026e-001 -2.9475120e-001
+ -8.7880318e-001 -5.4262571e-001 -6.3645138e-001
+ -1.7742923e-001  1.2087311e+000 -2.6795650e-001
+ -5.0064453e-001 -1.7627253e-001  3.9825142e-001
+ -1.2166539e+000  1.3896224e-002 -8.8350407e-003
+  2.8850940e-001  5.4814491e-001 -5.6815875e-001
+ -3.9522298e-001 -3.3247735e-001  6.9057175e-001
+ -1.6070786e-001  1.2030013e+000  2.1441994e-001
+ -4.3928509e-001 -1.0725212e+000 -6.6749947e-002
+  1.7762922e-001  2.7632828e-001 -7.0548312e-001
+ -1.4411774e-001  1.2350542e+000 -2.4236651e-001
+ -4.5109520e-001 -7.3831670e-001 -9.1822814e-001
+ -2.8829615e-001  2.3695250e-001 -4.2925396e-001
+  5.0935515e-001  6.7072118e-001 -5.1330693e-001
+ -1.2131904e+000  2.0253542e-001  7.1091275e-001
+  2.1058620e-001  1.2266833e+000 -3.2577926e-001
+ -5.1487940e-001 -4.2175186e-001  4.3783460e-001
+ -4.9349133e-001  3.5429338e-002 -1.4243760e-002
+  3.1483466e-001  7.5575391e-001  8.3691780e-001
+ -5.8776101e-001 -3.9175424e-001 -1.0609998e+000
+  5.0413142e-002  1.2338134e+000 -3.1563436e-001
+ -4.8555814e-001 -7.9037922e-001  6.6946400e-002
+  1.0892596e-002  3.0021788e-001 -6.9076222e-001
+  2.1244313e-001  5.4785394e-001 -6.0863592e-001
+ -1.0744123e+000 -3.6529080e-001 -3.2351415e-001
+ -1.9582556e-001  1.1829979e+000  2.7992522e-001
+ -4.9762485e-001 -1.7494976e-001  5.0255680e-001
+ -5.1752823e-001 -4.0602511e-001 -1.1175002e+000
+ -3.8522727e-002  1.2034012e+000 -4.0891875e-001
+ -2.4050271e-001  2.9327796e-001 -5.3488438e-001
+ -3.2488223e-001 -4.7219173e-001  1.9736740e+000
+  7.9805877e-001  7.7565154e-001 -3.7304139e-001
+ -4.5265789e-001 -2.3938154e-001  6.4073517e-001
+ -4.4896481e-001 -1.1211742e+000 -3.3897294e-001
+  4.1669997e-002  1.2226542e+000 -3.9366884e-001
+  1.4207189e-001  4.6045705e-001 -6.8706793e-001
+ -8.7397418e-001 -3.7287878e-001 -6.8039672e-001
+  2.5141516e-001  8.0654769e-001  8.6382150e-001
+  8.5357015e-002  3.5678728e-001 -7.3217895e-001
+ -5.4119319e-001 -5.3839304e-001  2.1930350e-001
+  1.3404309e-001  1.2339755e+000 -3.9100858e-001
+ -1.3196195e+000  3.9930563e-001  1.3338226e-001
+ -4.2257422e-001  1.5476092e-001 -3.1449080e-001
+ -2.2591179e-001  1.2432255e+000  4.3451729e-002
+ -4.4261603e-001 -9.3805868e-001 -7.4039959e-001
+ -1.4182169e-001  3.3858725e-001 -6.3838559e-001
+  5.9733258e-001  7.4290027e-001 -5.0752549e-001
+ -7.0113065e-001 -4.4056646e-001 -8.8866064e-001
+ -1.5397831e-001  1.2209871e+000 -3.9785060e-001
+ -4.1710516e-001 -2.3318858e-001  6.8660574e-001
+  3.8928848e-001  6.5494098e-001 -6.0537231e-001
+ -4.5711540e-001 -7.7312419e-001 -6.3465731e-002
+ -1.0390557e+000 -8.9859097e-002 -4.2325308e-001
+  2.0239311e-001  1.2267998e+000 -4.0798274e-001
+ -5.1942198e-001  2.4592313e-002  1.0446148e-001
+ -4.0139371e-001  1.9545499e-001 -3.7059365e-001
+ -1.1924401e-001  1.1376253e+000  5.0636424e-001
+ -7.5692918e-001 -4.4494997e-001 -8.4090876e-001
+  2.2263683e-001  4.1413267e-001 -7.3507235e-001
+  3.9328292e-001 -6.5696555e-001 -2.2034191e-001
+ -9.0739563e-002  1.2266721e+000 -4.2942919e-001
+ -1.2775463e+000  3.2821133e-001  1.5120101e-003
+  7.5684357e-001  8.2811158e-001 -4.0343426e-001
+ -9.5366060e-002  3.9063476e-001 -6.4408196e-001
+  9.8102240e-002 -8.5369910e-001 -5.8605852e-001
+  7.7001006e-003  1.2590547e+000 -3.7205339e-001
+ -6.2135844e-001 -8.4668224e-001 -7.1632454e-001
+  2.0570628e-001  6.3154036e-001 -5.9176780e-001
+ -5.3057509e-001 -2.1271144e-001  6.1483543e-002
+ -1.4531741e-001  1.1827021e+000  3.8514280e-001
+ -3.3104688e-001  3.2362072e-001 -3.3888035e-001
+ -1.1402332e+000  1.4875702e-001 -1.6589129e-001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/args	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,38 @@
+#properties
+#Tue Mar 26 17:20:08 GMT 2019
+mouse.y.trace.map.minimum=-0.0
+ft.power.plotter.window.bounds=(323,142,512,118)
+mouse.x.trace.map.symmetric=false
+x.editor.plotter.window.bounds=(490,234,231,110)
+scaler.scale.meter.map.maximum=6370.513
+exposed.bounds=(48,23,286,653)
+mouse.exposed.bounds=(448,59,223,119)
+ft.power.trace.map.minimum=0.001
+mouse.y.trace.map.maximum=400.0
+waveform.plotter.window.bounds=(4,22,1020,118)
+mouse.y.trace.window.bounds=(694,148,264,86)
+waveform.scaler.laplace.e.plotter.window.bounds=(4,22,1024,118)
+playlist.files='("/Users/samer/Music/Artists/Tunng/comments on the inner chorus/01-Hanged.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/02-Woodcat.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/03-The Wind Up Bird.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/04-Red And Green.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/05-Stories.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/06-Jenny Again.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/07-Man In The Box.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/08-Jay Down.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/09-It's just because we've got hair.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/10-Sweet William.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/11-Engine Room.mp3")
+scaler.scale.trace.window.bounds=(336,430,256,86)
+trace.bounds=(493,106,264,86)
+scaler.E=2895.934
+ft.power.trace.map.maximum=60.0
+ft.power.trace.window.bounds=(405,22,256,534)
+mouse.x.trace.map.minimum=0.0
+waveform.scaler.scale=0.023
+scaler.output.plotter.window.bounds=(12,589,1020,118)
+mouse.x.trace.map.maximum=400.0
+mouse.y.trace.map.symmetric=false
+playlist.current=/Users/samer/Music/Onset_paper/UPFsamples/audio/RadioTarifa3.wav
+mouse.x.trace.window.bounds=(693,61,264,86)
+ft.power.image.window.bounds=(4,22,513,37)
+x1.plotter.window.bounds=(440,22,231,118)
+x1.editor.plotter.window.bounds=(419,160,289,121)
+ft.mag.plotter.window.bounds=(502,338,256,118)
+waveform.scaler.scaleRate=0.01
+scaler.scale.meter.map.symmetric=false
+scaler.E.trace.window.bounds=(304,24,338,111)
+mouse.canvas.bounds=(4,23,430,397)
+scaler.scaleRate=0.004
+x1.image.window.bounds=(290,279,197,71)
+scaler.scale=2974.602
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello1.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,38 @@
+import samer.core.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.universe.*; 
+import com.sun.j3d.utils.geometry.ColorCube;
+import java.awt.*;
+
+public class hello1 
+{
+	public static void main(String[] args)
+	{
+		new samer.core.shells.SwingShell();
+		
+		BranchGroup	root=new BranchGroup();
+		Transform3D x1=new Transform3D();
+		Transform3D x2=new Transform3D();
+		x1.rotZ(Math.PI/8);
+		x2.set(new Vector3d(0.4,0,0));
+		x2.mul(x1);
+
+		Group tg = new TransformGroup(x2);
+		tg.addChild(new ColorCube(0.5));
+		root.addChild(tg);
+		root.compile();
+
+		Canvas3D canvas=new Canvas3D(null);
+		SimpleUniverse U = new SimpleUniverse(canvas);
+		U.getViewingPlatform().setNominalViewingTransform();
+		U.addBranchGraph(root);
+
+		Shell.Window win;
+		win=Shell.getWindow("hello");
+		win.addWindowListener(Shell.exitListener());
+		win.container().setLayout(new BorderLayout());
+		win.container().add(canvas);
+		win.expose();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello10.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,85 @@
+/*
+		hello10.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Now has dynamically creatable views.
+		Have to construct views on BranchGroups so they
+		can be added while universe is live?	
+
+		picking
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello10 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	
+	public static void main(String[] arse) { init(); new hello10(); }
+
+	public hello10()
+	{		
+		Viewer v=new Viewer("view");
+
+		// v.lookFrom(new Point3d(0,0,8),new Vector3d(0,1,0));
+
+		// create scene
+		root.addChild(createSceneGraph());
+		root.addChild(v);
+		root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+
+/*
+        tg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
+        PickRotateBehavior pr=new PickRotateBehavior(objroot, canvas, bounds);
+        objroot.addChild(pickRotate);
+ */
+
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("view");
+		r.setTarget(null); r.add("start").add("stop"); 
+	}
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) { 
+			root.addChild(new Viewer(X.string(env.datum("name"),"view")));
+		}
+	}
+
+	private static TransformGroup createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		//r.rotX(Math.PI/2);
+		r.setScale(0.5);
+		TransformGroup  t2=new TransformGroup(r);
+		t2.addChild( yoyoGroup(
+			yoyoGeometryInfo(12).getGeometryArray(),
+			wireframe2(),
+			pointy()));
+
+		TransformGroup	tg = new TransformGroup();
+		// addRotator(tg);
+		mouseRotate(tg);
+		mouseTranslate(tg);
+		mouseZoom(tg);
+		tg.addChild(t2);
+		return tg;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello11.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,105 @@
+/*
+		hello6.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Now has dynamically creatable views.
+		Have to construct views on BranchGroups so they
+		can be added while universe is live?	
+
+		immediate mode
+ */
+
+import samer.core.*;
+import samer.core.types.*;
+import samer.tools.*;
+
+import java.awt.event.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello11 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	TaskThread		tasks=new TaskThread();
+	Geometry		geom;
+	Appearance		app;
+				
+	public static void main(String[] arse) { 
+		init(); new hello11(); 
+		Shell.interpret("expose");
+	}
+
+	public hello11()
+	{		
+		// create scene
+		geom = yoyoGeometryInfo(128).getGeometryArray();
+		app  = pointy2();
+
+		root.addChild(new TransformGroup());
+		root.addChild(new view("view"));
+		root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { r.add("view"); }
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) { 
+			root.addChild(new view(X.string(env.datum("name"),"view")));
+		}
+	}
+
+
+	private class view extends Viewer implements Task
+	{
+		GraphicsContext3D	gc;
+		float				angle=0;
+		Transform3D			mt=new Transform3D();
+		VDouble				speed;
+
+		public view(String name)
+		{
+			super( name); // great mate
+			// lookFrom(new Point3d(0,0,8),new Vector3d(0,1,0));
+			canvas.stopRenderer();
+			tasks.addTask(this);
+
+			Shell.push(node);
+			speed=new VDouble("speed",0.1);
+			Shell.pop();
+		}
+
+		public void run()
+		{
+			mt.rotY(angle+=speed.value);
+			gc.clear();
+			gc.setModelTransform(mt);
+			gc.draw(geom);
+			canvas.swap();
+		}
+
+		public void dispose() {
+			tasks.removeTask(this);
+			super.dispose();
+		}
+
+		public void stopping() { Shell.print("view stopping"); }
+		public void starting() { 
+			Shell.print("view starting"); 
+		    if (gc==null) gc = canvas.getGraphicsContext3D();
+		    gc.setAppearance(app);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello12.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,90 @@
+/*
+		hello6.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Now has dynamically creatable views.
+		Have to construct views on BranchGroups so they
+		can be added while universe is live?	
+ */
+
+import samer.core.*;
+import samer.maths.*;
+import java.io.*;
+import java.awt.event.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello12 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	Viewer			V;
+		
+	public static void main(String[] arse) throws Exception 
+	{ 
+		init(); 
+		
+		Matrix P=new Matrix("points",512,3);
+		VVector A=new VVector("s",512);
+
+		P.assign(
+			Jama.Matrix.read(
+				new BufferedReader(
+					new FileReader(Shell.getString("filename",""))
+				)
+			)
+		);
+
+		new hello12(P,A); 
+		Shell.interpret("expose");
+	}
+
+	public hello12(String vec) throws Exception
+	{
+		this(
+			(Matrix)Shell.get("PointsMatrix"),
+			(VVector)Shell.get(vec)
+		);
+	}
+
+	public hello12(Matrix P, VVector A) throws Exception
+	{		
+		Shell.print("creating hello12");
+
+		// create scene
+		addBackground(root,new Background(new Color3f(0.26f,0.23f,0.35f)));
+		root.addChild( mouseRotaterGroup(
+			new Shape3D(new MatrixPointArray(P,A), pointy3())
+		));
+
+		root.addChild(new Viewer("particles"));
+		root.addChild(new FPS(200));
+		root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { }
+	public void execute(String cmd, Environment env) throws Exception {}
+	
+	private static Group mouseRotaterGroup(javax.media.j3d.Node n)
+	{
+		TransformGroup	tg = new TransformGroup();
+		mouseRotate(tg);
+		mouseTranslate(tg);
+		mouseZoom(tg);
+		tg.addChild(n);
+		return tg;
+	}
+
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello2.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,49 @@
+import samer.core.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.universe.*; 
+import com.sun.j3d.utils.geometry.ColorCube;
+
+public class hello2 
+{
+	public static void main(String[] args)
+	{
+		new samer.core.shells.SwingShell();
+		run();
+	}
+	
+		
+	public static void run()
+	{
+		BranchGroup	root=new BranchGroup();
+		Transform3D xform=new Transform3D();
+		Transform3D axis=new Transform3D();
+
+		axis.set(new Vector3d(0.5,0,0));
+
+		TransformGroup tg = new TransformGroup(xform);
+
+		Alpha alpha = new Alpha(-1, 4000);
+		Behavior rotator = new RotationInterpolator(alpha, tg, axis, 0f, (float)(2*Math.PI));
+
+		rotator.setSchedulingBounds(new BoundingSphere());
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+		tg.addChild(rotator);
+		tg.addChild(new ColorCube(0.5));
+
+		root.addChild(tg);
+		root.compile();
+
+		Canvas3D canvas=new Canvas3D(null);
+		SimpleUniverse U = new SimpleUniverse(canvas);
+        U.getViewingPlatform().setNominalViewingTransform();
+		U.addBranchGraph(root);
+
+		Shell.Window win;
+		win=Shell.getWindow("hello");
+		win.addWindowListener(Shell.exitListener());
+		win.container().setLayout(new java.awt.BorderLayout());
+		win.container().add(canvas);
+		win.expose();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello3.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,64 @@
+import samer.core.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.universe.*; 
+import com.sun.j3d.utils.behaviors.keyboard.*;
+
+public class hello3 extends util
+{
+	BranchGroup	root=new BranchGroup();
+	Bounds		bounds=new BoundingSphere();
+	Canvas3D	canvas=new Canvas3D(null);
+
+	public static void main(String[] args)
+	{
+		new samer.core.shells.AppShell(args);
+		hello3 app=new hello3();
+
+		Shell.Window win;
+		win=Shell.getWindow("hello");
+		win.addWindowListener(Shell.exitListener());
+		win.container().setLayout(new java.awt.BorderLayout());
+		win.container().add(app.canvas);
+		win.expose();
+	}
+
+	public hello3()
+	{		
+		SimpleUniverse U = new SimpleUniverse(canvas);
+		TransformGroup	tg = new TransformGroup();
+
+		addRotator(tg);
+		addBackground(root,new Background(0.1f,0.2f,0.15f));
+		tg.addChild(createObject());
+		root.addChild(tg);
+
+        KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(
+                       U.getViewingPlatform().getViewPlatformTransform());
+        keyNavBeh.setSchedulingBounds(bounds);
+        root.addChild(keyNavBeh);
+		root.compile();
+
+        U.getViewingPlatform().setNominalViewingTransform();
+		U.addBranchGraph(root);
+	}
+
+	public static Group createObject()
+	{
+		Shape3D		faces=new Shape3D();
+		Shape3D		edges=new Shape3D();
+		Geometry	geom=yoyoGeometryInfo(20).getGeometryArray();
+
+		faces.setGeometry(geom);
+		edges.setGeometry(geom);
+
+		faces.setAppearance(translucent());
+		edges.setAppearance(pointy());
+		
+		BranchGroup bg = new BranchGroup();
+		bg.addChild(faces);
+		bg.addChild(edges);
+
+		return bg;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello4.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,57 @@
+import samer.core.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.universe.*; 
+import com.sun.j3d.utils.behaviors.keyboard.*;
+
+public class hello4 extends util implements Agent
+{
+	BranchGroup	root=new BranchGroup();
+	Canvas3D	canvas=new Canvas3D(null);
+
+	public static void main(String[] args)
+	{
+		init();
+		expose((new hello4()).canvas,"hello");
+	}
+
+	public hello4()
+	{		
+		canvas=new Canvas3D(getGraphicsConfiguration());
+
+		Shell.print("stereo? "+ canvas.getStereoAvailable());
+		Shell.print("antialiasing? "+ canvas.getSceneAntialiasingAvailable());
+		// canvas.stopRenderer();
+
+		SimpleUniverse U = new SimpleUniverse(canvas);
+		TransformGroup	tg = new TransformGroup();
+
+		addRotator(tg);
+		addKeyNavigator(tg,U.getViewingPlatform().getViewPlatformTransform());
+		addBackground(root,new Background(0.1f,0.2f,0.15f));
+
+		Transform3D shrink=new Transform3D();
+		shrink.setScale(0.6);
+		TransformGroup sg=new TransformGroup(shrink);
+		tg.addChild(sg);
+		sg.addChild(yoyoGroup());
+		root.addChild(tg);
+
+		root.compile();
+
+        U.getViewingPlatform().setNominalViewingTransform();
+		U.addBranchGraph(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+
+		//setViewPolicy(canvas.getView());
+	}
+
+	public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
+	public void execute(String cmd, Environment env) {
+		if (cmd.equals("start")) { canvas.startRenderer(); }
+		else if (cmd.equals("stop")) { canvas.stopRenderer(); }
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello5.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,81 @@
+/*
+		hello5.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+		
+ */
+
+import samer.core.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello5 extends util implements Agent
+{
+	Canvas3D canvas;
+
+	public static void main(String[] args) { init(); new hello5(); }
+
+	public hello5()
+	{		
+		// create universe
+		LocalUniverse	U=new LocalUniverse();
+		BranchGroup		root=new BranchGroup();
+
+		// create scene
+		root.addChild(createSceneGraph());
+		// addBackground(root,new Background(0.1f,0.2f,0.15f));
+		// addLights(root);
+
+		// create view bits
+		canvas=new Canvas3D(getGraphicsConfiguration());
+		
+		TransformGroup	VT=new TransformGroup();
+		ViewPlatform	VP=new ViewPlatform();
+		View			V=new View();
+
+		{
+			Transform3D		t=new Transform3D();
+			t.set(new Vector3d(0.0,0.0,8.0));
+			VT.setTransform(t);
+		}
+		
+		addKeyNavigator(VT,readwrite(VT));
+		VT.addChild(VP);
+		V.addCanvas3D(canvas);
+		V.attachViewPlatform(VP);
+		V.setPhysicalBody(new PhysicalBody());
+		V.setPhysicalEnvironment(new PhysicalEnvironment());
+
+		root.addChild(VT);
+		root.compile();
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+
+		// setViewPolicy(canvas.getView());
+		expose(canvas,"hello");
+		U.addGroup(root);
+	}
+
+	private static TransformGroup createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		r.rotX(Math.PI/2);
+		TransformGroup  t2=new TransformGroup(r);
+		t2.addChild(yoyoGroup());
+
+		TransformGroup	tg = new TransformGroup();
+		addRotator(tg);
+		tg.addChild(t2);
+		return tg;
+	}
+
+	public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
+	public void execute(String cmd, Environment env) {
+		if (cmd.equals("start")) { canvas.startRenderer(); }
+		else if (cmd.equals("stop")) { canvas.stopRenderer(); }
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello6.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,69 @@
+/*
+		hello6.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Now has dynamically creatable views.
+		Have to construct views on BranchGroups so they
+		can be added while universe is live?	
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello6 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	
+	public static void main(String[] arse) { init(); new hello6(); }
+
+	public hello6()
+	{		
+		// create scene
+		root.addChild(createSceneGraph());
+		// addBackground(root,new Background(0.1f,0.2f,0.15f));
+		// addLights(root);
+		root.addChild(new FPS(200));
+
+		root.addChild(new Viewer("view"));
+		root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("view");
+		r.setTarget(null); r.add("start").add("stop"); 
+	}
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) { 
+			root.addChild(new Viewer(X.string(env.datum("name"),"view")));
+		}
+	}
+
+	private static TransformGroup createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		r.rotX(Math.PI/2);
+		TransformGroup  t2=new TransformGroup(r);
+		t2.addChild(yoyoGroup());
+
+		TransformGroup	tg = new TransformGroup();
+		addRotator(tg);
+		tg.addChild(t2);
+		return tg;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello7.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,148 @@
+/*
+		hello7.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Now has dynamically creatable views all on the same
+		view platform. Left and right eye views available!
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+import samer.core.Node;
+
+public class hello7 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	ViewPlatform	VP=new ViewPlatform();
+	
+	public static void main(String[] arse) { init(); new hello7(); }
+
+	public hello7()
+	{		
+		// create scene
+		root.addChild(createSceneGraph());
+		// addBackground(root,new Background(0.1f,0.2f,0.15f));
+		// addLights(root);
+
+		{ // view platform placement			
+			TransformGroup	VT=new TransformGroup();
+			Transform3D		t=new Transform3D();
+
+			t.lookAt(new Point3d(0,16,20), new Point3d(0,0,0),new Vector3d(0,1,0));
+			t.invert();
+			VT.setTransform(t);
+
+			// !!! all key navigators seem to be slaved!			
+			addKeyNavigator(VT,readwrite(VT));
+			VT.addChild(VP);
+			root.addChild(VT);
+		}
+		// setCapability(ALLOW_DETACH);
+		// setCapability(ALLOW_CHILDREN_WRITE);
+		// compile();
+
+
+		// add two  Views on same platform
+		new view("left",VP);
+		new view("right",VP);
+
+		// root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		// root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("view");
+		r.setTarget(null); r.add("start").add("stop"); 
+	}
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) { 
+			new view(X.string(env.datum("name"),"view"),VP);
+		}
+	}
+
+	private static TransformGroup createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		// r.rotX(Math.PI/2);
+		TransformGroup  t2=new TransformGroup(r);
+		t2.addChild(yoyoGroup());
+
+		TransformGroup	tg = new TransformGroup();
+		addRotator(tg);
+		tg.addChild(t2);
+		return tg;
+	}
+
+	public class view extends View implements Agent
+	{
+		Node			node;
+		Canvas3D		canvas;
+		Shell.Window	win;
+
+		public view(String name, ViewPlatform VP)
+		{
+			node = new Node(name);
+			Shell.push(node);
+
+			// create view bits
+			canvas=new Canvas3D(getGraphicsConfiguration());
+			//if (name.equals("left")) canvas.setMonoscopicViewPolicy(Canvas3D.LEFT_EYE);
+			//else if (name.equals("right")) canvas.setMonoscopicViewPolicy(Canvas3D.RIGHT_EYE);
+
+			addCanvas3D(canvas);
+			setPhysicalBody(new PhysicalBody());
+			setPhysicalEnvironment(new PhysicalEnvironment());
+			setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW);
+			//setWindowResizePolicy(View.VIRTUAL_WORLD);
+			setFrontClipDistance(Shell.getDouble("front",1));
+			setBackClipDistance(Shell.getDouble("back",10));
+
+			if (name.equals("left")) setMonoscopicViewPolicy(LEFT_EYE_VIEW);
+			else if (name.equals("right")) setMonoscopicViewPolicy(RIGHT_EYE_VIEW);
+
+			attachViewPlatform(VP);
+
+			Shell.pop();
+
+			win=Shell.getWindow(name);
+			win.container().add(canvas);
+			win.expose();
+			win.addWindowListener(new WindowAdapter() {
+				public void windowClosing(WindowEvent e) { dispose(); }	
+			});
+
+			Shell.registerAgent(this);
+		}
+
+		public void dispose() 
+		{
+			// stopView();
+			Shell.deregisterAgent(this);
+			win.dispose(); 
+		}						
+
+		protected void finalize() { Shell.trace("finalizing view "+this); }
+
+		public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
+		public void execute(String cmd, Environment env) {
+			if (cmd.equals("start")) { startView(); }
+			else if (cmd.equals("stop")) { stopView(); }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello8.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,149 @@
+/*
+		hello8.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Stereo pairs using 2 views in one window
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+public class hello8 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	ViewPlatform	VP=new ViewPlatform();
+	
+	public static void main(String[] arse) { init(); new hello8(); }
+
+	public hello8()
+	{		
+		// create scene
+		root.addChild(createSceneGraph());
+		// addBackground(root,new Background(0.1f,0.2f,0.15f));
+		// addLights(root);
+
+		{ // view platform placement			
+			TransformGroup	VT=new TransformGroup();
+			Transform3D		t=new Transform3D();
+
+			t.lookAt(new Point3d(0,16,20), new Point3d(0,0,0),new Vector3d(0,1,0));
+			t.invert();
+			VT.setTransform(t);
+
+			// !!! all key navigators seem to be slaved!			
+			addKeyNavigator(VT,readwrite(VT));
+			VT.addChild(VP);
+			root.addChild(VT);
+		}
+		// setCapability(ALLOW_DETACH);
+		// setCapability(ALLOW_CHILDREN_WRITE);
+		// compile();
+
+
+		// add two  Views on same platform
+		new stereoview(VP);
+
+		// root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		// root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("view");
+		r.setTarget(null); r.add("start").add("stop"); 
+	}
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) new stereoview(VP); 
+	}
+
+	private static TransformGroup createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		// r.rotX(Math.PI/2);
+		// r.setScale(0.5);
+		TransformGroup  t2=new TransformGroup(r);
+		t2.addChild(yoyoGroup());
+
+		TransformGroup	tg = new TransformGroup();
+		addRotator(tg);
+		tg.addChild(t2);
+		return tg;
+	}
+
+	class stereoview  implements Agent 
+	{
+		eyeview			left,right;
+		Shell.Window	win;
+
+
+		public stereoview(ViewPlatform VP)
+		{
+			left=new eyeview(VP);
+			right=new eyeview(VP);
+
+			left.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW);
+			right.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW);
+
+			win=Shell.getWindow("stereo");
+			win.container().setLayout(new GridLayout(1,2));
+			win.container().add(right.canvas);
+			win.container().add(left.canvas);
+			win.expose();
+			win.addWindowListener(new WindowAdapter() {
+				public void windowClosing(WindowEvent e) { dispose(); }	
+			});
+
+			Shell.registerAgent(this);
+		}
+
+		public void dispose() 
+		{
+			Shell.deregisterAgent(this);
+			win.dispose(); 
+		}						
+
+		protected void finalize() { Shell.trace("finalizing view "+this); }
+
+		public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
+		public void execute(String cmd, Environment env) {
+			if (cmd.equals("start")) { left.startView(); right.startView(); }
+			else if (cmd.equals("stop")) { left.stopView(); right.stopView(); }
+		}
+	}
+
+	public class eyeview extends View
+	{
+		Canvas3D		canvas;
+
+		public eyeview(ViewPlatform VP)
+		{
+ 			// create view bits
+			canvas=new Canvas3D(getGraphicsConfiguration());
+
+			addCanvas3D(canvas);
+			setPhysicalBody(new PhysicalBody());
+			setPhysicalEnvironment(new PhysicalEnvironment());
+			setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW);
+			// setWindowResizePolicy(View.VIRTUAL_WORLD);
+			// setWindowMovementPolicy(View.VIRTUAL_WORLD);
+			setFrontClipDistance(0.1);
+			setBackClipDistance(20);
+			attachViewPlatform(VP);
+		}
+ 	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/hello9.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,97 @@
+/*
+		hello9.java
+
+		Construct universe without using SimpleUniverse 
+		utility class - this puts together the view
+		group explicitly.
+
+		Shading
+ */
+
+import samer.core.*;
+import java.awt.event.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.geometry.*;
+
+public class hello9 extends util implements Agent
+{
+	// create universe
+	LocalUniverse	U=new LocalUniverse();
+	BranchGroup		root=new BranchGroup();
+	
+	public static void main(String[] arse) { init(); new hello9(); }
+
+	public hello9()
+	{		
+		// create scene
+		// root.addChild(pointLight(2,2,2,new Color3f(1f,1f,1f)));
+		root.addChild(color(pointLight(0,1,0),new Color3f(.2f,.1f,0.1f)));
+		root.addChild(directionalLight(6,-1,4));
+		root.addChild(ambientLight());
+
+		root.addChild(createSceneGraph());
+		root.addChild(new Viewer("view"));
+		root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
+		root.setCapability(Group.ALLOW_CHILDREN_WRITE);
+		root.compile();
+		
+		U.addGroup(root);
+
+		Shell.registerAgent(this);
+		Shell.exposeCommands(this);
+	}
+
+	private static Group createSceneGraph()
+	{
+		Transform3D		r=new Transform3D();
+		r.rotX(1.1);
+		r.setScale(0.5);
+
+		TransformGroup  t2=new TransformGroup(r);
+		GeometryInfo gi=yoyoGeometryInfo(32);
+		new NormalGenerator().generateNormals(gi);
+
+		Geometry g=gi.getGeometryArray();
+		Shape3D faces=new Shape3D();
+		Shape3D edges=new Shape3D();
+		faces.setGeometry(g); faces.setAppearance(material1()); 
+		edges.setGeometry(g); edges.setAppearance(shadedwireframe());
+
+		TransformGroup	tg = new TransformGroup();
+		addRotator(tg);
+		t2.addChild(faces);
+		t2.addChild(edges);
+		tg.addChild(t2);
+
+		return tg;
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("view").add("axis");
+		r.setTarget(null); 
+		r.add("start").add("stop"); 
+	}
+
+	public void execute(String cmd, Environment env) throws Exception
+	{
+		if (cmd.equals("view")) { 
+			root.addChild(new Viewer(X.string(env.datum("name"),"view")));
+		} else if (cmd.equals("axis")) {
+			Transform3D t3d=new Transform3D();
+			t3d.set(0.5);
+
+			TransformGroup tg=new TransformGroup(t3d);
+			BranchGroup bg=new BranchGroup();
+			Axis axis=new Axis();
+
+			axis.setAppearance(wireframe1());
+			tg.addChild(axis);
+			bg.addChild(tg);
+			bg.compile();
+			root.addChild(bg);
+		}
+
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/java3d/util.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,387 @@
+import samer.core.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+//import com.sun.j3d.utils.universe.*; 
+import com.sun.j3d.utils.behaviors.keyboard.*;
+import com.sun.j3d.utils.behaviors.mouse.*;
+import com.sun.j3d.utils.geometry.*;
+
+public class util
+{
+	private static Bounds bounds=new BoundingSphere(new Point3d(0,0,0),1000);
+
+	public static void init() { new samer.core.shells.AppShell(); }
+	public static void expose(java.awt.Component c,String title) {
+		Shell.Window win;
+		win=Shell.getWindow(title);
+		win.addWindowListener(Shell.exitListener());
+		win.container().setLayout(new BorderLayout());
+		win.container().add(c);
+		win.expose();
+	}
+
+	public static void setBounds(Bounds b) { bounds=b; }
+
+	public static TransformGroup mouseRotate(TransformGroup tg)
+	{
+        MouseRotate m = new MouseRotate(readwrite(tg));
+        // mr.setTransformGroup(tg);
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static TransformGroup mouseTranslate(TransformGroup tg)
+	{
+        MouseTranslate m = new MouseTranslate(readwrite(tg));
+        // mr.setTransformGroup(tg);
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static TransformGroup mouseZoom(TransformGroup tg)
+	{
+        MouseZoom m = new MouseZoom(readwrite(tg));
+        // mr.setTransformGroup(tg);
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static void addKeyNavigator(Group g, TransformGroup tg)
+	{
+		// readwrite(tg);
+        KeyNavigatorBehavior keynav = new KeyNavigatorBehavior(tg);
+        keynav.setSchedulingBounds(bounds);
+        g.addChild(keynav);
+	}
+
+	public static void addKeyNavigator(Component c, Group g, TransformGroup tg)
+	{
+		// readwrite(tg);
+        KeyNavigatorBehavior keynav = new KeyNavigatorBehavior(c,tg);
+        keynav.setSchedulingBounds(bounds);
+        g.addChild(keynav);
+	}
+
+	public static GeometryInfo yoyoGeometryInfo(int N)
+	{
+		GeometryInfo gi=new GeometryInfo(GeometryInfo.TRIANGLE_FAN_ARRAY);
+
+		int     totalN = 4*(N+1);
+		Point3f coords[] = new Point3f[totalN];
+		int     stripCounts[] = {N+1, N+1, N+1, N+1};
+		float   r = 0.5f;
+		float   w = 0.5f;
+		int     n;
+		double  a;
+		float   x, y;
+
+		// set the central points for four triangle fan strips
+		coords[0*(N+1)] = new Point3f(0.0f, 0.0f, w);
+		coords[1*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f);
+		coords[2*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f);
+		coords[3*(N+1)] = new Point3f(0.0f, 0.0f, -w);
+
+		for(a = 0,n = 0; n < N; a = 2.0*Math.PI/(N-1) * ++n){
+			x = (float) (r * Math.cos(a));
+			y = (float) (r * Math.sin(a));
+			coords[0*(N+1)+n+1] = new Point3f(x, y, w);
+			coords[1*(N+1)+N-n] = new Point3f(x, y, w);
+			coords[2*(N+1)+n+1] = new Point3f(x, y, -w);
+			coords[3*(N+1)+N-n] = new Point3f(x, y, -w);
+		}
+
+		gi.setCoordinates(coords);
+		gi.setStripCounts(stripCounts);
+
+		return gi;
+
+	} 
+
+	public static void addRotator(TransformGroup tg)
+	{
+		Alpha alpha = new Alpha(-1, 24000);
+		Behavior rotator = new RotationInterpolator(alpha, writable(tg));
+		rotator.setSchedulingBounds(bounds);
+		tg.addChild(rotator);
+	}
+
+	public static Light color(Light l, Color3f c) { l.setColor(c); return l; }
+	public static Light directionalLight(double x, double y, double z)
+	{
+        DirectionalLight l = new DirectionalLight();
+		l.setDirection(-(float)x,-(float)y,-(float)z);
+        l.setInfluencingBounds(bounds);
+		return l;
+	}
+
+	public static Light ambientLight() 
+	{
+        AmbientLight a = new AmbientLight();
+        a.setInfluencingBounds(bounds);
+		return a;
+	}
+
+	public static Light pointLight(double x, double y, double z)
+	{
+        PointLight l = new PointLight();
+        l.setInfluencingBounds(bounds);
+		l.setPosition((float)x,(float)y,(float)z);
+		l.setAttenuation(0,0,1);
+		return l;
+	}
+
+	public static void addBackground(Group g, Background bg)
+	{	// background
+		bg.setApplicationBounds(bounds);
+		g.addChild(bg);
+	}
+
+	public static View setViewPolicy(View v)
+	{
+		v.setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW);
+		//v.setWindowMovementPolicy(View.VIRTUAL_WORLD);
+		v.setWindowResizePolicy(View.VIRTUAL_WORLD);
+		//v.repaint();
+		return v;
+	}
+
+	public static ViewPlatform writable(ViewPlatform vp) {
+        vp.setCapability(ViewPlatform.ALLOW_POLICY_WRITE); return vp; 
+	}
+	public static TransformGroup writable(TransformGroup tg) {
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); return tg; 
+	}
+	public static TransformGroup readwrite(TransformGroup tg) {
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); 
+		return tg; 
+	}
+
+	public static Group yoyoGroup() { 
+		return yoyoGroup(yoyoGeometryInfo(17).getGeometryArray());
+	}
+	public static Group yoyoGroup(Geometry geom) {
+		return yoyoGroup(geom,wireframe2(),translucent());
+	}
+		
+	public static Group yoyoGroup(Geometry geom, Appearance a1, Appearance a2)
+	{
+		Shape3D		faces=new Shape3D();
+		Shape3D		edges=new Shape3D();
+
+		faces.setGeometry(geom);
+		faces.setAppearance(a1);
+		edges.setGeometry(geom);
+		edges.setAppearance(a2);
+		
+		BranchGroup bg = new BranchGroup();
+		bg.addChild(faces);
+		bg.addChild(edges);
+
+		return bg;
+	}
+
+	public static GraphicsConfiguration getGraphicsConfiguration()
+	{
+/*
+        return GraphicsEnvironment.getLocalGraphicsEnvironment().
+                getDefaultScreenDevice().getDefaultConfiguration();
+		
+*/		
+		// Canvas default seems to be better than above
+		return null;
+		
+	}
+
+    static Appearance material1() 
+	{
+        Appearance a = new Appearance();
+        PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setPolygonOffset(2f);
+        a.setPolygonAttributes(polyAttrib);
+
+        Material material = new Material();
+        material.setDiffuseColor(new Color3f(.6f, 0.5f, 0.7f));
+        material.setSpecularColor(new Color3f(.6f, 0.5f, 0.7f));
+		material.setShininess(48);
+        a.setMaterial(material);
+        return a;
+    }
+
+
+    static Appearance shadedwireframe() 
+	{
+        Appearance a = new Appearance();
+        PolygonAttributes polyAttrib = new PolygonAttributes();
+        polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+        a.setPolygonAttributes(polyAttrib);
+		a.setLineAttributes(new LineAttributes(2f,LineAttributes.PATTERN_SOLID,false));
+
+        Material material = new Material();
+        material.setDiffuseColor(new Color3f(.7f, 0.6f, 0.9f));
+		material.setShininess(128);
+        a.setMaterial(material);
+        return a;
+    }
+
+
+	static Appearance translucent() 
+	{		
+		Appearance a = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		a.setPolygonAttributes(polyAttrib);
+
+		{
+			boolean ft=Shell.getBoolean("yoyo.facetransparency",true);
+			if (ft) {
+				a.setTransparencyAttributes(
+					new TransparencyAttributes(TransparencyAttributes.BLENDED,0.2f)
+				);
+				colorAttrib.setColor(0.45f,0.4f,.5f);
+			} else {
+				polyAttrib.setPolygonOffset(2f);
+				colorAttrib.setColor(0.5f,0.4f,.5f);
+			}
+		}
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+    static Appearance wireframe1()
+	{
+
+        Appearance a = new Appearance();
+        PolygonAttributes polyAttrib = new PolygonAttributes();
+        polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+		if (!Shell.getBoolean("yoyo.bfacecull",false)) {
+			polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
+		}
+		a.setLineAttributes(
+			new LineAttributes((float)Shell.getDouble("yoyo.linewidth",1),
+						LineAttributes.PATTERN_SOLID,true));
+        a.setPolygonAttributes(polyAttrib);
+        ColoringAttributes redColoring = new ColoringAttributes();
+        redColoring.setColor(.6f, 0.4f, 0.5f);
+        a.setColoringAttributes(redColoring);
+		a.setTransparencyAttributes(
+			new TransparencyAttributes(TransparencyAttributes.BLENDED,0.4f));
+
+        return a;
+    }
+
+	static Appearance wireframe2()
+	{
+		Appearance appearance1 = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setPolygonMode(
+			Shell.getBoolean("yoyo.points",true) ?
+				PolygonAttributes.POLYGON_POINT :
+				PolygonAttributes.POLYGON_LINE
+
+		);
+		if (!Shell.getBoolean("yoyo.bfacecull",false)) {
+			polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
+		}
+	
+		appearance1.setPolygonAttributes(polyAttrib);
+		appearance1.setPointAttributes(
+			new PointAttributes((float)Shell.getDouble("yoyo.pointsize",2), false));
+		appearance1.setLineAttributes(
+			new LineAttributes((float)Shell.getDouble("yoyo.linewidth",1),
+						LineAttributes.PATTERN_SOLID,true));
+		appearance1.setTransparencyAttributes(
+			new TransparencyAttributes(TransparencyAttributes.BLENDED,0.7f));
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setColor(0.8f,0.6f,1f);
+		appearance1.setColoringAttributes(colorAttrib);
+		return appearance1;
+	}
+
+	static Appearance wireframe3()
+	{
+		Appearance appearance1 = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setPolygonMode(
+			Shell.getBoolean("yoyo.points",true) ?
+				PolygonAttributes.POLYGON_POINT :
+				PolygonAttributes.POLYGON_LINE
+
+		);
+		if (!Shell.getBoolean("yoyo.bfacecull",false)) {
+			polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
+		}
+	
+		appearance1.setPolygonAttributes(polyAttrib);
+		appearance1.setPointAttributes(
+			new PointAttributes((float)Shell.getDouble("yoyo.pointsize",2), false));
+		appearance1.setLineAttributes(
+			new LineAttributes((float)Shell.getDouble("yoyo.linewidth",1),
+						LineAttributes.PATTERN_SOLID,true));
+		appearance1.setTransparencyAttributes(
+			new TransparencyAttributes(TransparencyAttributes.BLENDED,0.7f));
+
+        Material material = new Material();
+        material.setDiffuseColor(new Color3f(.8f, 0.6f, 1f));
+        appearance1.setMaterial(material);
+		return appearance1;
+	}
+
+	public static Appearance pointy()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes pa = new PolygonAttributes();
+		pa.setPolygonMode(PolygonAttributes.POLYGON_POINT);
+		pa.setCullFace(PolygonAttributes.CULL_NONE);
+		a.setPolygonAttributes(pa);
+		a.setPointAttributes(new PointAttributes(5,false));
+		a.setTransparencyAttributes(
+		new TransparencyAttributes(TransparencyAttributes.BLENDED,0.8f));
+/*
+			new TransparencyAttributes(
+				TransparencyAttributes.BLENDED,0.9f,
+				TransparencyAttributes.BLEND_SRC_ALPHA,
+				TransparencyAttributes.BLEND_ONE));
+*/
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setColor(0.8f,0.6f,1f);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+	public static Appearance pointy2()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes pa = new PolygonAttributes();
+		pa.setPolygonMode(PolygonAttributes.POLYGON_POINT);
+		pa.setCullFace(PolygonAttributes.CULL_NONE);
+		a.setPolygonAttributes(pa);
+		a.setPointAttributes(new PointAttributes(3,false));
+		a.setTransparencyAttributes(
+			new TransparencyAttributes(TransparencyAttributes.BLENDED,0.7f));
+
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setColor(0.8f,0.6f,1f);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+	public static Appearance pointy3()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes pa = new PolygonAttributes();
+		pa.setPolygonMode(PolygonAttributes.POLYGON_POINT);
+		pa.setCullFace(PolygonAttributes.CULL_NONE);
+		a.setPolygonAttributes(pa);
+		a.setPointAttributes(new PointAttributes(3,false));
+
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setColor(0.8f,0.6f,1f);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/maths/GaussianForm.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,29 @@
+package eg.maths;
+import  samer.core.*;
+import  samer.maths.*;
+
+public class GaussianForm extends QuadraticForm
+{
+	public GaussianForm() { super(); }
+	public GaussianForm(int n) { super(n); }
+
+	public double apply(double [] x) { 
+		return -Math.exp(super.apply(x));
+	}
+
+	public VectorFunctionOfVector derivative() 
+	{	
+		return new VectorFunctionOfVector() {
+			public void apply(double [] x) {
+				double z=GaussianForm.this.apply(x);
+				Mathx.copy(y,x);
+				Mathx.mul(x,-z);			
+			}
+			public void apply(double [] x, double [] v) {
+				double z=GaussianForm.this.apply(x);
+				Mathx.copy(y,v);
+				Mathx.mul(v,-z);
+			}
+		};
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/maths/Inf.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,9 @@
+import samer.core.*;
+
+public class Inf {
+	public static void test() {
+		double x=Math.log(0);
+		int n=(int)x;
+		Shell.print("x="+x+", n="+n);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/maths/Optimizer.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,68 @@
+package eg.maths;
+import  samer.core.*;
+import  samer.core.types.*;
+import  samer.maths.*;
+import  samer.maths.opt.*;
+import  samer.nn.nonlin.*;
+
+public class Optimizer implements Agent
+{
+	Node     node=Node.push(new Node("optimizer"));
+	Function fn;
+	VDouble	a = new VDouble("a",-1);
+	VDouble	b = new VDouble("b",0);
+	VDouble	c = new VDouble("c",1);
+
+	MinimumBracket	br = new MinimumBracket();
+	BrentMinimiser min = new BrentMinimiser();
+
+	public Optimizer()
+	{
+		Object obj = (Function)Space.get("function");
+		if (obj==null) {
+			fn = new CompoundFunction( new Square(), new Quadratic(1,0,-1));
+		} else {
+			if (obj instanceof Function) fn=(Function)obj;
+			else if (obj instanceof FunctionOfVector) {
+				FunctionOfVector vfn=(FunctionOfVector)obj;
+				VVector x = (VVector)Space.get("vector");
+				VVector d = new VVector("d",x.size());
+				LineFunction linefn = new LineFunction(vfn,x.size());
+				linefn.setBase(x.array());
+				linefn.setDirection(d.array());
+				fn=linefn;
+			}
+		}
+
+		br.setFunction(fn);
+		min.setFunction(fn);
+		min.setFractionalTolerance(0.0001);
+		min.setAbsoluteTolerance(0.0001);
+		min.setBracket(br);
+
+		Shell.showViewer(new FunctionPlotter( node, fn), "Function");
+		Shell.showViewer(new FunctionPlotter( node, fn.derivative()), "Derivative");
+		Shell.exposeCommands(this);
+		Shell.exposeViewables();
+	}
+
+	public void getCommands(Agent.Registry r) { 
+		r.add("bracket").add("minimise"); 
+	}
+
+	public void execute(String cmd, Environment env)
+	{ 
+		if (cmd.equals("bracket")) {
+			br.setInitialPoints(a.value,b.value);
+			br.run();
+			a.value = br.ax; a.changed();
+			b.value = br.bx; b.changed();
+			c.value = br.cx; c.changed();
+		} else if (cmd.equals("minimise")) {
+			min.run();
+			Shell.print("minimum at x="+min.getArgument());
+			Shell.print("function value f(x)="+min.getValue());
+			Shell.print("took "+min.getIterations()+" iterations");
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/maths/QuadraticForm.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,47 @@
+package eg.maths;
+import  samer.core.*;
+import  samer.maths.*;
+import  samer.maths.ops.*;
+
+public class QuadraticForm extends FunctionOfVector
+{
+	VVector				x, yy;
+	Matrix				A;
+	MatrixTimesVector	Ax;
+	double []			y;
+
+	public QuadraticForm() { this(Shell.getInt("dimensions",2)); }
+	public QuadraticForm(int n) 
+	{
+		x = new VVector("x",n);
+		yy = new VVector("y",n);
+		A = new  Matrix("A",n,n);
+		Ax = new MatrixTimesVector(yy.array(),A);
+		y = yy.array();
+
+		Shell.put("functionOfVector",this);
+		Shell.put("vector",x);
+	}
+
+	public double apply(double [] x) 
+	{ 
+		Ax.run(x); 
+		return -0.5*Mathx.dot(x,y);
+	}
+
+	public VectorFunctionOfVector derivative() 
+	{	
+		return new VectorFunctionOfVector() {
+
+			public void apply(double [] x) {
+				Ax.run(x);
+				Mathx.copy(y,x);
+			}
+
+			public void apply(double [] x, double [] v) {
+				Ax.run(x);
+				Mathx.copy(y,v);
+			}
+		};
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/mds/args	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,41 @@
+#properties
+#Sun Jul 17 19:37:00 BST 2011
+oz.ymap.maximum=1.0
+D.rowcolumn.editor.plotter.window.bounds=(155,507,156,142)
+block.spring=100.0
+Py.editor.plotter.window.bounds=(584,320,235,104)
+exposed.bounds=(4,24,286,510)
+mds.stress.trace.window.bounds=(477,170,410,128)
+d.plotter.window.bounds=(493,497,440,116)
+P.image.window.bounds=(375,26,76,165)
+mds.rate=1.0E-4
+Px.editor.plotter.window.bounds=(592,221,228,95)
+hybrid.derivative.plotter.window.bounds=(0,22,240,142)
+s.plotter.window.bounds=(0,22,189,93)
+y-map.bounds=(468,238,235,131)
+s.editor.image.window.bounds=(635,240,220,78)
+oz.background=(0 0 0)
+regulator.target=170.0
+block.damping=20.0
+oz.xmap.maximum=1.0
+console.frame.bounds=(393,74,254,71)
+P.editor.window.bounds=(459,186,53,176)
+ball.damping=10.0
+mds.stress.trace.map.symmetric=false
+D.image.window.bounds=(302,25,138,161)
+mds.stress.trace.map.minimum=-0.0
+D.image.map.maximum=3.754
+D.editor.window.bounds=(363,46,166,192)
+oz.ymap.symmetric=true
+mds.stress.trace.map.maximum=10.0
+x-map.bounds=(476,378,235,131)
+Tasks.bounds=(460,70,158,167)
+P.rowcolumn.editor.plotter.window.bounds=(587,339,221,104)
+alpha=0.7
+ball.spring=100.0
+D.file=D1
+hybrid.plotter.window.bounds=(502,223,450,329)
+ball.gravity=40.0
+regulated=true
+Oz.bounds=(289,203,216,212)
+oz.xmap.symmetric=true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/mds/mds.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,37 @@
+(import "samer.mds.*")
+
+(put "colormap" (redgreen))
+(put "oz.background" (Color. 0 0 0))
+
+(define N 16)
+(define D (Matrix. "D" N N))
+(define P (Matrix. "P" N 4))
+(define s (VVector. "s" N))
+(Mathx.set (.array s) (Constant. 0.5))
+
+;(MatrixBall.setBallSize 16 16)
+(define mds (MDS. P))
+(addtasks 
+	(CovarianceTask. mds D)
+	mds
+)
+(.setDimensionality mds 2)
+(expose)
+
+(define gauss (samer.maths.random.NormalisedGaussian.))
+(define uniform (samer.maths.random.Uniform.))
+(define raleigh (samer.maths.random.Raleigh.))
+(define (rndP) (.set P gauss) (.changed P))
+(define (rndD) (.set D uniform) (.changed D))
+
+;(matexec D "load")
+(matexec D "image")
+;(.setColumn (RowColumn. (Node. "Px") P) 0)
+;(.setColumn (RowColumn. (Node. "Py") P) 1)
+(rndD)
+(rndP)
+
+(define oz (node "oz" (MatrixPointViewer2. P s)))
+(expose oz "Oz")
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/mds/mds2.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,37 @@
+(import "samer.mds.*")
+
+(tasks)
+(put "colormap" (redgreen))
+(put "oz.background" Color.black$)
+(define R (Matrix. "R" 512 512))
+(define P (Matrix. "P" 512 6))
+(define mds (MDS2. R P))
+(.setDimensionality mds 2)
+(.linkAll mds)
+(addtask mds)
+
+;(matexec P "load")
+;(matexec R "load")
+(.timesEquals R 0.5)
+
+(define (make-vwr)
+	(define vwr (node "oz" (MatrixPointViewer. P)))
+	(Shell.expose vwr "Oz")
+	vwr)
+
+(define (make-vwr2 x)
+	(define vwr (node "oz" (MatrixPointViewer2. P x)))
+	(Shell.expose vwr "Oz")
+	vwr)
+
+(make-vwr)	
+;(MatrixBall.setBallSize 6 6)
+;(MatrixBall.drawMarker (MatrixBall.getImage) Color.white$ 0.4f)
+
+
+(define gauss (samer.maths.random.NormalisedGaussian.))
+(define (rnd) (.set P gauss) (.changed P))
+
+(expose)
+
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/args	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,38 @@
+#properties
+#Tue Mar 26 17:20:08 GMT 2019
+mouse.y.trace.map.minimum=-0.0
+ft.power.plotter.window.bounds=(323,142,512,118)
+mouse.x.trace.map.symmetric=false
+x.editor.plotter.window.bounds=(490,234,231,110)
+scaler.scale.meter.map.maximum=6370.513
+exposed.bounds=(48,23,286,653)
+mouse.exposed.bounds=(448,59,223,119)
+ft.power.trace.map.minimum=0.001
+mouse.y.trace.map.maximum=400.0
+waveform.plotter.window.bounds=(4,22,1020,118)
+mouse.y.trace.window.bounds=(694,148,264,86)
+waveform.scaler.laplace.e.plotter.window.bounds=(4,22,1024,118)
+playlist.files='("/Users/samer/Music/Artists/Tunng/comments on the inner chorus/01-Hanged.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/02-Woodcat.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/03-The Wind Up Bird.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/04-Red And Green.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/05-Stories.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/06-Jenny Again.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/07-Man In The Box.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/08-Jay Down.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/09-It's just because we've got hair.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/10-Sweet William.mp3" "/Users/samer/Music/Artists/Tunng/comments on the inner chorus/11-Engine Room.mp3")
+scaler.scale.trace.window.bounds=(336,430,256,86)
+trace.bounds=(493,106,264,86)
+scaler.E=2895.934
+ft.power.trace.map.maximum=60.0
+ft.power.trace.window.bounds=(405,22,256,534)
+mouse.x.trace.map.minimum=0.0
+waveform.scaler.scale=0.023
+scaler.output.plotter.window.bounds=(12,589,1020,118)
+mouse.x.trace.map.maximum=400.0
+mouse.y.trace.map.symmetric=false
+playlist.current=/Users/samer/Music/Onset_paper/UPFsamples/audio/RadioTarifa3.wav
+mouse.x.trace.window.bounds=(693,61,264,86)
+ft.power.image.window.bounds=(4,22,513,37)
+x1.plotter.window.bounds=(440,22,231,118)
+x1.editor.plotter.window.bounds=(419,160,289,121)
+ft.mag.plotter.window.bounds=(502,338,256,118)
+waveform.scaler.scaleRate=0.01
+scaler.scale.meter.map.symmetric=false
+scaler.E.trace.window.bounds=(304,24,338,111)
+mouse.canvas.bounds=(4,23,430,397)
+scaler.scaleRate=0.004
+x1.image.window.bounds=(290,279,197,71)
+scaler.scale=2974.602
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/meters.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,20 @@
+(load "filelist.scm")
+(load "lineout.scm")
+(load "audio.scm")
+(load "models.scm")
+(load "functions.scm")
+
+(put "scale.meter" #t)
+(put "E.meter" #t)
+(put "regulated" #f)
+(put "lineout.meter" #f)
+
+(tasks)
+(define f (linein (filesource) 1024 512))
+(define x (norm f))
+(define y (ft-power (ft-vec x)))
+
+;(set-playlist (ls "/Users/samer/Music/Classical/Bach/The Well Tempered Clavier/Book I/Gould/11kmono"))
+(lineout (linesnk (mono 11025)) (get "LineIn"))
+(expose)
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/mouse.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,8 @@
+(import "samer.core.util.swing.*")
+(import "samer.units.*")
+
+(define canvas (VCanvas.))
+(define mouse (MousePosition. canvas))
+(expose canvas "canvas")
+(expose)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/scope.props	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,13 @@
+#properties
+#Sat Mar 09 02:11:17 GMT 2002
+y.trace.map.maximum=1.0
+trace.scroll=true
+x.trace.window.bounds=(221,397,372,99)
+canvas.bounds=(0,0,481,371)
+x.trace.map.maximum=1.0
+y.trace.map.symmetric=true
+scroll=true
+trace.color=\#ffff00
+x.trace.map.symmetric=true
+exposed.bounds=(639,0,263,293)
+y.trace.window.bounds=(225,500,368,101)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/scope.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,40 @@
+(load "props.scm")
+
+(import "samer.core.types.*")
+
+(push-properties "scope.props")
+(put "canvas.background" Color.black$)
+(put "canvas.foreground" (Color. 60 220 120))
+(put "trace.background" Color.black$)
+
+(define C (node "canvas" (Plotter.)))
+(expose C "canvas")
+(.exposeMaps C)
+
+(define (oscillator nm freq)
+	(define o (Oscillator. freq))
+	(VParameter. nm (.getFrequencyModel o))
+;	(Product. (Constant. 256.0) o)
+	o
+)
+
+(tasks)
+
+(define x (VDouble. "x"))
+(define y (VDouble. "y"))
+
+(addtasks
+	(GenerateDouble. x (oscillator "fx" 0.1))
+	(GenerateDouble. y (oscillator "fy" 0.1))
+	(SilkTask.
+		(let ((P (.getPen C)))
+			(.moveto P 0 0)
+			(lambda ()
+				(.activate P)
+				(.line (.abs P (.value$ x) (.value$ y)))
+				(.move P)
+			)
+		))
+)
+
+(expose)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/misc/vtrace.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,32 @@
+(load "props.scm")
+
+(push-properties "scope.props")
+(put "trace.background" Color.black$)
+(put "trace.foreground" (Color. 60 220 150))
+(put "regulated" "true")
+
+(define (oscillator name f)
+	(define o (Oscillator. f))
+	(VParameter. name (.getFrequencyModel o))
+	o)
+
+(define (gradient-map c1 c2 n)
+	(define cramp (ColorRamp. n))
+	(.gradient cramp 0 c1 (- n 1) c2)
+	(.getColorModel cramp))
+
+(put "renderer" Renderer.LINE$)
+(put "colormap" (colormap 13
+		Color.red$ 		2 	Color.yellow$ 	4	Color.green$
+	6 	Color.cyan$	8 	Color.blue$ 	10	Color.magenta$
+	12	Color.red$))
+; _________________________________________
+
+(expose)
+
+(define x (VVector. "x" 8))
+(define pl (node "trace" (VectorTrace. x)))
+(addtask pl)
+(addtask (Ops.update x))
+(expose pl "trace")
+(exec x "plotter editor")
Binary file examples/misc/x.vector has changed
Binary file examples/sockets/obj has changed
--- a/examples/sockets/ostream.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sockets/ostream.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,12 +1,12 @@
 (load "sockets.scm")
 
 ;;; get a random vector
-(define v (VVector. "v" 8))
+(define v (samer.maths.VVector. "v" 8))
 (.next (samer.maths.random.NormalisedGaussian.) (.array v))
 
 ;;; write object to a file
 (define o (oostream (ofstream "obj")))
-(.writeObject o v)
+(.writeObject o (.getVec v))
 (.close o)
 
 ;;; read object back
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/sockets/recv.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,15 @@
+(load "sockets.scm")
+(load "filelist.scm")
+(load "models.scm")
+(load "audio.scm")
+
+(define S (make-server))
+(define x (norm (linein (filesource) 512 256)))
+(define s (VVector. "s" 512))
+(expose)
+(define sk (accept S))
+(addtask (send-vec sk x))
+
+(define th2 (RThread.))
+(.addTask th2 (recv-vec sk s)) 
+
--- a/examples/sockets/recv.silk	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-(load "sockets.scm")
-(load "sources.scm")
-
-(define S (make-server))
-(define x (norm (linein (filesource))))
-(define s (VVector. "s" 512))
-(expose)
-(define sk (accept S))
-(addtask (send-vec sk x))
-
-(define th2 (RThread.))
-(.addTask th2 (recv-vec sk s)) 
-
--- a/examples/sound/midi/args	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sound/midi/args	Fri Apr 05 16:26:00 2019 +0100
@@ -1,5 +1,5 @@
 #properties
-#Thu Jul 14 14:56:13 BST 2011
+#Tue Mar 26 13:47:55 GMT 2019
 p.slider.map.maximum=0.001
 decay.slider.map.maximum=0.700
 Tasks.bounds=(290,499,225,145)
@@ -9,7 +9,7 @@
 midisynth.file=midisynth
 matrix.rowcolumn.trace.window.bounds=(557,374,256,86)
 regulated=true
-matrix.rowcolumn.plotter.window.bounds=(264,345,242,115)
+matrix.rowcolumn.plotter.window.bounds=(267,585,242,115)
 out.plotter.window.bounds=(4,22,128,118)
 MidiSynthEditor.bounds=(281,201,308,231)
 matrix.rowcolumn.image.window.bounds=(514,242,229,78)
@@ -17,14 +17,14 @@
 plotter.type=2
 midisynth.offset=32
 matrix.rowcolumn.editor.image.window.bounds=(377,604,505,69)
-midisynth.bounds=(281,22,232,176)
+midisynth.bounds=(281,23,232,176)
+regulator.target=35.0
 out.image.window.bounds=(396,586,390,88)
-regulator.target=35.0
+matrix.editor.window.bounds=(607,23,551,549)
 midisynth.offset.bounds=(283,23,204,57)
-matrix.editor.window.bounds=(603,22,551,549)
 p.slider.map.minimum=2.357E-7
+exposed.bounds=(4,23,261,516)
 decay.slider.map.minimum=0.001
-exposed.bounds=(3,22,276,590)
 matrix.image.window.bounds=(255,51,161,202)
 decay=0.01
 midisynth.factor=80.0
--- a/examples/sound/midi/args.old	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sound/midi/args.old	Fri Apr 05 16:26:00 2019 +0100
@@ -1,5 +1,5 @@
 #properties
-#Thu Jul 14 14:56:12 BST 2011
+#Tue Mar 26 13:42:33 GMT 2019
 p.slider.map.maximum=0.001
 decay.slider.map.maximum=0.700
 Tasks.bounds=(290,499,225,145)
@@ -9,7 +9,7 @@
 midisynth.file=midisynth
 matrix.rowcolumn.trace.window.bounds=(557,374,256,86)
 regulated=true
-matrix.rowcolumn.plotter.window.bounds=(264,345,242,115)
+matrix.rowcolumn.plotter.window.bounds=(267,585,242,115)
 out.plotter.window.bounds=(4,22,128,118)
 MidiSynthEditor.bounds=(281,201,308,231)
 matrix.rowcolumn.image.window.bounds=(514,242,229,78)
@@ -17,14 +17,14 @@
 plotter.type=2
 midisynth.offset=32
 matrix.rowcolumn.editor.image.window.bounds=(377,604,505,69)
-midisynth.bounds=(281,22,232,176)
+midisynth.bounds=(281,23,232,176)
 out.image.window.bounds=(396,586,390,88)
 regulator.target=35.0
 midisynth.offset.bounds=(283,23,204,57)
-matrix.editor.window.bounds=(603,22,551,549)
+matrix.editor.window.bounds=(607,23,551,549)
 p.slider.map.minimum=2.357E-7
 decay.slider.map.minimum=0.001
-exposed.bounds=(3,22,276,590)
+exposed.bounds=(4,23,261,516)
 matrix.image.window.bounds=(255,51,161,202)
 decay=0.01
 midisynth.factor=80.0
--- a/examples/sound/midi/plinky.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sound/midi/plinky.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,4 +1,5 @@
 (load "midi.scm")
+(load "streams.scm")
 (import "samer.maths.random.*")
 
 (put "regulated" #t)
@@ -42,11 +43,12 @@
 )
 
 (define (load-file fn)
-	(let ((f (istream fn)))
+	(let ((f (ifstream fn)))
 		(.load matrix f)
 		(.close f)))
 
 (define (f1) (load-file "walking_zither2"))
 (define (f2) (load-file "walking_zither3"))
 (define (f3) (load-file "walking_zither4"))
-
+(expose)
+(expose synth)
--- a/examples/sound/midi/plinky.silk	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-(import "samer.maths.random.*")
-(load "color.silk")
-
-(put "regulated" #t)
-(put "colormap" (redgreen))
-(put "symmetric" #t)
-
-(tasks)
-
-(define N 64)
-(define M 64)
-
-(define matrix	(Matrix. "matrix" M N))
-(define out   	(VVector. "out" N))
-(define vgen  	(VGenerator. "gen"))
-(define rowcol	(RowColumn. matrix))
-(define decay 	(VDouble. "decay" 0.998))
-
-(.setGenerator vgen (Binary.))
-
-
-; program 46 is cool!
-; so are 10, 12, 111
-(define midiin (VVector. "midiin" 64))
-(define synth (MidiSynth. midiin))
-(define m 0)
-
-(addtasks
-	(sub 4 (task
-		(.timesEquals matrix (.value$ decay))
-		(.add matrix vgen)
-		(.changed matrix)
-	))
-
-	(Ops.transfer rowcol midiin)
-	(Ops.update midiin)
-	synth
-	(task
-		(.setRow rowcol m)
-		(set! m (if (< m (- M 1)) (+ m 1) 0))
-	)
-)
-
-
-(define (load-file fn) 
-	(let ((f (istream fn)))
-		(.load matrix f)
-		(.close f)))
-
-(define (f1) (load-file "walking_zither2"))		
-(define (f2) (load-file "walking_zither3"))		
-(define (f3) (load-file "walking_zither4"))		
-
-
-
-
--- a/examples/sound/sampled/args	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sound/sampled/args	Fri Apr 05 16:26:00 2019 +0100
@@ -1,5 +1,5 @@
 #properties
-#Thu Jul 14 14:15:19 BST 2011
+#Tue Mar 26 14:09:07 GMT 2019
 function.derivative.plotter.window.bounds=(375,357,426,239)
 sqrt.plotter.window.bounds=(0,0,208,122)
 waveform.image.cell.size=1
@@ -193,6 +193,7 @@
 mog.state.image.window.bounds=(470,885,419,91)
 signal.map.maximum=1.0
 spectrum.editor.image.window.bounds=(126,215,823,135)
+filessink.scale.bounds=(280,23,201,57)
 ica.learn.G.image.window.bounds=(916,91,264,278)
 scaler.scaleRate=-0.010
 subrate.factor=1
@@ -248,7 +249,7 @@
 logprior.strength=0.0
 audio.exposed.bounds=(980,190,229,372)
 ica.s.plotter.window.bounds=(151,296,264,118)
-exposed.bounds=(1,22,296,778)
+exposed.bounds=(4,23,238,64)
 noise=(Gaussian.)
 audio.offset=-507.6
 step=384
@@ -287,45 +288,45 @@
 waveform.plotter.map.maximum=36000.0
 russian.vodka.jelly=snoozy
 spectrum.trace.map.minimum=3.2E-5
+mat.image.window.bounds=(0,0,264,278)
+coder.learn.rate=0.16
 scaleNormaliser.scale.editor.plotter.window.bounds=(282,629,264,118)
-coder.learn.rate=0.16
-mat.image.window.bounds=(0,0,264,278)
 e.trace.window.bounds=(0,89,264,278)
 normaliser.mean=-444.473
 vector.editor.button1=0.1
+scaler.E.trace.window.bounds=(360,376,264,86)
 test.file=test3.silk
-scaler.E.trace.window.bounds=(360,376,264,86)
 p=1.0E-5
 ica.C.image.window.bounds=(516,524,264,278)
 scaler.output.plotter.window.bounds=(627,566,264,75)
+wavewriter.scale.bounds=(305,57,199,57)
 v1.B.editor.window.bounds=(0,0,187,201)
-wavewriter.scale.bounds=(305,57,199,57)
 midisynth.factor=120.0
+factor=58
 v1.B.image.window.bounds=(0,0,146,54)
-factor=58
 ft.mag.diffScaler.output.stacker.output.reshaped.image.window.bounds=(303,249,264,49)
 image.height=16
 ica.learn.G.rowcolumn.plotter.window.bounds=(166,816,937,118)
 matrix.plotter.rowcolumn.plotter.window.bounds=(5,159,212,136)
 histogram.likelihood.plotter.window.bounds=(891,383,264,100)
+matrix.rowcolumn.plotter.window.bounds=(0,0,212,136)
 VState.Optimiser.bounds=(0,0,287,592)
-matrix.rowcolumn.plotter.window.bounds=(0,0,212,136)
 scaler.NlogK.trace.window.bounds=(0,551,264,86)
+w1.scale=0.01
 joint.histogram.bins.image.window.bounds=(701,314,163,193)
-w1.scale=0.01
 ft.mag.diffScaler.output.stacker.output.reshaped.image.map.minimum=1.0
 spectrum.trace.window.bounds=(284,206,256,294)
+jelly=wobbly
 normaliser.rate=0.004
-jelly=wobbly
 vector.reshaped.image.window.bounds=(0,0,146,294)
+mog.-log\ p(s).plotter.window.bounds=(469,627,427,129)
 mog.weights.editor.plotter.window.bounds=(300,492,225,127)
-mog.-log\ p(s).plotter.window.bounds=(469,627,427,129)
 generator=(oscillator "osc1" 0.1)
 stacker.output.reshaped.image.map.symmetric=false
 waveform.plotter.window.bounds=(364,356,512,118)
+scaler.offsetRate=3.200E-6
+mog.sigmas.editor.plotter.window.bounds=(300,196,224,117)
 scaler.scale=4715.263
-mog.sigmas.editor.plotter.window.bounds=(300,196,224,117)
-scaler.offsetRate=3.200E-6
 filter.mean.plotter.window.bounds=(637,652,214,138)
 regulator.target=46.733
 source=line
@@ -340,20 +341,20 @@
 infile=/mnt/sauce/music/projwav/beethoven/piano/fm-1.wav
 ica.e(x).trace.window.bounds=(876,54,264,278)
 histogram.bins.image.window.bounds=(162,599,86,278)
+vector.image.window.bounds=(113,544,404,72)
 function.plotter.x.map.maximum=4.0
-vector.image.window.bounds=(113,544,404,72)
+x.image.window.bounds=(373,381,265,83)
 ica.log\ |W|=-580.779
-x.image.window.bounds=(373,381,265,83)
 ica.W.rowcolumn.image.window.bounds=(248,190,264,49)
 spectrum.plotter.window.bounds=(76,580,813,116)
 ica.G.image.window.bounds=(283,0,264,278)
 vector.editor.image.window.bounds=(371,114,292,102)
+spectrum.histogram.bins.image.window.bounds=(451,284,104,534)
 histogram.sumL.trace.window.bounds=(891,156,264,86)
-spectrum.histogram.bins.image.window.bounds=(451,284,104,534)
+out.trace.window.bounds=(13,401,1036,292)
 test.color=\#465f90
-out.trace.window.bounds=(13,401,1036,292)
 mog.sigmas.rowcolumn.editor.plotter.window.bounds=(623,452,236,138)
+ica.e(x).plotter.window.bounds=(333,471,264,118)
 w1.color=\#817a9b
-ica.e(x).plotter.window.bounds=(333,471,264,118)
 spectrum.histogram.sumL.trace.window.bounds=(297,845,272,83)
 histogram.bins=96
--- a/examples/sound/sampled/args.old	Tue Jan 17 17:50:20 2012 +0000
+++ b/examples/sound/sampled/args.old	Fri Apr 05 16:26:00 2019 +0100
@@ -1,5 +1,5 @@
 #properties
-#Thu Jul 14 12:56:51 BST 2011
+#Tue Mar 26 14:08:20 GMT 2019
 function.derivative.plotter.window.bounds=(375,357,426,239)
 sqrt.plotter.window.bounds=(0,0,208,122)
 waveform.image.cell.size=1
@@ -24,6 +24,7 @@
 ETA=0.75
 spectrum.stats.covariance.image.window.bounds=(523,366,256,278)
 basis.subrate.factor=10
+ft.power.diffScaler.output.image.window.bounds=(200,141,1078,105)
 x.editor.image.window.bounds=(0,0,230,59)
 filter.ft.mag.trace.window.bounds=(334,0,264,280)
 phi.plotter.window.bounds=(0,0,520,118)
@@ -61,13 +62,14 @@
 mog.weights.editor.image.window.bounds=(25,172,333,118)
 normaliser.level.trace.map.minimum=15.999
 MidiSynthEditor.bounds=(-8,226,391,230)
-waveform.scaler.batch=8
+waveform.scaler.batch=4
 B.image.window.bounds=(0,0,146,54)
 joint.histogram.likelihood.trace.window.bounds=(84,573,293,96)
 matrix.editor.window.bounds=(660,438,186,213)
 XEPS=1.0E-6
 spoons=true
 mog.sigmas.editor.image.window.bounds=(238,1,270,125)
+ft.power.trace.window.bounds=(297,22,272,778)
 z.trace.window.bounds=(5,696,1036,292)
 function.plotter.y.map.maximum=1.099
 signal.trace.window.bounds=(21,69,290,147)
@@ -85,7 +87,9 @@
 spectrum.stats.cov.image.window.bounds=(9,449,256,278)
 filter.mean.image.window.bounds=(765,605,146,59)
 scaleNormaliser.output.plotter.window.bounds=(0,0,264,118)
+ft.power.diffScaler.mu.plotter.window.bounds=(297,165,1025,118)
 loudness.plotter.window.bounds=(387,18,146,150)
+ft.power.diffScaler.w.plotter.window.bounds=(204,22,548,207)
 ftol=1.0E-6
 waveform.scaler.offset=1.554E-4
 image.width=256
@@ -128,6 +132,7 @@
 cell.size=1
 scaler.output.trace.window.bounds=(0,461,264,278)
 function.plotter.window.bounds=(375,90,416,263)
+ft.power.image.window.bounds=(256,22,1025,37)
 sqrt.trace.window.bounds=(0,0,264,534)
 z.image.window.bounds=(479,637,268,40)
 vector.plotter.window.bounds=(498,531,302,121)
@@ -171,6 +176,7 @@
 matrix.rowcolumn.image.window.bounds=(417,470,266,55)
 GEPS=0.001
 x.histogram.bins.image.window.bounds=(693,378,146,115)
+ft.power.diffScaler.output.plotter.window.bounds=(320,440,520,120)
 sqrt.image.window.bounds=(250,621,520,49)
 ica.W.image.window.bounds=(780,524,264,278)
 writer.enable=false
@@ -187,6 +193,7 @@
 mog.state.image.window.bounds=(470,885,419,91)
 signal.map.maximum=1.0
 spectrum.editor.image.window.bounds=(126,215,823,135)
+filessink.scale.bounds=(280,23,201,57)
 ica.learn.G.image.window.bounds=(916,91,264,278)
 scaler.scaleRate=-0.010
 subrate.factor=1
@@ -242,7 +249,7 @@
 logprior.strength=0.0
 audio.exposed.bounds=(980,190,229,372)
 ica.s.plotter.window.bounds=(151,296,264,118)
-exposed.bounds=(4,22,302,778)
+exposed.bounds=(4,23,287,559)
 noise=(Gaussian.)
 audio.offset=-507.6
 step=384
@@ -287,43 +294,44 @@
 e.trace.window.bounds=(0,89,264,278)
 normaliser.mean=-444.473
 vector.editor.button1=0.1
+test.file=test3.silk
 scaler.E.trace.window.bounds=(360,376,264,86)
-test.file=test3.silk
 p=1.0E-5
 ica.C.image.window.bounds=(516,524,264,278)
 scaler.output.plotter.window.bounds=(627,566,264,75)
+v1.B.editor.window.bounds=(0,0,187,201)
 wavewriter.scale.bounds=(305,57,199,57)
-v1.B.editor.window.bounds=(0,0,187,201)
 midisynth.factor=120.0
+v1.B.image.window.bounds=(0,0,146,54)
 factor=58
-v1.B.image.window.bounds=(0,0,146,54)
 ft.mag.diffScaler.output.stacker.output.reshaped.image.window.bounds=(303,249,264,49)
 image.height=16
 ica.learn.G.rowcolumn.plotter.window.bounds=(166,816,937,118)
 matrix.plotter.rowcolumn.plotter.window.bounds=(5,159,212,136)
 histogram.likelihood.plotter.window.bounds=(891,383,264,100)
+VState.Optimiser.bounds=(0,0,287,592)
 matrix.rowcolumn.plotter.window.bounds=(0,0,212,136)
-VState.Optimiser.bounds=(0,0,287,592)
 scaler.NlogK.trace.window.bounds=(0,551,264,86)
+joint.histogram.bins.image.window.bounds=(701,314,163,193)
 w1.scale=0.01
-joint.histogram.bins.image.window.bounds=(701,314,163,193)
 ft.mag.diffScaler.output.stacker.output.reshaped.image.map.minimum=1.0
 spectrum.trace.window.bounds=(284,206,256,294)
+normaliser.rate=0.004
 jelly=wobbly
-normaliser.rate=0.004
 vector.reshaped.image.window.bounds=(0,0,146,294)
+mog.weights.editor.plotter.window.bounds=(300,492,225,127)
 mog.-log\ p(s).plotter.window.bounds=(469,627,427,129)
-mog.weights.editor.plotter.window.bounds=(300,492,225,127)
 generator=(oscillator "osc1" 0.1)
 stacker.output.reshaped.image.map.symmetric=false
 waveform.plotter.window.bounds=(364,356,512,118)
+scaler.scale=4715.263
+mog.sigmas.editor.plotter.window.bounds=(300,196,224,117)
 scaler.offsetRate=3.200E-6
-mog.sigmas.editor.plotter.window.bounds=(300,196,224,117)
-scaler.scale=4715.263
 filter.mean.plotter.window.bounds=(637,652,214,138)
 regulator.target=46.733
 source=line
 matrix.rowcolumn.editor.plotter.window.bounds=(613,573,367,148)
+ft.power.diffScaler.output.trace.window.bounds=(301,22,272,778)
 coder.sigma=0.001
 trace.map.symmetric=false
 coeffs.editor.plotter.window.bounds=(283,22,584,177)
@@ -333,20 +341,20 @@
 infile=/mnt/sauce/music/projwav/beethoven/piano/fm-1.wav
 ica.e(x).trace.window.bounds=(876,54,264,278)
 histogram.bins.image.window.bounds=(162,599,86,278)
+function.plotter.x.map.maximum=4.0
 vector.image.window.bounds=(113,544,404,72)
-function.plotter.x.map.maximum=4.0
+ica.log\ |W|=-580.779
 x.image.window.bounds=(373,381,265,83)
-ica.log\ |W|=-580.779
 ica.W.rowcolumn.image.window.bounds=(248,190,264,49)
 spectrum.plotter.window.bounds=(76,580,813,116)
 ica.G.image.window.bounds=(283,0,264,278)
 vector.editor.image.window.bounds=(371,114,292,102)
+histogram.sumL.trace.window.bounds=(891,156,264,86)
 spectrum.histogram.bins.image.window.bounds=(451,284,104,534)
-histogram.sumL.trace.window.bounds=(891,156,264,86)
+test.color=\#465f90
 out.trace.window.bounds=(13,401,1036,292)
-test.color=\#465f90
 mog.sigmas.rowcolumn.editor.plotter.window.bounds=(623,452,236,138)
+w1.color=\#817a9b
 ica.e(x).plotter.window.bounds=(333,471,264,118)
-w1.color=\#817a9b
 spectrum.histogram.sumL.trace.window.bounds=(297,845,272,83)
 histogram.bins=96
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/sound/sampled/linein.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,8 @@
+(load "audio.scm")
+; (load "lineout.scm")
+
+; audio input with a frame size of 1024 and a hop size of 512
+; is routed directly to audio output, which must also be informed
+; that hop size is 512.
+(linein (linesrc) 1024 512)
+(expose)
--- a/local/schemerc.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/local/schemerc.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,5 +1,3 @@
-;#! java jscheme.Shebang
-			 
 (define eval-string jscheme.JS.eval)
 (define lib "/Users/samer/lib")
 (define load-roots (list
@@ -7,5 +5,5 @@
 	(string-append lib "/jslab/local")
 ))
 (load "elf/load.scm")
-(load "readline.scm")
+; (load "readline.scm")
 
--- a/local/silk	Tue Jan 17 17:50:20 2012 +0000
+++ b/local/silk	Fri Apr 05 16:26:00 2019 +0100
@@ -1,8 +1,10 @@
 #!/bin/sh
 jlib=~/lib/java
 silkrc=~/lib/jslab/local/schemerc.scm
-base=$jlib/jscheme.jar:$jlib/libreadline-java.jar:$jlib/jama.jar
-JAVA_HOME=/opt/local/share/java/openjdk6
-#JAVA_HOME="/Library/Java/JavaVirtualMachines/JDK 1.7.0 Developer Preview.jdk/Contents/Home"
-export CLASSPATH=$jlib:$base:$CLASSPATH
-exec "$JAVA_HOME/bin/java" -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -Xdock:name="JSLab" jscheme.REPL $silkrc "$@"
+base=$jlib/jscheme.jar:$jlib/jama.jar
+# base=$jlib/jscheme.jar:$jlib/libreadline-java.jar:$jlib/jama.jar
+# JAVA_HOME="/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
+# JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home"
+JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home"
+export CLASSPATH=$base:$CLASSPATH:$jlib
+exec rlwrap "$JAVA_HOME/bin/java" -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -Xdock:name="JSLab" jscheme.REPL $silkrc "$@"
--- a/local/swingrc.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/local/swingrc.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -11,16 +11,8 @@
 	;(sp "apple.awt.interpolation" "bicubic");  nearestneighbor bilinear bicubic
 	;(sp "apple.awt.graphics.UseQuartz" "false")	
 	;(sp "apple.awt.showGrowBox" "true")
+)
 
-	;;; older options, not working as of Java 6
-	;(sp "com.apple.mrj.application.apple.menu.about.name" "JSLab")
-	;(sp "com.apple.mrj.application.growbox.intrudes" "false")
-	;(sp "com.apple.mrj.application.live-resize" "false")
-	;(sp "com.apple.macosx.AntialiasedGraphicsOn" "false")
-	;(sp "com.apple.macos.useScreenMenuBar" "true")
-	;(sp "com.apple.hwaccel" "true")
-)
-		
 (samer.core.shells.SwingShell. (string-append lib "/jslab/local/user.props"))
 
 ;; This is a theme for people using the Metal look and feel.
@@ -57,5 +49,3 @@
 
 (samer.core.util.Tools.setAntialias #t)
 (osxtheme)	; I'm using a Mac
-
-
--- a/src/samer/applet/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-/ButtonsApplet.java/1.1.1.1/Fri Dec 10 03:29:24 2004//
-/ConsoleApplet.java/1.1.1.1/Fri Dec 10 03:29:24 2004//
-/JApplet.java/1.1.1.1/Fri Dec 10 03:29:24 2004//
-/JAppletShell.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Sierpinski.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/WindowApplet.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-D
--- a/src/samer/applet/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/applet
--- a/src/samer/applet/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/audio/AudioSource.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/audio/AudioSource.java	Fri Apr 05 16:26:00 2019 +0100
@@ -32,6 +32,9 @@
 	Task reader(double buf[], int off, int len);
 	Task reader(float buf[], int off, int len);
 
+	int getChannels();
+	float getRate();
+
 	public static class Util {
 		/* NB. These copying functions allow NEGATIVE offset (off<0). The semantics 
 		 * of this is are that n values are copied from source to destination, writing 
@@ -51,6 +54,12 @@
 			}
 		}
 
+		public static void mediumToDouble(byte [] src, double [] dst, int off, int n) {
+			int i, j;
+			if (off<0) { i= 3*(-off); j=0; } else { i=0; j=off; }
+			while (j<n+off) dst[j++] = (1.0/8388608.0)*((src[i++]&0xff) | src[i++]<<8 | src[i++]<<16);
+		}
+
 		public static void shortToDouble(byte [] src, double [] dst, int off, int n) {
 			int i, j;
 			if (off<0) { i= 2*(-off); j=0; } else { i=0; j=off; }
--- a/src/samer/audio/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/AudioSink.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/AudioSource.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/FileSource.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/LineSource.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/StreamSource.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/VLine.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/LineSink.java/1.2/Mon Oct  9 21:16:16 2006//
-/FileSink.java/1.2/Wed Oct 11 13:02:09 2006//
-D
--- a/src/samer/audio/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/audio
--- a/src/samer/audio/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/audio/FileSource.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/audio/FileSource.java	Fri Apr 05 16:26:00 2019 +0100
@@ -19,6 +19,7 @@
 import  javax.swing.*;
 import  java.io.*;
 import  java.util.*;
+import  java.nio.ByteBuffer;
 
 /**
 	An AudioSource that read from multiple audio files. Can read any
@@ -45,13 +46,13 @@
 {
 	List<File>				list=null;
 	ListIterator<File>	it=null;
-	boolean			loop;
+	boolean			loop, buffered=true;
 	int				channelsToMix;
 	VFile				curFile;
 	InputStream		in=null;
-	AudioFormat		format=null;
+	AudioFormat		format=null, inFormat=null;
 	byte[]  			byte_buf=null;
-	int				chunk=0;
+	int				chunk=0, bytesPerSample=0;
 
 	/**
 	 * Construct a FileSource initialised with current file and loop initialised
@@ -72,15 +73,26 @@
 		Shell.registerViewable(this);
 	}
 
+	// AudioSource interface methods
 	public void dispose() {
 		close();
 		Shell.deregisterViewable(this);
 		curFile.dispose();
 	}
 
+	public int getChannels() { return format.getChannels(); }
+	public float getRate()   { return format.getFrameRate(); }
+
 	/** Returns current file */
 	public File getFile() { return curFile.getFile(); }
-	public void setTargetFormat(AudioFormat f) { format=f; }
+	public void setBuffering(boolean b) { buffered=b; }
+
+	/** The actual format of the stream in. May not be same as target format. **/
+	public AudioFormat getStreamFormat() { return inFormat; }
+
+	/** The requested audio format. **/
+	public AudioFormat getTargetFormat() { return format; }
+	public void        setTargetFormat(AudioFormat f) { format=f; }
 
 	/** If true then loop playlist, otherwise, an Exception will be thrown
 	 * when the end of the playlist is reached. If there is no playlist, then
@@ -153,39 +165,47 @@
 	private synchronized void openCurrent() throws Exception
 	{
 		File file=curFile.getFile();
-		Shell.trace("\nOpening audio file: "+file);
+		Shell.trace("\nFileSource:Opening audio file "+file);
 
 		AudioInputStream		s=AudioSystem.getAudioInputStream(file);
-		AudioFormat				af=s.getFormat();
-		long						frames=file.length()/af.getFrameSize();
+		AudioFormat				fmt1, af=s.getFormat();
 
 		Shell.trace("  format: "+af);
-		Shell.trace("  duration: "+(long)(frames/af.getFrameRate())+" s");
 
 		// convert to target format if required
 		if (format!=null) {
 			if (!format.equals(af)) {
 				Shell.trace("  converting to "+format);
 				if (af.getChannels()>format.getChannels()) {
+					int frameSize = af.getChannels()*format.getSampleSizeInBits()/8;
 					Shell.trace("  channels mix down required.");
-					AudioFormat fmt1 = new AudioFormat( format.getEncoding(), format.getSampleRate(), 
+					fmt1 = new AudioFormat( format.getEncoding(), format.getSampleRate(), 
 								format.getSampleSizeInBits(), 
-								af.getChannels(), format.getFrameSize(), format.getFrameRate(), format.isBigEndian());
+								af.getChannels(), frameSize, format.getFrameRate(), format.isBigEndian());
 
 					channelsToMix = af.getChannels();
-					s=convertFormat(s,af,fmt1);
 				} else {
 					channelsToMix = 0;
-					s=convertFormat(s,af,format);
+					fmt1=format;
 				}
+				Shell.trace("  converting via "+fmt1);
+				s=convertFormat(s,af,fmt1);
+				inFormat = fmt1;
+			} else {
+				Shell.trace("  no formation conversion required");
+				channelsToMix = 0;
+				inFormat = af;
 			}
+		} else {
+			Shell.trace("  using stream native format");
+			channelsToMix = 0;
+			inFormat = af;
 		}
+		in=s;
+		if (buffered) in = new BufferedInputStream(in,64*1024);
 
 		// If we have a reader task, then update the byte buffer
 		if (chunk>0) setByteBuffer();
-
-		// Shell.trace("stream format: "+s.getFormat());
-		in = new BufferedInputStream(s,16*1024);
 	}
 
 	/** Returns number of bytes available in current file */
@@ -194,33 +214,44 @@
 	/** Reopen current file, so that next read will be from head of file. */
 	public synchronized void reopen() throws Exception { close(); openCurrent(); }
 
-	private void setChunkSize(int s) { chunk=s; }
+	private void setBlockSize(int s) { chunk=s; }
 	private void setByteBuffer() {
-		byte_buf = new byte[2*chunk*(channelsToMix>0 ? channelsToMix : 1)];
+		bytesPerSample = 2*(channelsToMix>0 ? channelsToMix : 1);
+		byte_buf       = new byte[chunk*bytesPerSample];
+	}
+
+	public int readInto(ByteBuffer buf, int offset, int len) throws IOException {
+		return in.read(buf.array(), offset, len);
 	}
 
 	/** Returns a Task which copies samples as doubles into the given
 	 *  buffer between the given positions. */
 	public Task reader(final double [] dbuf, final int off, final int len) {
-		setChunkSize(len);
+		setBlockSize(len);
 		if (in!=null) setByteBuffer();
 
 		return new AnonymousTask() {
 			public void run() throws Exception {
-				int n = 0;
+				synchronized (FileSource.this) {
+					// loop until len samples copied into dbuf
+					int rem=len, pos=off;
+					while (rem>0) {
+						int bytesRead = in.read(byte_buf, 0, rem*bytesPerSample);
+						if (bytesRead > 0) { // append this chunk to output
+							int count=bytesRead/bytesPerSample;
+							if (channelsToMix>0) {
+								Util.shortToDoubleMixDown(byte_buf,dbuf,pos,count,channelsToMix);
+							} else {
+								Util.shortToDouble(byte_buf,dbuf,pos,count);
+							}
+							pos+=count; rem-=count;
+						} else if (it!=null) next(); // next file if there is one
+						else if (!loop) throw new EOFException(); // not looping and no more files
+						else reopen(); // back to first file
 
-				synchronized (FileSource.this) {
-					int blen = byte_buf.length;
-					while (n < blen) {
-						int count = in.read(byte_buf, n, blen - n);
-						if (count > 0) n+=count;
-						else if (it!=null) next();
-						else if (!loop) throw new EOFException();
-						else reopen();
+						// if (rem>0) Shell.trace("Read "+bytesRead+" bytes, need "+rem+" more samples.");
 					}
 				}
-				if (channelsToMix>0) Util.shortToDoubleMixDown(byte_buf,dbuf,off,len,channelsToMix);
-				else Util.shortToDouble(byte_buf,dbuf,off,len);
 			}
 		};
 	}
@@ -228,25 +259,29 @@
 	/** Returns a Task which copies samples as floats into the given
 	 *  buffer between the given positions. */
 	public Task reader(final float [] dbuf, final int off, final int len) {
-		setChunkSize(len);
+		setBlockSize(len);
 		if (in!=null) setByteBuffer();
 
 		return new AnonymousTask() {
 			public synchronized void run() throws Exception {
-				int n = 0;
-
 				synchronized (FileSource.this) {
-					int blen = byte_buf.length;
-					while (n < blen) {
-						int count = in.read(byte_buf, n, blen - n);
-						if (count > 0) n+=count;
-						else if (it!=null) next();
+					// loop until len samples copied into dbuf
+					int rem=len, pos=off;
+					while (rem>0) {
+						int bytesRead = in.read(byte_buf, 0, rem*bytesPerSample);
+						if (bytesRead > 0) {
+							int count=bytesRead/bytesPerSample;
+							if (channelsToMix>0) {
+								Util.shortToFloatMixDown(byte_buf,dbuf,pos,count,channelsToMix);
+							} else {
+								Util.shortToFloat(byte_buf,dbuf,pos,count);
+							}
+							pos+=count; rem-=count;
+						} else if (it!=null) next();
 						else if (!loop) throw new EOFException();
 						else reopen();
 					}
 				}
-				if (channelsToMix>0) Util.shortToFloatMixDown(byte_buf,dbuf,off,len,channelsToMix);
-				else Util.shortToFloat(byte_buf,dbuf,off,len);
 			}
 		};
 	}
@@ -318,26 +353,33 @@
 
 	private static AudioInputStream convertFormat(AudioInputStream sin, AudioFormat fin, AudioFormat fout) throws Exception
 	{
-		if (fin==fout) return sin;
+		Shell.trace("\nconvertFormat:");
+		Shell.trace("  | source: "+fin.toString());
+		Shell.trace("  | target: "+fout.toString());
+
+		if (fin.equals(fout)) return sin;
 		else if (fin.getEncoding()==AudioFormat.Encoding.PCM_SIGNED) {
-			try { return AudioSystem.getAudioInputStream(fout,sin); }
+			try { 
+				Shell.trace("  | Trying direct (PCM) from "+fin.getEncoding().toString());
+				return AudioSystem.getAudioInputStream(fout,sin); 
+			}
 			catch (IllegalArgumentException ex) { Shell.trace("Direct conversion failed"); }
 
 			AudioFormat fint = new AudioFormat(  // PCM
 				fout.getSampleRate(), fout.getSampleSizeInBits(),
 				fin.getChannels(), true, fout.isBigEndian());
-			Shell.trace("Trying PCM conversion via "+fint.toString());
+			Shell.trace("  | Trying PCM conversion via "+fint.toString());
 			return AudioSystem.getAudioInputStream(fout,AudioSystem.getAudioInputStream(fint,sin));
 		} else {
 		// First, check for MP3 - if so, cannot convert number of channels
 			if (fin.getChannels()==fout.getChannels() && fin.getSampleRate()==fout.getSampleRate()) {
-				Shell.trace("Trying direct decoding from "+fin.getEncoding().toString());
+				Shell.trace("  | Trying decoding from "+fin.getEncoding().toString());
 				return AudioSystem.getAudioInputStream(fout,sin);
 			} else {
 				AudioFormat fint = new AudioFormat( 
 					fin.getSampleRate(), fout.getSampleSizeInBits(),
 					fin.getChannels(), true, fout.isBigEndian());
-				Shell.trace("Trying conversion via "+fint.toString());
+				Shell.trace("  | Trying recursive via "+fint.toString());
 				return convertFormat(AudioSystem.getAudioInputStream(fint,sin),fint,fout);
 			}
 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/audio/FileSource2.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,287 @@
+/*
+ *	FileSource2.java
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY;
+ *	without even the implied warranty of MERCHANTABILITY or
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.audio;
+
+import  samer.core.*;
+import  samer.core.types.*;
+import  samer.core.util.*;
+import  samer.tools.*;
+import  javax.sound.sampled.*;
+import  javax.swing.*;
+import  java.io.*;
+import  java.util.*;
+import  java.nio.ByteBuffer;
+
+/**
+	An AudioSource that read from multiple audio files. Can read any
+	format for which the appropriate JavaSound plug-in is installed on
+	your system, eg WAV, AU, MP3, OGG. The implementation of 
+	AudioSource.reader() returns a Task which gets samples from the audio 
+	files, going through the play list one by one. 
+	An EOFException is thrown if an attempt is made
+	to read beyond the end of the last file.
+	
+	FileSource2 is a Viewable called "playlist", and an Agent with commands
+	next, view.
+					
+*/
+
+public class FileSource2 extends Viewable implements AudioSource, Agent
+{
+	List<File>				list=null;
+	ListIterator<File>	it=null;
+	int				channelsToMix;
+	File				curFile=null;
+	InputStream		in=null;
+	AudioFormat		targetFormat=null;
+	byte[]  			byte_buf=null;
+	int				chunk=0, bytesPerSample=0;
+
+	/**
+	 * Construct a FileSource2. 
+	 */
+	public FileSource2(AudioFormat targetFormat, List<File> files)
+	{
+		super("playlist");
+
+		setAgent(this);
+		Shell.registerViewable(this);
+		this.targetFormat=targetFormat;
+		this.list=files;
+		it=list.listIterator(); 
+	}
+
+	// AudioSource interface methods
+	public void dispose() {
+		close();
+		Shell.deregisterViewable(this);
+	}
+
+	public int getChannels() { return targetFormat.getChannels(); }
+	public float getRate()   { return targetFormat.getFrameRate(); }
+
+	/** Returns current file */
+	public File getFile() { return curFile; }
+
+	/** The requested audio format. **/
+	public AudioFormat getTargetFormat() { return targetFormat; }
+
+	/** Set playlist to all WAV files in given directory */
+	public static List<File> directory(File dir, String ext) {
+		return Arrays.asList(dir.listFiles(getFileFilter(ext))); 
+	}
+
+	public synchronized List<File> getPlaylist() { return list; }
+
+	/** Move to head of next file in playlist */
+	public synchronized void next() throws Exception
+	{
+		boolean wasOpen=isOpen();
+
+		if (wasOpen) close();
+		if (!it.hasNext()) throw new EOFException();
+		curFile=it.next();
+		if (wasOpen) openCurrent();
+	}
+
+	public boolean isOpen() { return in!=null; }
+
+	/** Closes current input stream */
+	public synchronized void close() {
+		try { 
+			if (in!=null) {
+				Shell.trace("Closing audio stream...");
+				in.close(); in=null; byte_buf=null; 
+			}
+		}
+		catch (IOException ex) {}
+	}
+
+	/** Opens the playlist starting with the first file.  */
+	public synchronized void open() throws Exception { 
+		it=list.listIterator(); next(); 
+		if (!isOpen()) openCurrent();
+	}
+
+	/** Opens the current file. Next read will returns samples
+	 *  from head of given file. If setFormat() was called previously, then
+	 *  we will attempt to do format conversion. */
+	private synchronized void openCurrent() throws Exception
+	{
+		File file=curFile;
+		Shell.trace("\nFileSource:Opening audio file "+file);
+
+		AudioInputStream ain=AudioSystem.getAudioInputStream(file);
+
+		// convert to target format if required
+		if (targetFormat==null) {
+			AudioFormat fin=ain.getFormat();
+			ain=convertFormat(new AudioFormat( fin.getSampleRate(), 16, fin.getChannels(), true, false), ain);
+		} else {
+			ain=convertFormat(targetFormat, ain);
+		}
+		bytesPerSample=ain.getFormat().getSampleSizeInBits()/8;
+		if (bytesPerSample!=2) throw new Exception("Must be 16 bits per sample");
+
+		in = new BufferedInputStream(ain,64*1024);
+
+		// If we have a reader task, then update the byte buffer
+		if (chunk>0) setByteBuffer();
+	}
+
+	/** Returns number of bytes available in current file */
+	public int available() throws Exception { return in.available(); }
+
+	private void setBlockSize(int s) { chunk=s; }
+	private void setByteBuffer() {
+		byte_buf       = new byte[chunk*bytesPerSample];
+	}
+
+	public int readInto(ByteBuffer buf, int offset, int len) throws IOException {
+		return in.read(buf.array(), offset, len);
+	}
+
+	/** Returns a Task which copies samples as doubles into the given
+	 *  buffer between the given positions. */
+	public Task reader(final double [] dbuf, final int off, final int len) {
+		setBlockSize(len);
+		if (in!=null) setByteBuffer();
+
+		return new AnonymousTask() {
+			public void run() throws Exception {
+				synchronized (FileSource2.this) {
+					// loop until len samples copied into dbuf
+					int rem=len, pos=off;
+					while (rem>0) {
+						int bytesRead = in.read(byte_buf, 0, rem*bytesPerSample);
+						if (bytesRead > 0) { // append this chunk to output
+							int count=bytesRead/bytesPerSample;
+							Util.shortToDouble(byte_buf,dbuf,pos,count);
+							pos+=count; rem-=count;
+						} else if (it!=null) next(); // next file if there is one
+						else throw new EOFException(); // not looping and no more files
+					}
+				}
+			}
+		};
+	}
+
+	/** Returns a Task which copies samples as floats into the given
+	 *  buffer between the given positions. */
+	public Task reader(final float [] dbuf, final int off, final int len) {
+		setBlockSize(len);
+		if (in!=null) setByteBuffer();
+
+		return new AnonymousTask() {
+			public synchronized void run() throws Exception {
+				synchronized (FileSource2.this) {
+					// loop until len samples copied into dbuf
+					int rem=len, pos=off;
+					while (rem>0) {
+						int bytesRead = in.read(byte_buf, 0, rem*bytesPerSample);
+						if (bytesRead > 0) {
+							int count=bytesRead/bytesPerSample;
+							Util.shortToFloat(byte_buf,dbuf,pos,count);
+							pos+=count; rem-=count;
+						} else if (it!=null) next();
+						else throw new EOFException();
+					}
+				}
+			}
+		};
+	}
+
+	// Agent
+	public void getCommands(Agent.Registry r) {
+		r.add("next").add("view");
+	}
+
+	public void execute(String cmd, Environment env) throws Exception {
+		if (cmd.equals("next")) next();
+		else if (cmd.equals("view")) {
+			if (list!=null) {
+				Shell.expose(
+					new JScrollPane(new JList(list.toArray())),
+					"playlist");
+			}
+		} 
+	}
+
+	// Viewable
+	public Viewer getViewer() { return new FileSourceViewer(); }
+	class FileSourceViewer extends DefaultViewer implements Agent {
+		public FileSourceViewer() {
+			super(FileSource2.this);
+			//add(curFile);
+			add(Shell.createButtonsFor(this));
+		}
+
+		public void getCommands(Agent.Registry r) {
+			r.add("next").add("view");
+		}
+		public void execute(String cmd, Environment env) throws Exception {
+			FileSource2.this.execute(cmd,env);
+		}
+	};
+
+	private static java.io.FileFilter getFileFilter(final String ext) { 
+		return new java.io.FileFilter() {
+			public boolean accept(File file) {
+				return file.getName().toLowerCase().endsWith(ext);
+			}
+		};
+	}
+
+	private static AudioInputStream convertVia(AudioFormat fout, AudioInputStream sin, AudioFormat fint) throws Exception
+	{
+		Shell.trace("  | Trying recursive via "+fint.toString());
+		AudioInputStream sint=AudioSystem.getAudioInputStream(fint,sin);
+		Shell.trace("  | Obtained  "+sint.getFormat().toString());
+		return convertFormat(fout, sint);
+	}
+
+	private static AudioInputStream convertFormat(AudioFormat fout, AudioInputStream sin) throws Exception
+	{
+		AudioFormat fin=sin.getFormat();
+
+		if (fin.equals(fout)) return sin;
+
+		Shell.trace("\nconvertFormat:");
+		Shell.trace("  | source: "+fin.toString());
+		Shell.trace("  | target: "+fout.toString());
+
+		if (fin.getEncoding()!=AudioFormat.Encoding.PCM_SIGNED) {
+			// first get into PCM encoding, then try recursive
+			try {
+				return convertVia( fout, sin, new AudioFormat( 
+					fin.getSampleRate(), fout.getSampleSizeInBits(),
+					fin.getChannels(), true, fout.isBigEndian()));
+			} catch (IllegalArgumentException ex) { 
+				Shell.trace("Direct conversion failed"); 
+			}
+			return convertVia( fout, sin, new AudioFormat( 
+				fin.getSampleRate(), fin.getSampleSizeInBits(),
+				fin.getChannels(), true, fout.isBigEndian()));
+		} 
+
+		if (fin.getChannels()!=fout.getChannels() || fin.getSampleSizeInBits()!=fout.getSampleSizeInBits()) {
+			// convert these before doing any sample rate conversion
+			return convertVia(fout, sin, new AudioFormat( 
+				fin.getSampleRate(), fout.getSampleSizeInBits(),
+				fout.getChannels(), true, fout.isBigEndian()));
+		}
+
+		// the only thing left is sample rate
+		return AudioSystem.getAudioInputStream(fout,sin);
+	}
+}
+
--- a/src/samer/audio/LineSource.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/audio/LineSource.java	Fri Apr 05 16:26:00 2019 +0100
@@ -38,6 +38,9 @@
 		super("linein"); line=l; fmt=f;
 	}
 
+	public int getChannels() { return fmt.getChannels(); }
+	public float getRate() { return fmt.getFrameRate(); }
+	public AudioFormat getFormat() { return fmt; }
 	public void setBufferSize(int b) { bufsize=b; }
 
 	public DataLine getLine() { return line; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/audio/MultiFileAudioStream.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,226 @@
+/*
+ *	FileSource.java
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY;
+ *	without even the implied warranty of MERCHANTABILITY or
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.audio;
+
+import  samer.core.*;
+import  samer.core.types.*;
+import  samer.core.util.*;
+import  samer.tools.*;
+import  javax.sound.sampled.*;
+import  javax.swing.*;
+import  java.io.*;
+import  java.util.*;
+import  java.nio.ByteBuffer;
+
+/**
+*/
+
+
+public abstract class MultiFileAudioStream extends InputStream 
+{
+	List<File>				list=null;
+	ListIterator<File>	it=null;
+	int						channelsToMix;
+	File						curFile=null;
+	InputStream				in=null;
+	AudioFormat				format=null, inFormat=null;
+	boolean              loop=false;
+
+	/**
+	 * Construct a FileSource initialised with current file and loop initialised
+	 * from the current Environment. No exception is thrown if the current file
+	 * cannot be opened, however, you must be sure to set it to a valid file
+	 * (or to set a playlist) before trying to read any samples.
+	 */
+	public MultiFileAudioStream(AudioFormat target, List<File> files)
+	{
+		list=files;
+		format=target;
+	}
+
+	public AudioFormat getFormat() { return format; }
+
+	/** Set playlist to all WAV files in given directory */
+	public List<File> directory(File dir, String ext) {
+		return Arrays.asList(dir.listFiles(getFileFilter(ext))); 
+	}
+
+	private static java.io.FileFilter getFileFilter(final String ext) { 
+		return new java.io.FileFilter() {
+			public boolean accept(File file) {
+				return file.getName().toLowerCase().endsWith(ext);
+			}
+		};
+	}
+
+	public synchronized List<File> getPlaylist() { return list; }
+
+	/** Go back to start of playlist. Next block of samples will be from head
+	 *  of first file in playlist. Will throw an exception if there is no playlist */
+	public synchronized void rewind() throws IOException {
+		it=list.listIterator(); next();
+	}
+
+	/** Move to head of next file in playlist */
+	public synchronized void next() throws IOException
+	{
+		boolean wasOpen=isOpen();
+
+		if (wasOpen) close();
+		if (!it.hasNext()) {
+			if (!loop) throw new EOFException();
+			it=list.listIterator();
+			if (!it.hasNext()) throw new IOException("no files in playlist");
+		}
+		curFile=it.next();
+		if (wasOpen) openCurrent();
+	}
+
+	/** Move to head of previous file in playlist */
+	public synchronized void prev() throws Exception
+	{
+		boolean wasOpen=isOpen();
+		if (wasOpen) close();
+		if (!it.hasPrevious()) {
+			if (!loop) throw new EOFException();
+			it=list.listIterator(list.size());
+			if (!it.hasPrevious()) throw new Exception("no files in playlist");
+		}
+		curFile=it.previous();
+		if (wasOpen) openCurrent();
+	}
+
+	public boolean isOpen() { return in!=null; }
+
+	/** Closes current input stream */
+	public synchronized void close() {
+		try { 
+			if (in!=null) {
+				Shell.trace("Closing audio stream...");
+				in.close(); in=null; 
+			}
+		}
+		catch (IOException ex) {}
+	}
+
+	/** Opens the playlist starting with the first file.  */
+	public synchronized void open() throws Exception { rewind(); if (!isOpen()) openCurrent(); }
+
+	/** Opens the current file. Next read will returns samples
+	 *  from head of given file. If setFormat() was called previously, then
+	 *  we will attempt to do format conversion. */
+	private synchronized void openCurrent() throws IOException
+	{
+		try {
+			File file=curFile;
+			Shell.trace("\nFileSource:Opening audio file "+file);
+
+			AudioInputStream		s=AudioSystem.getAudioInputStream(file);
+			AudioFormat				fmt1, af=s.getFormat();
+
+			Shell.trace("  format: "+af);
+
+			// convert to target format if required
+			if (format!=null) {
+				if (!format.equals(af)) {
+					Shell.trace("  converting to "+format);
+					if (af.getChannels()>format.getChannels()) {
+						int frameSize = af.getChannels()*format.getSampleSizeInBits()/8;
+						Shell.trace("  channels mix down required.");
+						fmt1 = new AudioFormat( format.getEncoding(), format.getSampleRate(), 
+									format.getSampleSizeInBits(), 
+									af.getChannels(), frameSize, format.getFrameRate(), format.isBigEndian());
+
+						channelsToMix = af.getChannels();
+					} else {
+						channelsToMix = 0;
+						fmt1=format;
+					}
+					Shell.trace("  converting via "+fmt1);
+					s=convertFormat(s,af,fmt1);
+					inFormat = fmt1;
+				} else {
+					Shell.trace("  no formation conversion required");
+					channelsToMix = 0;
+					inFormat = af;
+				}
+			} else {
+				Shell.trace("  using stream native format");
+				channelsToMix = 0;
+				inFormat = af;
+			}
+			in=s;
+		}
+		catch (Exception ex) { throw new IOException("Failed to open audio file"); }
+	}
+
+	/** Returns number of bytes available in current file */
+	public int available() { 
+		try {
+			return in.available(); 
+		}
+		catch (Exception ex) { return 0; }
+	}
+
+	/** Returns a Task which copies samples as doubles into the given
+	 *  buffer between the given positions. */
+	public int read(byte [] buf, int off, int len) throws IOException {
+
+		// loop until len samples copied into dbuf
+		int rem=len, pos=off;
+		while (rem>0) {
+			int chunk = in.read(buf, pos, rem);
+			if (chunk > 0) { // append this chunk to output
+				pos+=chunk; rem-=chunk;
+			} else if (it!=null) next(); // next file if there is one
+			else if (!loop) throw new EOFException(); // not looping and no more files
+			else rewind(); // back to first file
+		}
+		return len;
+	}
+
+
+	private static AudioInputStream convertFormat(AudioInputStream sin, AudioFormat fin, AudioFormat fout) throws Exception
+	{
+		Shell.trace("\nconvertFormat:");
+		Shell.trace("  | source: "+fin.toString());
+		Shell.trace("  | target: "+fout.toString());
+
+		if (fin.equals(fout)) return sin;
+		else if (fin.getEncoding()==AudioFormat.Encoding.PCM_SIGNED) {
+			try { 
+				Shell.trace("  | Trying direct (PCM) from "+fin.getEncoding().toString());
+				return AudioSystem.getAudioInputStream(fout,sin); 
+			}
+			catch (IllegalArgumentException ex) { Shell.trace("Direct conversion failed"); }
+
+			AudioFormat fint = new AudioFormat(  // PCM
+				fout.getSampleRate(), fout.getSampleSizeInBits(),
+				fin.getChannels(), true, fout.isBigEndian());
+			Shell.trace("  | Trying PCM conversion via "+fint.toString());
+			return AudioSystem.getAudioInputStream(fout,AudioSystem.getAudioInputStream(fint,sin));
+		} else {
+		// First, check for MP3 - if so, cannot convert number of channels
+			if (fin.getChannels()==fout.getChannels() && fin.getSampleRate()==fout.getSampleRate()) {
+				Shell.trace("  | Trying decoding from "+fin.getEncoding().toString());
+				return AudioSystem.getAudioInputStream(fout,sin);
+			} else {
+				AudioFormat fint = new AudioFormat( 
+					fin.getSampleRate(), fout.getSampleSizeInBits(),
+					fin.getChannels(), true, fout.isBigEndian());
+				Shell.trace("  | Trying recursive via "+fint.toString());
+				return convertFormat(AudioSystem.getAudioInputStream(fint,sin),fint,fout);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/audio/StreamSource.java	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,202 @@
+/*
+ *	StreamSource.java
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY;
+ *	without even the implied warranty of MERCHANTABILITY or
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.audio;
+
+import  samer.core.*;
+import  samer.core.types.*;
+import  samer.core.util.*;
+import  samer.tools.*;
+import  javax.sound.sampled.*;
+import  javax.swing.*;
+import  java.io.*;
+import  java.net.URL;
+import  java.util.*;
+
+/**
+	An AudioSource that read from an input stream. Can read any
+	format for which the appropriate JavaSound plug-in is installed on
+	your system, eg WAV, AU, MP3, OGG. The implementation of 
+	AudioSource.reader() returns a Task which gets samples from the audio 
+	files, going through the play list one by one. If the loop flag
+	is true, then samples are returned indefinitely by looping through the
+	playlist; otherwise, an EOFException is thrown if an attempt is made
+	to read beyond the end of the last file.
+	
+	Properties read from current environment:
+	<dl>
+		<dt>current<dd>Current file (String)
+		<dt>loop<dd>Loop playlist? (Boolean) [true]
+	</dl>
+					
+*/
+
+public class StreamSource implements AudioSource
+{
+	int				channelsToMix;
+	AudioInputStream source;
+	InputStream		in=null;
+	AudioFormat		format=null;
+	byte[]  			byte_buf=null;
+	int				chunk=0;
+
+	/**
+	 * Construct a StreamSource initialised with current file and loop initialised
+	 * from the current Environment. No exception is thrown if the current file
+	 */
+	public StreamSource(AudioInputStream s) throws Exception { source=s; }
+	public StreamSource(InputStream s) throws Exception { source=AudioSystem.getAudioInputStream(s); }
+	public StreamSource(File file) throws Exception { source=AudioSystem.getAudioInputStream(file); }
+	public StreamSource(URL url) throws Exception { source=AudioSystem.getAudioInputStream(url); }
+
+	public void dispose() { close(); }
+
+	/** Returns current file */
+	public void setTargetFormat(AudioFormat f) { format=f; }
+
+	public AudioFormat getFormat() { return format; }
+
+	public boolean isOpen() { return in!=null; }
+
+	/** Closes current input stream */
+	public synchronized void close() {
+		try { 
+			if (in!=null) {
+				Shell.trace("Closing audio stream...");
+				in.close(); in=null; byte_buf=null; 
+			}
+		}
+		catch (IOException ex) {}
+	}
+
+	/** Opens the playlist starting with the first file.  */
+	public synchronized void open() throws Exception { if (!isOpen()) openCurrent(); }
+
+	/** Opens the current file. Next read will returns samples
+	 *  from head of given file. If setFormat() was called previously, then
+	 *  we will attempt to do format conversion. */
+	private synchronized void openCurrent() throws Exception
+	{
+		AudioInputStream     s=source;
+		AudioFormat				fmt1, af=s.getFormat();
+
+		Shell.trace("  format: "+af);
+
+		// convert to target format if required
+		if (format!=null) {
+			if (!format.equals(af)) {
+				Shell.trace("  converting to "+format);
+				if (af.getChannels()>format.getChannels()) {
+					Shell.trace("  channels mix down required.");
+					fmt1 = new AudioFormat( format.getEncoding(), format.getSampleRate(), 
+								format.getSampleSizeInBits(), 
+								af.getChannels(), format.getFrameSize(), format.getFrameRate(), format.isBigEndian());
+
+					channelsToMix = af.getChannels();
+				} else {
+					channelsToMix = 0;
+					fmt1=format;
+				}
+				s=convertFormat(s,af,fmt1);
+			}
+		}
+
+		// If we have a reader task, then update the byte buffer
+		if (chunk>0) setByteBuffer();
+
+		// Shell.trace("stream format: "+s.getFormat());
+		in = new BufferedInputStream(s,64*1024);
+	}
+
+	/** Returns number of bytes available in current file */
+	public int available() throws Exception { return in.available(); }
+
+	private void setChunkSize(int s) { chunk=s; }
+	private void setByteBuffer() {
+		byte_buf = new byte[2*chunk*(channelsToMix>0 ? channelsToMix : 1)];
+	}
+
+	/** Returns a Task which copies samples as doubles into the given
+	 *  buffer between the given positions. */
+	public Task reader(final double [] dbuf, final int off, final int len) {
+		setChunkSize(len);
+		if (in!=null) setByteBuffer();
+
+		return new AnonymousTask() {
+			public void run() throws Exception {
+				int n = 0;
+
+				synchronized (StreamSource.this) {
+					int blen = byte_buf.length;
+					while (n < blen) {
+						int count = in.read(byte_buf, n, blen - n);
+						if (count > 0) n+=count;
+						else throw new EOFException();
+					}
+				}
+				if (channelsToMix>0) Util.shortToDoubleMixDown(byte_buf,dbuf,off,len,channelsToMix);
+				else Util.shortToDouble(byte_buf,dbuf,off,len);
+			}
+		};
+	}
+
+	/** Returns a Task which copies samples as floats into the given
+	 *  buffer between the given positions. */
+	public Task reader(final float [] dbuf, final int off, final int len) {
+		setChunkSize(len);
+		if (in!=null) setByteBuffer();
+
+		return new AnonymousTask() {
+			public synchronized void run() throws Exception {
+				int n = 0;
+
+				synchronized (StreamSource.this) {
+					int blen = byte_buf.length;
+					while (n < blen) {
+						int count = in.read(byte_buf, n, blen - n);
+						if (count > 0) n+=count;
+						else throw new EOFException();
+					}
+				}
+				if (channelsToMix>0) Util.shortToFloatMixDown(byte_buf,dbuf,off,len,channelsToMix);
+				else Util.shortToFloat(byte_buf,dbuf,off,len);
+			}
+		};
+	}
+
+	private static AudioInputStream convertFormat(AudioInputStream sin, AudioFormat fin, AudioFormat fout) throws Exception
+	{
+		if (fin.equals(fout)) return sin;
+		else if (fin.getEncoding()==AudioFormat.Encoding.PCM_SIGNED) {
+			try { return AudioSystem.getAudioInputStream(fout,sin); }
+			catch (IllegalArgumentException ex) { Shell.trace("Direct conversion failed"); }
+
+			AudioFormat fint = new AudioFormat(  // PCM
+				fout.getSampleRate(), fout.getSampleSizeInBits(),
+				fin.getChannels(), true, fout.isBigEndian());
+			Shell.trace("Trying PCM conversion via "+fint.toString());
+			return AudioSystem.getAudioInputStream(fout,AudioSystem.getAudioInputStream(fint,sin));
+		} else {
+		// First, check for MP3 - if so, cannot convert number of channels
+			if (fin.getChannels()==fout.getChannels() && fin.getSampleRate()==fout.getSampleRate()) {
+				Shell.trace("Trying direct decoding from "+fin.getEncoding().toString());
+				return AudioSystem.getAudioInputStream(fout,sin);
+			} else {
+				AudioFormat fint = new AudioFormat( 
+					fin.getSampleRate(), fout.getSampleSizeInBits(),
+					fin.getChannels(), true, fout.isBigEndian());
+				Shell.trace("Trying conversion via "+fint.toString());
+				return convertFormat(AudioSystem.getAudioInputStream(fint,sin),fint,fout);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/audio/StreamSource.java.old	Fri Apr 05 16:26:00 2019 +0100
@@ -0,0 +1,113 @@
+/*
+ *	FileSource.java
+ *
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY;
+ *	without even the implied warranty of MERCHANTABILITY or
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.audio;
+
+import  samer.core.*;
+import  samer.tools.*;
+import  javax.sound.sampled.*;
+import  java.io.*;
+
+/**
+	A lightweight AudioSource that reads from a single Stream.
+	Any format for which the appropriate JavaSound plug-in is installed on
+	your system, eg WAV, AU, MP3, OGG. The implementation of 
+*/
+
+public class StreamSource implements AudioSource
+{
+	InputStream	in=null;
+	AudioFormat	format=null;
+
+	/**
+	 * Construct a FileSource initialised with current file and loop initialised
+	 * from the current Environment. No exception is thrown if the current file
+	 * cannot be opened, however, you must be sure to set it to a valid file
+	 * (or to set a playlist) before trying to read any samples.
+	 */
+	public StreamSource(InputStream in) throws Exception { open(in); }
+	public StreamSource(InputStream in, AudioFormat f) throws Exception { format=f; open(in); }
+	public StreamSource(AudioFormat f) { format=f; }
+
+	public void dispose() { close(); }
+	public void setTargetFormat(AudioFormat f) { format=f; }
+
+	/** Returns number of bytes available in current file */
+	public int available() throws Exception { return in.available(); }
+
+
+	/** Allows reading from any given InputStream, but does not affect
+	 *  current file or playlist. */
+	public synchronized void open(InputStream s) throws Exception {
+		open(AudioSystem.getAudioInputStream(s));
+	}
+
+	public synchronized void open(AudioInputStream s) throws Exception
+	{
+		Shell.trace("stream format: "+s.getFormat());
+		Shell.trace("file format: "+s.getFormat());
+
+		// in = new BufferedInputStream(s,16*1024);
+		// convert to target format if required
+		in=s;
+		if (format!=null) {
+			Shell.trace("Converting to "+format);
+			in=AudioSystem.getAudioInputStream(format,s);
+		}
+	}
+
+	/** Closes current input stream */
+	public synchronized void close() {
+		try { if (in!=null) in.close(); in=null; }
+		catch (IOException ex) {}
+	}
+
+	/** Returns a Task which copies samples as doubles into the given
+	 *  buffer between the given positions. */
+	public Task reader(final double [] dbuf, final int off, final int len) {
+		return new AnonymousTask() {
+			int			blen=2*len;
+			byte [] bbuf = new byte[blen];
+
+			public void run() throws Exception {
+				int n = 0;
+
+				while (n < blen) {
+					int count = in.read(bbuf, n, blen - n);
+					if (count > 0) n+=count;
+					else throw new EOFException();
+				}
+				Util.shortToDouble(bbuf,dbuf,off,len);
+			}
+		};
+	}
+
+	/** Returns a Task which copies samples as floats into the given
+	 *  buffer between the given positions. */
+	public Task reader(final float [] dbuf, final int off, final int len) {
+		return new AnonymousTask() {
+			int		blen=2*len;
+			byte [] bbuf = new byte[blen];
+
+			public synchronized void run() throws Exception {
+				int n = 0;
+
+				while (n < blen) {
+					int count = in.read(bbuf, n, blen - n);
+					if (count > 0) n+=count;
+					else throw new EOFException();
+				}
+				Util.shortToFloat(bbuf,dbuf,off,len);
+			}
+		};
+	}
+}
+
--- a/src/samer/audio/VLine.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/audio/VLine.java	Fri Apr 05 16:26:00 2019 +0100
@@ -104,6 +104,7 @@
 			setText(getLabel());
 
 			if (Shell.getBoolean("meter",true)) {
+				this.line = line;
 				Shell.push("meter");
 				meter = new Meter();
 				meter.getMap().setDomain(0,line.getBufferSize());
--- a/src/samer/core_/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/Agent.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/CompoundAgent.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/DoubleFormat.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Environment.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Node.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/NumberSink.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/NumberViewer.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Registry.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Saveable.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Saver.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Shell.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Variable.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Viewable.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/Viewer.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/X.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-D/shells////
-D/types////
-D/util////
-D/viewers////
--- a/src/samer/core_/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_
--- a/src/samer/core_/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/Shell.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/core_/Shell.java	Fri Apr 05 16:26:00 2019 +0100
@@ -431,7 +431,7 @@
 {
 	private PrintWriter writer=null;
 	private PrintWriter stdout=new PrintWriter(System.out,true); // with autoflush
-	private PrintWriter stderr=new PrintWriter(System.err); // without autoflush
+	private PrintWriter stderr=new PrintWriter(System.err,true); // with autoflush
 
 	//	DefaultShell() { trace("creating DefaultShell"); }
 
--- a/src/samer/core_/shells/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-/AWTShell.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/DesktopShell.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-/SwingShell.java/1.1.1.1/Fri Dec 10 03:29:25 2004//
-D
--- a/src/samer/core_/shells/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/shells
--- a/src/samer/core_/shells/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/types/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/DoubleModel.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VBoolean.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VColor.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VDouble.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VFile.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VInteger.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VParameter.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VRectangle.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VString.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-D
--- a/src/samer/core_/types/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/types
--- a/src/samer/core_/types/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/util/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/AgentAdapter.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/BaseViewer.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/ConsoleEnvironment.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/DefaultViewer.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/FileFilter.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/FilteredEnvironment.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/HashMap.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/IMap.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/LinearMap.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/LogMap.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/MouseRetarget.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/StackLayout.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Tools.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/UserEnvironment.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VLayout.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VMap.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VariableViewer.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-D/heavy////
-D/light////
-D/shell////
-D/swing////
-/Properties.java/1.2/Mon Oct  9 21:16:17 2006//
--- a/src/samer/core_/util/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/util
--- a/src/samer/core_/util/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/util/heavy/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/Border.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Borders.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/ButtonBar.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/CommandField.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Dialog.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Frame.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/JPanel.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/MenuBuilder.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Meter.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/NumberViewer.java.not/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/PopupHandler.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/TextualNumberViewer.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VCanvas.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/VPanel.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Console.java/1.2/Mon Oct  9 21:16:17 2006//
-D
--- a/src/samer/core_/util/heavy/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/util/heavy
--- a/src/samer/core_/util/heavy/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/util/shell/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-/AgentManager.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/AppShellBase.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/ViewableManager.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-D
--- a/src/samer/core_/util/shell/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/util/shell
--- a/src/samer/core_/util/shell/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/util/swing/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/ButtonBar.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/CommandField.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/DarkMetalTheme.java/1.1.1.1/Fri Dec 10 03:29:26 2004//
-/Dialog.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/DynamicPopupHandler.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Frame.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/InternalFrame.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LED.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MenuBuilder.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Meter.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/PopupHandler.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/SilkyMetalTheme.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/TextualNumberViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/VPanel.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Console.java/1.2/Mon Oct  9 21:16:17 2006//
-/VCanvas.java/1.1.1.1/Mon Aug 15 18:36:19 2005//
-D
--- a/src/samer/core_/util/swing/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/util/swing
--- a/src/samer/core_/util/swing/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/viewers/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-/BooleanViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorButton.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorSwatch.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/DoubleViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/FileViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/IntegerViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/NumberViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ParameterViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/StringViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-D/swing////
--- a/src/samer/core_/viewers/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/viewers
--- a/src/samer/core_/viewers/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/core_/viewers/swing/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/BooleanViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorButton.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorChooserViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ColorViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/DoubleViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/FileChooserViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/FileViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/IntegerViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/NumberViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ParameterViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/StringViewer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-D
--- a/src/samer/core_/viewers/swing/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/core_/viewers/swing
--- a/src/samer/core_/viewers/swing/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/functions/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/Abs.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Add.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Atanh.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/BiLaplacian.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/BiLaplacianBlend.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/CauchyInfomax.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/CompoundFunction.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Exp.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ExponentialSquashing.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Gamma.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/HalfSquare.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Hamming.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Hanning.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/HybridFunction.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Log.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogAbs.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogCauchy.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogCosh.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogGenCosh.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogGenExp.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogGenExp2.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogisiticInfomax.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/LogisticHyperplane.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Negate.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Power.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Quadratic.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/RaleighLogPrior.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Reciprocal.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Scale.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ScaledFunction.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Sgn.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/SparseExponential.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Sqrt.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Square.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Step.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Tanh.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ThresholdLog.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/WinnerTakeAll.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-D
--- a/src/samer/functions/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/functions
--- a/src/samer/functions/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/j3d/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/Axes.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/FPS.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ImmediateRenderer.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/J3DViewer.java.not/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/J3DViewerImmediate.java.not/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/J3DViewerMorph.java.not/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MatrixPointArray.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MatrixPointArrayAlpha.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MatrixPointArrayRef.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MatrixPoints4D.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MonoView.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/MorphPoints.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/PatchArray.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/PatchArrayAlpha.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Patches.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/PatchesAlpha.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Points3D.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Points3DAlpha.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Points3DRef.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Points4D.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Root.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/StereoView.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/Util.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ViewBase.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ViewGroup.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-D
--- a/src/samer/j3d/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/j3d
--- a/src/samer/j3d/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/maths/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/ClippedDivide.java/1.1.1.1/Fri Dec 10 03:29:27 2004//
-/ComplexVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Constant.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Difference.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Function.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/FunctionMap.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/FunctionOfGenerator.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/FunctionOfVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/FunctionPlotter.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Generator.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Identity.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/IntArrayEditor.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/IteratorImageSource.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/LineTrace.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Linear.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Mat.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatEditor.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Mathx.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Matrix.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixAgent.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixImage.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixImageSource.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixImageSourceF.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixPanel.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixPlotter.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixTImageSource.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixTImageSourceF.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixTimesVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MatrixTransposeTimesVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Neg.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Ops.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Parameter.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Probe.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Product.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/RowColumn.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/SparseMatrix.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Sum.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VFunction.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VGenerator.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Vec.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorEditor.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorFunctionOfVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorPlotter.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorPlusEqualsVector.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorTimesEqualsScalar.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/VectorTrace.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Zero.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-D/opt////
-D/random////
--- a/src/samer/maths/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/maths
--- a/src/samer/maths/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/maths/opt/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/AbsXFConvergence.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Condition.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/ConjGrad.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/ConstrainedConjGrad.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/ConstrainedGillMurray.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/ConstrainedMinimiser.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Constraints.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/CubicLineSearch.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Datum.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Functionx.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/GConvergence.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/GillMurray.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/MinimiserBase.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/PolynomialLineSearch.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/Positivity.java/1.1.1.1/Fri Dec 10 03:29:28 2004//
-/State.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/SubspaceFunctionx.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/UnconstrainedConjGrad.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/UnconstrainedMinimiser.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Util.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/XFConvergence.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/ZeroCrossingSparsity.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-D
--- a/src/samer/maths/opt/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/maths/opt
--- a/src/samer/maths/opt/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/maths/random/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/BaseRandom.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Binary.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/BinaryVec.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/BipolarUniform.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/BoundedHyperbolic.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/BoundedUniform.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Brownian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Cauchy.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Exponential.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Gaussian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GeneralisedExponential.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GeneralisedLaplacian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Laplacian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Logistic.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Mixture.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MixtureVec.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/NormalisedGaussian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/PosteriorSampler.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/PowerLaw.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Raleigh.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/RectifiedCauchy.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/RectifiedGaussian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/RectifiedLogistic.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/SparseMixture.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Ternary.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Uniform.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-D
--- a/src/samer/maths/random/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/maths/random
--- a/src/samer/maths/random/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/mds/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/CorrelationTask.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/CovarianceTask.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/DistanceTask.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Euclidean.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GeometricFilter.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MDS.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MDSBase.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Manhatten.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MatrixBall.java.not/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MatrixPointViewer2.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Minkowski.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/NewMDS.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/ProximityFilter.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-D
--- a/src/samer/mds/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/mds
--- a/src/samer/mds/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/midi/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-/MidiRecorder.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MidiRecorderBase.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MidiSynth.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/MidiWithAftertouch.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-D
--- a/src/samer/midi/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/midi
--- a/src/samer/midi/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/midi/MidiSynth.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/midi/MidiSynth.java	Fri Apr 05 16:26:00 2019 +0100
@@ -36,9 +36,6 @@
 
 public class MidiSynth extends Viewable implements Agent, Task, Saveable
 {
-	VVector			in;
-	Synthesizer		synthesizer=null;
-
 	protected int			n;
 	protected double		[] x;
 	protected int			[] nnums;
@@ -49,7 +46,7 @@
 	protected VInteger	offset;
 	protected VBoolean	pedal;
 
-	public MidiSynth(VVector input)
+	public MidiSynth(VVector input, Synthesizer synth)
 	{
 		super("midisynth");
 
@@ -61,9 +58,9 @@
 		addAgent(new Saver(this));
 		Shell.pop();
 
-		in = input;
-		n = in.size();
-		x = in.array();
+		n = input.size();
+		x = input.array();
+		cc = synth.getChannels();
 
 		nnums = new int[n];
 		chans = new int[n];
@@ -85,26 +82,8 @@
 		};
 	}
 
-	public void open() throws Exception {
-		if (synthesizer!=null) { Shell.print("already open"); return; }
-		if ((synthesizer = MidiSystem.getSynthesizer()) == null) {
-			throw new Exception("getSynthesizer() failed");
-		}
-		Shell.print("opening synthesizer");
-		synthesizer.open();
-
-		cc = synthesizer.getChannels();
-		Shell.print("got synth and channel:"+synthesizer+cc);
-	}
-
-	public void close() {
-		if (synthesizer != null) {
-			Shell.print("closing synthesiser");
-			synthesizer.close();
-			synthesizer = null;
-		}
-	}
-
+	public void open() { }
+	public void close() { }
 	public void dispose() {
 		close();
 		factor.dispose();
@@ -123,8 +102,6 @@
 	public void stopping() {}
 	public void run()
 	{
-		if (synthesizer==null) return;
-
 		for (int i=0; i<n; i++) {
 			if (x[i]>0) {
 				cc[chans[i]].noteOn(nnums[i]+offset.value,mapVelocity(x[i]));
--- a/src/samer/midi/MidiWithAftertouch.java	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/samer/midi/MidiWithAftertouch.java	Fri Apr 05 16:26:00 2019 +0100
@@ -8,17 +8,9 @@
  */
 
 package samer.midi;
-import samer.core.*;
-import samer.core.types.*;
-import samer.core.util.heavy.*;
-import samer.core.util.*;
-import samer.tools.*;
 import samer.maths.*;
-import java.util.*;
-import java.io.*;
 import javax.sound.midi.*;
 
-
 /**
 	When element crosses threshold upwards:	note on
 	When element drops below threshold:			note off
@@ -39,8 +31,6 @@
 
 	public void run()
 	{
-		if (synthesizer==null) return; 
-
 		for (int i=0; i<n; i++) {
 			if (x[i]>0) {
 				int vel=mapVelocity(x[i]);
--- a/src/samer/models/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/AlignedGaussian.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/BatchedTrainer.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/Covariance.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/DiffScaler.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GaussianStats.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GaussianStatsOnline.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/GeneralisedExponential.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/ICA.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/ICAScalerSync.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/ICAWithScaler.java/1.1.1.1/Fri Dec 10 03:29:29 2004//
-/IIDPrior.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/JointHistogramBase.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/MOGModel.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/MOGVector.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/MatrixTrainer.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Mixture.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Model.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/NoisyICA.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Scaler.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SignalHistogram.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SmoothGeneralisedExponential.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SparseICA.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/VarianceICA.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-D/notyet////
--- a/src/samer/models/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/models
--- a/src/samer/models/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/models/notyet/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-/ModelGraph.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/PCA.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-D
--- a/src/samer/models/notyet/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/models/notyet
--- a/src/samer/models/notyet/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/silk/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-/JavaProcedure.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SchemeList.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SilkCompleter.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SilkFunction.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SilkObserver.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SilkTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Terminal.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-D
--- a/src/samer/silk/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/silk
--- a/src/samer/silk/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/tools/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/AnonymousTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ArrayImageSource.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ArrayVImageSource.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ColorRamp.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/CompoundTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ImageSourceBase.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ImageTrace.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ImageTraceBase.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ImageVTrace.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ImageViewer.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/NamedTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/NullTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Plotter.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/RThread.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/RateSchedule.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Renderer.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SafeTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/ScatterPlot.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SignalTrace.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SubrateTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/SwitchTask.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Task.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/TaskLoop.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/TaskTrigger.java.not/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/Trace.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/vec2.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-D
--- a/src/samer/tools/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/tools
--- a/src/samer/tools/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/samer/units/CVS/Entries	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/Clicker.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/DoubleToStream.java/1.1.1.1/Fri Dec 10 03:29:30 2004//
-/DoubleWriter.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/EnergyOperator.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/FFT.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/FFTVector.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/FIRFilter.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Filter.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/FilterVector.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/FilteredGenerator.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/GenerateDouble.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/GenerateVector.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Histogram.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/IIRFilter.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/JointHistogram.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Latch.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/LineIn.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/LineOut.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Matrices.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/MousePosition.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/NoisyLinearSource.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/OnsetMap.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Oscillator.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/OverlapAndAdd.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/RescaledIFT.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/SignalWindow.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/SpectralFIR.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Stacker.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Stacker2.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/StreamToDouble.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/StreamToVec.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/SumFnVec.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Trigger.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/VecToDouble.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/VecToStream.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/VecWriter.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-/Wavetable.java/1.1.1.1/Fri Dec 10 03:29:31 2004//
-D
--- a/src/samer/units/CVS/Repository	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-/cvsroot/jslab/src/samer/units
--- a/src/samer/units/CVS/Root	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-:ext:samer@dspmac1.elec.qmul.ac.uk:/cvsroot
--- a/src/scheme/audio.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/scheme/audio.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -23,6 +23,7 @@
 
 ;;; construct DataLine.Info. args = (format [bufsize])
 (define (_dli cl args) (apply javax.sound.sampled.DataLine$Info. (cons cl args)))
+(define (_open x) (.open x) x)
 (define (target-info . args) (_dli javax.sound.sampled.TargetDataLine.class args))
 (define (source-info . args) (_dli javax.sound.sampled.SourceDataLine.class args))
 
@@ -44,14 +45,14 @@
 
 (define-method (linesrc) 				(linesrc (default-format)))
 (define-method (linesnk) 				(linesnk (default-format)))
-(define-method (linesrc fmt) 			(.open (_src (line (target-info fmt)) fmt)))
-(define-method (linesnk fmt) 			(.open (_snk (line (source-info fmt bf)) fmt))) 
-(define-method (linesrc mx fmt)		(.open (_src (line mx (target-info fmt)) fmt)))
-(define-method (linesnk mx fmt)		(.open (_snk (line mx (source-info fmt)) fmt)))
-(define-method (linesrc mx fmt bf)	(.open (_sbs bf (_src (line mx (target-info fmt bf)) fmt))))
-(define-method (linesnk mx fmt bf)	(.open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt))))
-(define-method (linesrc-buf fmt bf) (.open (_sbs bf (_src (line (target-info fmt bf)) fmt))))
-(define-method (linesnk-buf fmt bf) (.open (_sbs bf (_snk (line (source-info fmt bf)) fmt))))
+(define-method (linesrc fmt) 			(_open (_src (line (target-info fmt)) fmt)))
+(define-method (linesnk fmt) 			(_open (_snk (line (source-info fmt)) fmt))) 
+(define-method (linesrc mx fmt)		(_open (_src (line mx (target-info fmt)) fmt)))
+(define-method (linesnk mx fmt)		(_open (_snk (line mx (source-info fmt)) fmt)))
+(define-method (linesrc mx fmt bf)	(_open (_sbs bf (_src (line mx (target-info fmt bf)) fmt))))
+(define-method (linesnk mx fmt bf)	(_open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt))))
+(define-method (linesrc-buf fmt bf) (_open (_sbs bf (_src (line (target-info fmt bf)) fmt))))
+(define-method (linesnk-buf fmt bf) (_open (_sbs bf (_snk (line (source-info fmt bf)) fmt))))
 (define filesnk samer.audio.FileSink.)
 
 (define streamsrc samer.audio.StreamSource.)
@@ -72,7 +73,7 @@
 
 ;;; buffering audio input into frames with a certain hop size
 (define-method (linein size step) (linein (linesrc) size step))
-(define-method (linein (source samer.audio.AudioSource) size step)
+(define-method (linein source size step)
 	(define line (LineIn. source size step))
 	(put "LineIn" line)
 	(addtask line)
--- a/src/scheme/midi.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/scheme/midi.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,4 +1,5 @@
 (import "samer.midi.*")
+(import "javax.sound.midi.*")
 
 (define (tomidi in)
 	(letrec (
--- a/src/scheme/readline.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/scheme/readline.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -4,8 +4,9 @@
 ; redirect input to readline reader
 ;(define (set-input-port port) (set! jsint.Scheme.input$ port))
 
-(define (readline-reader prompt) 
-	(org.gnu.readline.ReadlineReader. prompt
+(define jscheme-history ".jscheme_history")
+(define (readline-reader prompt)
+	(org.gnu.readline.ReadlineReader. prompt (java.io.File. jscheme-history)
 		org.gnu.readline.ReadlineLibrary.GnuReadline$))
 
 (org.gnu.readline.Readline.initReadline "jscheme")
@@ -14,14 +15,14 @@
 (.setInput (jsint.Scheme.currentEvaluator) (jsint.InputPort. current-readline-reader))
 (define (set-prompt prompt) (.setPrompt current-readline-reader prompt))
 
-		
+
 ; this seems to stop terminal getting confused after exit
 (.addShutdownHook (Runtime.getRuntime)
-	(Thread. (lambda () 
+	(Thread. (lambda ()
 		(display "cleaning up readline.\n")
+    (org.gnu.readline.Readline.writeHistoryFile jscheme-history)
 		(org.gnu.readline.Readline.cleanup))))
-		
+
 
 ; enable completion by looking up words in jscheme's symbol table
 (org.gnu.readline.Readline.setCompleter (samer.silk.SilkCompleter.))
-(set-prompt ">")			 
--- a/src/scheme/sockets.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/scheme/sockets.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,9 +1,10 @@
+(load "streams.scm")
+
 (define (make-server) (java.net.ServerSocket. 2000))
 (define (accept s) (display "waiting for connection...\n") (.accept s))
 (define (connect host) (display "connecting...\n") (java.net.Socket. host 2000))
 (define (istream s) (.getInputStream s))
 (define (ostream s) (.getOutputStream s))
-(load "streams.scm")
 
 (define-method (send (socket java.net.Socket) (x Vec))
 	(VecToStream. x (buffer (ostream socket))))
--- a/src/scheme/streams.scm	Tue Jan 17 17:50:20 2012 +0000
+++ b/src/scheme/streams.scm	Fri Apr 05 16:26:00 2019 +0100
@@ -1,3 +1,6 @@
+(import "samer.maths.Vec")
+(import "samer.core.types.DoubleModel")
+
 (define (ifstream fn) (java.io.FileInputStream. fn))
 (define (ofstream fn) (java.io.FileOutputStream. fn))
 (define (fwriter fn) (java.io.FileWriter. fn))
--- a/src/scheme/weird.scm	Tue Jan 17 17:50:20 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-(define (sieve n pr) (if (divides n pr) pr (cons n pr)))
-(define (div n m) (equal? 0 (remainder n m)))
-(define (divides n factors)
-	(if (null? factors) #f
-		(if (div n (first factors)) #t
-			(divides n (rest factors)))))
-
-(define primeso
-	(let ((hashed (java.util.ArrayList.)))
-		(define (set n l) (.add hashed n l) l)
-
-		(.add hashed `())
-		(.add hashed `())
-		(.add hashed `(2))
-
-		(lambda (n)
-			(if (< n (.size hashed))
-				(.get hashed n)
-				(begin
-					(.ensureCapacity hashed (+ n 1))
-					(set n (sieve n (primes (- n 1)))))))))
-
-(define (accum-primes n sofar limit)
-	(if (> n limit) sofar
-		(accum-primes (+ n 1) (sieve n sofar) limit)))
-
-(define (primes limit) (accum-primes 2 () limit))
-
-; alternative is to make a big or list by mapping
-; factors to a list of procedures: (m1 m2 ..) -> ((div m1) (div m2) ...)
-
-(define (prime? n) (equal? n (first (primes n))))
-
-(define (prime-factors n)
-
-`(define (factors n)
-	(define prime-factors (prime-factors n))
-	; now make all products including 1 but excluding n
-	; this is a binary enumeration, basically
-)
-
-(define (proper-divisors n)
-
-
-(define (abundant? n)
-	(< n (apply + (factors n))))
-
-
-(define (weird? n)
-	; get factors
-	; check abundancy
-	; is n a sum of any of its factors?
-	(define sum (apply + proper-divisors))
-	(if (<= sum n) #f		; ie not abundant
-		(begin
-			(define discrep (- n sum))
-			; can we make discrep by summing divisors <= discrep
-   		)
-     )
-)
\ No newline at end of file