toxiclibs 0.4.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/.mvn/extensions.xml +8 -0
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/.travis.yml +23 -0
- data/CHANGELOG.md +7 -0
- data/COPYING.md +14 -0
- data/Gemfile +10 -0
- data/LICENSE +675 -0
- data/README.md +9 -7
- data/Rakefile +25 -81
- data/examples/README.md +5 -0
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ReplicaBold.ttf +0 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +74 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +43 -0
- data/examples/physics_type.rb +77 -0
- data/examples/povmesh/data/mask.jpg +0 -0
- data/examples/povmesh/ftest.rb +59 -0
- data/examples/povmesh/mesh_align.rb +47 -0
- data/examples/povmesh/tentacle.rb +71 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/examples/spherical_harmonics_mesh.rb +50 -0
- data/examples/test_rect.rb +32 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +72 -22
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.rb +63 -0
- data/pom.xml +124 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/audio/AudioBuffer.java +229 -0
- data/src/toxi/audio/AudioSource.java +288 -0
- data/src/toxi/audio/DecompressInputStream.java +159 -0
- data/src/toxi/audio/IIRFilter.java +197 -0
- data/src/toxi/audio/JOALUtil.java +388 -0
- data/src/toxi/audio/MultiTimbralManager.java +162 -0
- data/src/toxi/audio/SoundListener.java +154 -0
- data/src/toxi/audio/SynthUtil.java +109 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +127 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +28 -0
- metadata +442 -31
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.audio;
|
|
29
|
+
|
|
30
|
+
import com.jogamp.openal.AL;
|
|
31
|
+
import toxi.geom.Vec3D;
|
|
32
|
+
import toxi.math.MathUtils;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A wrapper for {@link AudioBuffer}s and similar to the built in JOAL
|
|
36
|
+
* net.java.games.sound3d.Source, though less restrictive. The class extends
|
|
37
|
+
* {@link Vec3D} and so can be used to position the sound in 3D space (provided
|
|
38
|
+
* the underlying audio hardware does support 3D audio). Unfortunately due to
|
|
39
|
+
* OpenAL's limitations only mono samples can be positioned in that way. Stereo
|
|
40
|
+
* samples will can only manipulated in terms of gain/volume.
|
|
41
|
+
*
|
|
42
|
+
* <p>
|
|
43
|
+
* If the position of an AudioSource is changed via the public x,y,z vector
|
|
44
|
+
* components, the <code>updatePosition()</code> method needs to be called
|
|
45
|
+
* afterwards in order to reflect the changes in the OpenAL context.
|
|
46
|
+
*/
|
|
47
|
+
public class AudioSource extends Vec3D {
|
|
48
|
+
|
|
49
|
+
protected AL al;
|
|
50
|
+
|
|
51
|
+
protected AudioBuffer buffer;
|
|
52
|
+
|
|
53
|
+
protected final int id;
|
|
54
|
+
protected int size;
|
|
55
|
+
|
|
56
|
+
protected final float[] position = { 0.0f, 0.0f, 0.0f };
|
|
57
|
+
protected final float[] velocity = { 0.0f, 0.0f, 0.0f };
|
|
58
|
+
protected final float[] direction = { 0.0f, 0.0f, 0.0f };
|
|
59
|
+
|
|
60
|
+
protected int[] alResult = new int[1];
|
|
61
|
+
|
|
62
|
+
protected boolean isLooping;
|
|
63
|
+
|
|
64
|
+
public AudioSource(AL al, int id) {
|
|
65
|
+
this(al, id, null);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public AudioSource(AL al, int id, AudioBuffer buf) {
|
|
69
|
+
super();
|
|
70
|
+
this.al = al;
|
|
71
|
+
this.id = id;
|
|
72
|
+
setBuffer(buf);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Deletes this source, and free its resources. Note, this method does NOT
|
|
77
|
+
* release the associated audio buffer. If you want to remove a source
|
|
78
|
+
* including its wave data use
|
|
79
|
+
* {@link JOALUtil#deleteSource(AudioSource, boolean)} instead.
|
|
80
|
+
*
|
|
81
|
+
* @return true, if source was removed successfully
|
|
82
|
+
*/
|
|
83
|
+
public boolean delete() {
|
|
84
|
+
stop();
|
|
85
|
+
setBuffer(null);
|
|
86
|
+
al.alDeleteSources(1, new int[] { id }, 0);
|
|
87
|
+
return al.alGetError() == AL.AL_NO_ERROR;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Gets the buffer associated with this source.
|
|
92
|
+
*
|
|
93
|
+
* @return the buffer associated with this source
|
|
94
|
+
*/
|
|
95
|
+
public AudioBuffer getBuffer() {
|
|
96
|
+
return buffer;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Gets the number of buffers already processed on this source.
|
|
101
|
+
*
|
|
102
|
+
* @return the number of buffers already processed on this source.
|
|
103
|
+
*/
|
|
104
|
+
public int getBuffersProcessed() {
|
|
105
|
+
al.alGetSourcei(id, AL.AL_BUFFERS_PROCESSED, alResult, 0);
|
|
106
|
+
return alResult[0];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public final float[] getDirection() {
|
|
110
|
+
return direction;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public final int getID() {
|
|
114
|
+
return id;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public final int getOffset() {
|
|
118
|
+
al.alGetSourcei(id, AL.AL_SAMPLE_OFFSET, alResult, 0);
|
|
119
|
+
return alResult[0];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public final float[] getPosition() {
|
|
123
|
+
return position;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public final float[] getVelocity() {
|
|
127
|
+
return velocity;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public final boolean isLooping() {
|
|
131
|
+
return isLooping;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public final int length() {
|
|
135
|
+
return size;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public AudioSource play() {
|
|
139
|
+
if (buffer != null) {
|
|
140
|
+
al.alSourcePlay(id);
|
|
141
|
+
}
|
|
142
|
+
return this;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public AudioSource rewind() {
|
|
146
|
+
if (buffer != null) {
|
|
147
|
+
al.alSourceRewind(id);
|
|
148
|
+
}
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Sets the buffer associated with this source.
|
|
154
|
+
*
|
|
155
|
+
* @param buffer
|
|
156
|
+
* the buffer associated with this source
|
|
157
|
+
* @return
|
|
158
|
+
*/
|
|
159
|
+
public final AudioSource setBuffer(AudioBuffer buffer) {
|
|
160
|
+
this.buffer = buffer;
|
|
161
|
+
if (buffer != null) {
|
|
162
|
+
al.alSourcei(id, AL.AL_BUFFER, buffer.getID());
|
|
163
|
+
size = buffer.getSampleSize();
|
|
164
|
+
} else {
|
|
165
|
+
al.alSourcei(id, AL.AL_BUFFER, AL.AL_NONE);
|
|
166
|
+
size = 0;
|
|
167
|
+
}
|
|
168
|
+
return this;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
public AudioSource setDirection(float xx, float yy, float zz) {
|
|
172
|
+
direction[0] = xx;
|
|
173
|
+
direction[1] = yy;
|
|
174
|
+
direction[2] = zz;
|
|
175
|
+
al.alSourcefv(id, AL.AL_DIRECTION, direction, 0);
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
public AudioSource setDirection(float[] d) {
|
|
180
|
+
if (d.length == 3) {
|
|
181
|
+
direction[0] = d[0];
|
|
182
|
+
direction[1] = d[1];
|
|
183
|
+
direction[2] = d[2];
|
|
184
|
+
al.alSourcefv(id, AL.AL_DIRECTION, direction, 0);
|
|
185
|
+
} else {
|
|
186
|
+
throw new IllegalArgumentException("wrong number of array elements");
|
|
187
|
+
}
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
public AudioSource setDirection(Vec3D dir) {
|
|
192
|
+
return setDirection(dir.x, dir.y, dir.z);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
public AudioSource setGain(float gain) {
|
|
196
|
+
al.alSourcef(id, AL.AL_GAIN, gain);
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public AudioSource setLooping(boolean state) {
|
|
201
|
+
isLooping = state;
|
|
202
|
+
al.alSourcei(id, AL.AL_LOOPING, (state ? AL.AL_TRUE : AL.AL_FALSE));
|
|
203
|
+
return this;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
public AudioSource setOffset(int off) {
|
|
207
|
+
off = MathUtils.clip(off, 0, size - 1);
|
|
208
|
+
al.alSourcei(id, AL.AL_SAMPLE_OFFSET, off);
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public AudioSource setPitch(float pitch) {
|
|
213
|
+
al.alSourcef(id, AL.AL_PITCH, pitch);
|
|
214
|
+
return this;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public AudioSource setPosition(float xx, float yy, float zz) {
|
|
218
|
+
position[0] = xx;
|
|
219
|
+
position[1] = yy;
|
|
220
|
+
position[2] = zz;
|
|
221
|
+
al.alSourcefv(id, AL.AL_POSITION, position, 0);
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
public AudioSource setPosition(float[] p) {
|
|
226
|
+
if (p.length == 3) {
|
|
227
|
+
x = position[0] = p[0];
|
|
228
|
+
y = position[1] = p[1];
|
|
229
|
+
z = position[2] = p[2];
|
|
230
|
+
al.alSourcefv(id, AL.AL_POSITION, position, 0);
|
|
231
|
+
} else {
|
|
232
|
+
throw new IllegalArgumentException("wrong number of array elements");
|
|
233
|
+
}
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
public AudioSource setPosition(Vec3D p) {
|
|
238
|
+
return setPosition(p.x, p.y, p.z);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public AudioSource setReferenceDistance(float d) {
|
|
242
|
+
al.alSourcef(id, AL.AL_REFERENCE_DISTANCE, d);
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
public AudioSource setVelocity(float xx, float yy, float zz) {
|
|
247
|
+
velocity[0] = xx;
|
|
248
|
+
velocity[1] = yy;
|
|
249
|
+
velocity[2] = zz;
|
|
250
|
+
al.alSourcefv(id, AL.AL_VELOCITY, velocity, 0);
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
public AudioSource setVelocity(float[] v) {
|
|
255
|
+
if (v.length == 3) {
|
|
256
|
+
velocity[0] = v[0];
|
|
257
|
+
velocity[1] = v[1];
|
|
258
|
+
velocity[2] = v[2];
|
|
259
|
+
al.alSourcefv(id, AL.AL_VELOCITY, velocity, 0);
|
|
260
|
+
} else {
|
|
261
|
+
throw new IllegalArgumentException("wrong number of array elements");
|
|
262
|
+
}
|
|
263
|
+
return this;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
public AudioSource setVelocity(Vec3D p) {
|
|
267
|
+
return setVelocity(p.x, p.y, p.z);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public AudioSource stop() {
|
|
271
|
+
al.alSourceStop(id);
|
|
272
|
+
return this;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@Override
|
|
276
|
+
public String toString() {
|
|
277
|
+
return "AudioSource: id=" + id
|
|
278
|
+
+ (buffer != null ? " buffer=" + buffer.toString() : "");
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
public AudioSource updatePosition() {
|
|
282
|
+
position[0] = x;
|
|
283
|
+
position[1] = y;
|
|
284
|
+
position[2] = z;
|
|
285
|
+
al.alSourcefv(id, AL.AL_POSITION, position, 0);
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
package toxi.audio;
|
|
28
|
+
|
|
29
|
+
import java.io.FilterInputStream;
|
|
30
|
+
import java.io.IOException;
|
|
31
|
+
import java.io.InputStream;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* <p>
|
|
35
|
+
* Convert A-Law or u-Law byte stream into mono PCM byte stream
|
|
36
|
+
* </p>
|
|
37
|
+
*
|
|
38
|
+
* <code>
|
|
39
|
+
* static AudioFormat alawformat= new AudioFormat(AudioFormat.Encoding.ALAW,8000,8,1,1,8000,false);
|
|
40
|
+
* static AudioFormat ulawformat= new AudioFormat(AudioFormat.Encoding.ULAW,8000,8,1,1,8000,false);
|
|
41
|
+
* </code>
|
|
42
|
+
* <p>
|
|
43
|
+
* PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian
|
|
44
|
+
* </p>
|
|
45
|
+
* <code>static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false);</code>
|
|
46
|
+
*
|
|
47
|
+
* <p>
|
|
48
|
+
* From: Mathematical Tools in Signal Processing with C++ and Java Simulations
|
|
49
|
+
* by Willi-Hans Steeb International School for Scientific Computing
|
|
50
|
+
* </p>
|
|
51
|
+
*/
|
|
52
|
+
public class DecompressInputStream extends FilterInputStream {
|
|
53
|
+
|
|
54
|
+
private static final int[] ALAWTABLE = { 0x80ea, 0x80eb, 0x80e8, 0x80e9, 0x80ee,
|
|
55
|
+
0x80ef, 0x80ec, 0x80ed, 0x80e2, 0x80e3, 0x80e0, 0x80e1, 0x80e6,
|
|
56
|
+
0x80e7, 0x80e4, 0x80e5, 0x40f5, 0xc0f5, 0x40f4, 0xc0f4, 0x40f7,
|
|
57
|
+
0xc0f7, 0x40f6, 0xc0f6, 0x40f1, 0xc0f1, 0x40f0, 0xc0f0, 0x40f3,
|
|
58
|
+
0xc0f3, 0x40f2, 0xc0f2, 0x00aa, 0x00ae, 0x00a2, 0x00a6, 0x00ba,
|
|
59
|
+
0x00be, 0x00b2, 0x00b6, 0x008a, 0x008e, 0x0082, 0x0086, 0x009a,
|
|
60
|
+
0x009e, 0x0092, 0x0096, 0x00d5, 0x00d7, 0x00d1, 0x00d3, 0x00dd,
|
|
61
|
+
0x00df, 0x00d9, 0x00db, 0x00c5, 0x00c7, 0x00c1, 0x00c3, 0x00cd,
|
|
62
|
+
0x00cf, 0x00c9, 0x00cb, 0xa8fe, 0xb8fe, 0x88fe, 0x98fe, 0xe8fe,
|
|
63
|
+
0xf8fe, 0xc8fe, 0xd8fe, 0x28fe, 0x38fe, 0x08fe, 0x18fe, 0x68fe,
|
|
64
|
+
0x78fe, 0x48fe, 0x58fe, 0xa8ff, 0xb8ff, 0x88ff, 0x98ff, 0xe8ff,
|
|
65
|
+
0xf8ff, 0xc8ff, 0xd8ff, 0x28ff, 0x38ff, 0x08ff, 0x18ff, 0x68ff,
|
|
66
|
+
0x78ff, 0x48ff, 0x58ff, 0xa0fa, 0xe0fa, 0x20fa, 0x60fa, 0xa0fb,
|
|
67
|
+
0xe0fb, 0x20fb, 0x60fb, 0xa0f8, 0xe0f8, 0x20f8, 0x60f8, 0xa0f9,
|
|
68
|
+
0xe0f9, 0x20f9, 0x60f9, 0x50fd, 0x70fd, 0x10fd, 0x30fd, 0xd0fd,
|
|
69
|
+
0xf0fd, 0x90fd, 0xb0fd, 0x50fc, 0x70fc, 0x10fc, 0x30fc, 0xd0fc,
|
|
70
|
+
0xf0fc, 0x90fc, 0xb0fc, 0x8015, 0x8014, 0x8017, 0x8016, 0x8011,
|
|
71
|
+
0x8010, 0x8013, 0x8012, 0x801d, 0x801c, 0x801f, 0x801e, 0x8019,
|
|
72
|
+
0x8018, 0x801b, 0x801a, 0xc00a, 0x400a, 0xc00b, 0x400b, 0xc008,
|
|
73
|
+
0x4008, 0xc009, 0x4009, 0xc00e, 0x400e, 0xc00f, 0x400f, 0xc00c,
|
|
74
|
+
0x400c, 0xc00d, 0x400d, 0x0056, 0x0052, 0x005e, 0x005a, 0x0046,
|
|
75
|
+
0x0042, 0x004e, 0x004a, 0x0076, 0x0072, 0x007e, 0x007a, 0x0066,
|
|
76
|
+
0x0062, 0x006e, 0x006a, 0x002b, 0x0029, 0x002f, 0x002d, 0x0023,
|
|
77
|
+
0x0021, 0x0027, 0x0025, 0x003b, 0x0039, 0x003f, 0x003d, 0x0033,
|
|
78
|
+
0x0031, 0x0037, 0x0035, 0x5801, 0x4801, 0x7801, 0x6801, 0x1801,
|
|
79
|
+
0x0801, 0x3801, 0x2801, 0xd801, 0xc801, 0xf801, 0xe801, 0x9801,
|
|
80
|
+
0x8801, 0xb801, 0xa801, 0x5800, 0x4800, 0x7800, 0x6800, 0x1800,
|
|
81
|
+
0x0800, 0x3800, 0x2800, 0xd800, 0xc800, 0xf800, 0xe800, 0x9800,
|
|
82
|
+
0x8800, 0xb800, 0xa800, 0x6005, 0x2005, 0xe005, 0xa005, 0x6004,
|
|
83
|
+
0x2004, 0xe004, 0xa004, 0x6007, 0x2007, 0xe007, 0xa007, 0x6006,
|
|
84
|
+
0x2006, 0xe006, 0xa006, 0xb002, 0x9002, 0xf002, 0xd002, 0x3002,
|
|
85
|
+
0x1002, 0x7002, 0x5002, 0xb003, 0x9003, 0xf003, 0xd003, 0x3003,
|
|
86
|
+
0x1003, 0x7003, 0x5003, };
|
|
87
|
+
|
|
88
|
+
private static final int[] ULAWTABLE = { 0x8482, 0x8486, 0x848a, 0x848e, 0x8492,
|
|
89
|
+
0x8496, 0x849a, 0x849e, 0x84a2, 0x84a6, 0x84aa, 0x84ae, 0x84b2,
|
|
90
|
+
0x84b6, 0x84ba, 0x84be, 0x84c1, 0x84c3, 0x84c5, 0x84c7, 0x84c9,
|
|
91
|
+
0x84cb, 0x84cd, 0x84cf, 0x84d1, 0x84d3, 0x84d5, 0x84d7, 0x84d9,
|
|
92
|
+
0x84db, 0x84dd, 0x84df, 0x04e1, 0x04e2, 0x04e3, 0x04e4, 0x04e5,
|
|
93
|
+
0x04e6, 0x04e7, 0x04e8, 0x04e9, 0x04ea, 0x04eb, 0x04ec, 0x04ed,
|
|
94
|
+
0x04ee, 0x04ef, 0x04f0, 0xc4f0, 0x44f1, 0xc4f1, 0x44f2, 0xc4f2,
|
|
95
|
+
0x44f3, 0xc4f3, 0x44f4, 0xc4f4, 0x44f5, 0xc4f5, 0x44f6, 0xc4f6,
|
|
96
|
+
0x44f7, 0xc4f7, 0x44f8, 0xa4f8, 0xe4f8, 0x24f9, 0x64f9, 0xa4f9,
|
|
97
|
+
0xe4f9, 0x24fa, 0x64fa, 0xa4fa, 0xe4fa, 0x24fb, 0x64fb, 0xa4fb,
|
|
98
|
+
0xe4fb, 0x24fc, 0x64fc, 0x94fc, 0xb4fc, 0xd4fc, 0xf4fc, 0x14fd,
|
|
99
|
+
0x34fd, 0x54fd, 0x74fd, 0x94fd, 0xb4fd, 0xd4fd, 0xf4fd, 0x14fe,
|
|
100
|
+
0x34fe, 0x54fe, 0x74fe, 0x8cfe, 0x9cfe, 0xacfe, 0xbcfe, 0xccfe,
|
|
101
|
+
0xdcfe, 0xecfe, 0xfcfe, 0x0cff, 0x1cff, 0x2cff, 0x3cff, 0x4cff,
|
|
102
|
+
0x5cff, 0x6cff, 0x7cff, 0x88ff, 0x90ff, 0x98ff, 0xa0ff, 0xa8ff,
|
|
103
|
+
0xb0ff, 0xb8ff, 0xc0ff, 0xc8ff, 0xd0ff, 0xd8ff, 0xe0ff, 0xe8ff,
|
|
104
|
+
0xf0ff, 0xf8ff, 0x0000, 0x7c7d, 0x7c79, 0x7c75, 0x7c71, 0x7c6d,
|
|
105
|
+
0x7c69, 0x7c65, 0x7c61, 0x7c5d, 0x7c59, 0x7c55, 0x7c51, 0x7c4d,
|
|
106
|
+
0x7c49, 0x7c45, 0x7c41, 0x7c3e, 0x7c3c, 0x7c3a, 0x7c38, 0x7c36,
|
|
107
|
+
0x7c34, 0x7c32, 0x7c30, 0x7c2e, 0x7c2c, 0x7c2a, 0x7c28, 0x7c26,
|
|
108
|
+
0x7c24, 0x7c22, 0x7c20, 0xfc1e, 0xfc1d, 0xfc1c, 0xfc1b, 0xfc1a,
|
|
109
|
+
0xfc19, 0xfc18, 0xfc17, 0xfc16, 0xfc15, 0xfc14, 0xfc13, 0xfc12,
|
|
110
|
+
0xfc11, 0xfc10, 0xfc0f, 0x3c0f, 0xbc0e, 0x3c0e, 0xbc0d, 0x3c0d,
|
|
111
|
+
0xbc0c, 0x3c0c, 0xbc0b, 0x3c0b, 0xbc0a, 0x3c0a, 0xbc09, 0x3c09,
|
|
112
|
+
0xbc08, 0x3c08, 0xbc07, 0x5c07, 0x1c07, 0xdc06, 0x9c06, 0x5c06,
|
|
113
|
+
0x1c06, 0xdc05, 0x9c05, 0x5c05, 0x1c05, 0xdc04, 0x9c04, 0x5c04,
|
|
114
|
+
0x1c04, 0xdc03, 0x9c03, 0x6c03, 0x4c03, 0x2c03, 0x0c03, 0xec02,
|
|
115
|
+
0xcc02, 0xac02, 0x8c02, 0x6c02, 0x4c02, 0x2c02, 0x0c02, 0xec01,
|
|
116
|
+
0xcc01, 0xac01, 0x8c01, 0x7401, 0x6401, 0x5401, 0x4401, 0x3401,
|
|
117
|
+
0x2401, 0x1401, 0x0401, 0xf400, 0xe400, 0xd400, 0xc400, 0xb400,
|
|
118
|
+
0xa400, 0x9400, 0x8400, 0x7800, 0x7000, 0x6800, 0x6000, 0x5800,
|
|
119
|
+
0x5000, 0x4800, 0x4000, 0x3800, 0x3000, 0x2800, 0x2000, 0x1800,
|
|
120
|
+
0x1000, 0x0800, 0x0000, };
|
|
121
|
+
|
|
122
|
+
private int[] table = null;
|
|
123
|
+
|
|
124
|
+
public DecompressInputStream(InputStream in, boolean useALaw)
|
|
125
|
+
throws IOException {
|
|
126
|
+
super(in);
|
|
127
|
+
table = (useALaw) ? ALAWTABLE : ULAWTABLE;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@Override
|
|
131
|
+
public int read() throws IOException {
|
|
132
|
+
throw new IOException(getClass().getName()
|
|
133
|
+
+ ".read() :\n\tDo not support simple read().");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@Override
|
|
137
|
+
public int read(byte[] b) throws IOException {
|
|
138
|
+
return read(b, 0, b.length);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@Override
|
|
142
|
+
public int read(byte[] b, int off, int len) throws IOException {
|
|
143
|
+
byte[] inb;
|
|
144
|
+
int value;
|
|
145
|
+
|
|
146
|
+
inb = new byte[len >> 1]; // get A-Law or u-Law bytes
|
|
147
|
+
len = in.read(inb);
|
|
148
|
+
if (len == -1) {
|
|
149
|
+
return -1;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (int i = 0; i < len; i++) {
|
|
153
|
+
value = table[inb[i] & 0x00FF];
|
|
154
|
+
b[off++] = (byte) ((value >> 8) & 0x00FF); // little-endian
|
|
155
|
+
b[off++] = (byte) (value & 0x00FF);
|
|
156
|
+
}
|
|
157
|
+
return len << 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.audio;
|
|
29
|
+
|
|
30
|
+
import toxi.math.MathUtils;
|
|
31
|
+
import toxi.math.SinCosLUT;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* This class provides a simple IIR filter implementation with one of lowpass,
|
|
35
|
+
* highpass or bandpass characteristics. The class can filter individual samples
|
|
36
|
+
* or entire signal buffers. The filter function always has this form:
|
|
37
|
+
*
|
|
38
|
+
* <pre>
|
|
39
|
+
* y = 1 / a0 * (b0 * x0 + b1 * x1 + b2 * x2 - a1 * q1 - a2 * q2)
|
|
40
|
+
* </pre>
|
|
41
|
+
*
|
|
42
|
+
* http://en.wikipedia.org/wiki/Infinite_impulse_response
|
|
43
|
+
*/
|
|
44
|
+
public class IIRFilter {
|
|
45
|
+
|
|
46
|
+
public enum Type {
|
|
47
|
+
LOWPASS, HIGHPASS, BANDPASS;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
protected static final SinCosLUT SIN_TABLE = new SinCosLUT(0.05f);
|
|
51
|
+
|
|
52
|
+
protected final Type type;
|
|
53
|
+
|
|
54
|
+
protected float b0, b1, b2, a0, a1, a2, alpha;
|
|
55
|
+
protected float out1, out2, in1, in2;
|
|
56
|
+
|
|
57
|
+
protected final float sampleRate;
|
|
58
|
+
protected final float sampleRateRadians;
|
|
59
|
+
|
|
60
|
+
protected float decay = 0.999f;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param type
|
|
64
|
+
* @param sampleRate
|
|
65
|
+
*/
|
|
66
|
+
public IIRFilter(Type type, float sampleRate) {
|
|
67
|
+
this.type = type;
|
|
68
|
+
this.sampleRate = sampleRate;
|
|
69
|
+
sampleRateRadians = MathUtils.TWO_PI / sampleRate;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Just calculates the amplitude of the filtered signal, but doesn't
|
|
74
|
+
* actually apply the filter.
|
|
75
|
+
*
|
|
76
|
+
* @param in
|
|
77
|
+
* @return amplitude
|
|
78
|
+
*/
|
|
79
|
+
public float calculateAmplitude(float[] in) {
|
|
80
|
+
float amp = 0;
|
|
81
|
+
for (int i = 0; i < in.length; i++) {
|
|
82
|
+
final float yn = a0
|
|
83
|
+
* (b0 * in[i] + b1 * in1 + b2 * in2 - a1 * out1 - a2 * out2);
|
|
84
|
+
in2 = in1;
|
|
85
|
+
in1 = in[i];
|
|
86
|
+
out2 = out1;
|
|
87
|
+
out1 = yn;
|
|
88
|
+
if (amp < MathUtils.abs(yn)) {
|
|
89
|
+
amp = yn;
|
|
90
|
+
} else {
|
|
91
|
+
amp *= decay;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return amp;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public IIRFilter clear() {
|
|
98
|
+
in1 = in2 = 0;
|
|
99
|
+
out1 = out2 = 0;
|
|
100
|
+
return this;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Applies filter to a single sample value.
|
|
105
|
+
*
|
|
106
|
+
* @param in
|
|
107
|
+
* @return filtered sample
|
|
108
|
+
*/
|
|
109
|
+
public float filter(float in) {
|
|
110
|
+
final float yn = a0
|
|
111
|
+
* (b0 * in + b1 * in1 + b2 * in2 - a1 * out1 - a2 * out2);
|
|
112
|
+
in2 = in1;
|
|
113
|
+
in1 = in;
|
|
114
|
+
out2 = out1;
|
|
115
|
+
out1 = yn;
|
|
116
|
+
return yn;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Destructively filters a the given signal buffer. The original samples are
|
|
121
|
+
* overwritten.
|
|
122
|
+
*
|
|
123
|
+
* @param in
|
|
124
|
+
* @return amplitude of filtered signal
|
|
125
|
+
*/
|
|
126
|
+
public float filter(float[] in) {
|
|
127
|
+
float amp = 0;
|
|
128
|
+
for (int i = 0; i < in.length; i++) {
|
|
129
|
+
final float yn = a0
|
|
130
|
+
* (b0 * in[i] + b1 * in1 + b2 * in2 - a1 * out1 - a2 * out2);
|
|
131
|
+
in2 = in1;
|
|
132
|
+
in1 = in[i];
|
|
133
|
+
out2 = out1;
|
|
134
|
+
out1 = yn;
|
|
135
|
+
in[i] = yn;
|
|
136
|
+
|
|
137
|
+
if (amp < MathUtils.abs(in[i])) {
|
|
138
|
+
amp = in[i];
|
|
139
|
+
} else {
|
|
140
|
+
amp *= decay;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return amp;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @return the decay
|
|
148
|
+
*/
|
|
149
|
+
public float getDecay() {
|
|
150
|
+
return decay;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Initializes the filter to the given cutoff frequency and Q (resonance)
|
|
155
|
+
* settings. This function needs to be called at least once before the
|
|
156
|
+
* filter can be used.
|
|
157
|
+
*
|
|
158
|
+
* @param freq
|
|
159
|
+
* @param q
|
|
160
|
+
* @return itself
|
|
161
|
+
*/
|
|
162
|
+
public IIRFilter init(final float freq, float q) {
|
|
163
|
+
float theta = sampleRateRadians * freq;
|
|
164
|
+
float si = SIN_TABLE.sin(theta);
|
|
165
|
+
float co = SIN_TABLE.cos(theta);
|
|
166
|
+
alpha = si / q;
|
|
167
|
+
a0 = 1f / (1 + alpha);
|
|
168
|
+
a1 = -2 * co;
|
|
169
|
+
a2 = 1 - alpha;
|
|
170
|
+
switch (type) {
|
|
171
|
+
case LOWPASS:
|
|
172
|
+
b0 = b2 = (1f - co) * 0.5f;
|
|
173
|
+
b1 = 1f - co;
|
|
174
|
+
break;
|
|
175
|
+
case HIGHPASS:
|
|
176
|
+
b0 = b2 = (1f + co) * 0.5f;
|
|
177
|
+
b1 = -(1f + co);
|
|
178
|
+
break;
|
|
179
|
+
case BANDPASS:
|
|
180
|
+
b0 = si * 0.5f;
|
|
181
|
+
b1 = 0;
|
|
182
|
+
b2 = -si * 0.5f;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
return this;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @param decay
|
|
190
|
+
* the decay to set
|
|
191
|
+
* @return itself
|
|
192
|
+
*/
|
|
193
|
+
public IIRFilter setDecay(float decay) {
|
|
194
|
+
this.decay = decay;
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
}
|