dsheirer / jmbe Goto Github PK
View Code? Open in Web Editor NEWJava AMBE/IMBE audio decoder
License: GNU General Public License v3.0
Java AMBE/IMBE audio decoder
License: GNU General Public License v3.0
07:14:44.566 ERROR i.g.d.d.f.c.o.ChannelOutputProcessor - Error while processing polyphase channel samples [359MB/732MB 49%]
java.lang.NullPointerException: null
at jmbe.codec.ambe.ToneGenerator.generate(ToneGenerator.java:66)
at jmbe.codec.ambe.AMBESynthesizer.getTone(AMBESynthesizer.java:84)
at jmbe.codec.ambe.AMBESynthesizer.getAudio(AMBESynthesizer.java:102)
at jmbe.codec.ambe.AMBEAudioCodec.getAudio(AMBEAudioCodec.java:58)
at jmbe.codec.ambe.AMBEAudioCodec.getAudio(AMBEAudioCodec.java:50)
at jmbe.codec.ambe.AMBEAudioCodec.getAudioWithMetadata(AMBEAudioCodec.java:72)
C:\Users\ICBus\Downloads\jmbe-5-enhancements>gradlew.bat build
> Configure project :codec
Your finished JMBE library will be located here: C:\Users\ICBus\Downloads\jmbe-5-enhancements\codec\build\libs\jmbe-1.0.0.jar
> Task :codec:compileJava FAILED
C:\Users\ICBus\Downloads\jmbe-5-enhancements\codec\src\main\java\jmbe\codec\imbe\IMBEFrame.java:27: error: package sun.util.resources is not visible
import sun.util.resources.CalendarData;
^
(package sun.util.resources is declared in module java.base, which does not export it to the unnamed module)
1 error
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':codec:compileJava'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 2s
4 actionable tasks: 1 executed, 3 up-to-date
JMBE 1.0.9
Linux 5.15.0-92
Mint 21.2
Audio stops soon after monitoring is started with stuttering and buffer issues. All other functions appear to be working normally. The terminal capture reveals:
13:29:03.446 ERROR i.g.d.a.p.AudioOutput - Error while processing audio buffers [87MB/640MB 13%] java.lang.NullPointerException: Cannot invoke "javax.sound.sampled.SourceDataLine.isRunning()" because "this.mOutput" is null at io.github.dsheirer.audio.playback.AudioOutput.checkStop(AudioOutput.java:653) at io.github.dsheirer.audio.playback.AudioOutput.processAudio(AudioOutput.java:509) at io.github.dsheirer.audio.playback.AudioOutput$AudioSegmentProcessor.run(AudioOutput.java:743) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source)
So when I pull up the Users Preference dialog and Output/Tones and just switch between Audio Output Device selections the audio will resume and then once the error repeats, switch the Source back to the original, the audio starts again. This repeats indefinitely.
Add support for AMBE codec for APCO25 Phase 2, DMR, DSTAR and NXDN
Downgrade the JMBE creator build script to use JDK 11 so that it's compatible with older versions of sdrtrunk.
Encountered an NPE while developing DMR decoder.
07:51:01.901 ERROR i.g.d.m.d.d.m.v.DMRAudioModule - Error synthesizing AMBE audio - continuing [null] [262MB/704MB 37%]
java.lang.NullPointerException: null
at jmbe.codec.ambe.ToneGenerator.generate(ToneGenerator.java:66)
at jmbe.codec.ambe.AMBESynthesizer.getTone(AMBESynthesizer.java:84)
at jmbe.codec.ambe.AMBESynthesizer.getAudio(AMBESynthesizer.java:102)
at jmbe.codec.ambe.AMBEAudioCodec.getAudio(AMBEAudioCodec.java:58)
at jmbe.codec.ambe.AMBEAudioCodec.getAudio(AMBEAudioCodec.java:50)
at jmbe.codec.ambe.AMBEAudioCodec.getAudioWithMetadata(AMBEAudioCodec.java:72)
at io.github.dsheirer.module.decode.dmr.message.voice.DMRAudioModule.produceAudio(DMRAudioModule.java:197)
at io.github.dsheirer.module.decode.dmr.message.voice.DMRAudioModule.processAudio(DMRAudioModule.java:185)
at io.github.dsheirer.module.decode.dmr.message.voice.DMRAudioModule.receive(DMRAudioModule.java:127)
at io.github.dsheirer.module.decode.dmr.message.voice.DMRAudioModule.receive(DMRAudioModule.java:57)
at io.github.dsheirer.sample.Broadcaster.broadcast(Broadcaster.java:152)
at io.github.dsheirer.sample.Broadcaster.receive(Broadcaster.java:59)
at io.github.dsheirer.module.decode.Decoder$MessageDistributor.receive(Decoder.java:103)
at io.github.dsheirer.module.decode.Decoder$MessageDistributor.receive(Decoder.java:96)
at io.github.dsheirer.module.decode.dmr.DMRMessageProcessor.dispatch(DMRMessageProcessor.java:207)
at io.github.dsheirer.module.decode.dmr.DMRMessageProcessor.receive(DMRMessageProcessor.java:197)
at io.github.dsheirer.module.decode.dmr.DMRMessageProcessor.receive(DMRMessageProcessor.java:57)
at io.github.dsheirer.module.decode.dmr.DMRMessageFramer.burstDetected(DMRMessageFramer.java:205)
at io.github.dsheirer.module.decode.dmr.DMRBurstFramer.dispatch(DMRBurstFramer.java:253)
at io.github.dsheirer.module.decode.dmr.DMRBurstFramer.receive(DMRBurstFramer.java:152)
at io.github.dsheirer.module.decode.dmr.DMRMessageFramer.receive(DMRMessageFramer.java:156)
at io.github.dsheirer.module.decode.dmr.DMRMessageFramer.receive(DMRMessageFramer.java:49)
at io.github.dsheirer.sample.Broadcaster.broadcast(Broadcaster.java:152)
at io.github.dsheirer.sample.Broadcaster.receive(Broadcaster.java:59)
at io.github.dsheirer.dsp.psk.PSKDemodulator.broadcast(PSKDemodulator.java:58)
at io.github.dsheirer.dsp.psk.DQPSKDecisionDirectedDemodulator.calculateSymbol(DQPSKDecisionDirectedDemodulator.java:88)
at io.github.dsheirer.dsp.psk.PSKDemodulator.receive(PSKDemodulator.java:115)
at io.github.dsheirer.dsp.psk.PSKDemodulator.receive(PSKDemodulator.java:89)
at io.github.dsheirer.module.decode.dmr.DMRStandardDecoder.receive(DMRStandardDecoder.java:109)
at io.github.dsheirer.module.decode.dmr.DMRStandardDecoder.receive(DMRStandardDecoder.java:44)
at io.github.dsheirer.sample.buffer.ReusableBufferBroadcaster.broadcast(ReusableBufferBroadcaster.java:42)
at io.github.dsheirer.sample.buffer.ReusableBufferBroadcaster.broadcast(ReusableBufferBroadcaster.java:23)
at io.github.dsheirer.sample.Broadcaster.receive(Broadcaster.java:59)
at io.github.dsheirer.sample.buffer.ReusableComplexBufferAssembler.flush(ReusableComplexBufferAssembler.java:158)
at io.github.dsheirer.sample.buffer.ReusableComplexBufferAssembler.receive(ReusableComplexBufferAssembler.java:132)
at io.github.dsheirer.sample.buffer.ReusableComplexBufferAssembler.receive(ReusableComplexBufferAssembler.java:144)
at io.github.dsheirer.dsp.filter.channelizer.output.TwoChannelOutputProcessor.process(TwoChannelOutputProcessor.java:117)
at io.github.dsheirer.dsp.filter.channelizer.output.ChannelOutputProcessor.processChannelResults(ChannelOutputProcessor.java:124)
at io.github.dsheirer.dsp.filter.channelizer.PolyphaseChannelSource.processSamples(PolyphaseChannelSource.java:248)
at io.github.dsheirer.source.tuner.channel.TunerChannelSource$ScheduledIntervalProcessor.run(TunerChannelSource.java:321)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
Occasionally there is an audio frame that is decoded incorrectly as a Tone frame and it's producing audio glitching or artifacts. This situation can be detected as a Tone frame that's bounded by an audio frame on either side.
Update the tone generator to only generate tone audio when there is a tone sequence, meaning that the previous frame was a tone and the current frame is a tone.
On the first tone frame, do an audio frame repeat. Since this will cause the initial tone frame to be generated as an audio frame, perhaps we can detect the start and then double the length of the generated tone when the second frame arrives.
Tried compiling on both Ununtu 18.10 and Windows 10 with same error on both
`Downloading https://services.gradle.org/distributions/gradle-5.1.1-bin.zip
.................................................................................
Unzipping C:\Users\Stuart.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn\gradle-5.1.1-bin.zip to C:\Users\Stuart.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn
Welcome to Gradle 5.1.1!
Here are the highlights of this release:
For more details see https://docs.gradle.org/5.1.1/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
Configure project :
Your finished JMBE library is here: C:\Users\Stuart\Desktop\jmbe-master\build/libs
FAILURE: Build failed with an exception.
Where:
Build file 'C:\Users\Stuart\Desktop\jmbe-master\build.gradle' line: 69
What went wrong:
A problem occurred evaluating root project 'jmbe'.
Cannot add task 'wrapper' as a task with that name already exists.
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org`
Hi!
Is there a simple way to bypass the error correction routine and be able to supply a 88 bit imbe input Vs the 144 bit.
Is there a simple code mod to bypass it?
Thanks heaps.
Reference the support thread here:
https://groups.google.com/forum/#!topic/sdrtrunk/DX_lMZUFJxI
There's a possibility that the invalid AMBE frames are incorrectly tagged as Tone frames and the library attempts to generate tone audio for the frame.
can you make it dump all data to hard drive to play back later.
something like "IdTimeDate.p25 preserving all the data transmitted.
Windows 10 x64, running elevated command prompt. Happens with both 32 and 64 creator package.
Starting: JMBE Library Creator
Created: Temporary Directory [F:\Temp\jmbe-creator2835292894781790827]
Generated: Library Path [F:\Downloads\creator-windows-x86_64-v1.0.7a\jmbe-1.0.7a.jar]
Downloading: Source Code [Version 1.0.7a]
Downloading: https://api.github.com/repos/DSheirer/jmbe/zipball/v1.0.7a
Download Complete: HTTP Status 200
Unzipping: Source Code
Failed: Unknown (General) Error Illegal char <:> at index 2: /F:/Downloads/creator-windows-x86_64-v1.0.7a/lib/creator-1.0.7a.jar
java.nio.file.InvalidPathException: Illegal char <:> at index 2: /F:/Downloads/creator-windows-x86_64-v1.0.7a/lib/creator-1.0.7a.jar
at java.base/sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
at java.base/sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at java.base/sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at java.base/sun.nio.fs.WindowsPath.parse(Unknown Source)
at java.base/sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
at java.base/java.nio.file.Path.of(Unknown Source)
at io.github.dsheirer.jmbe.creator.Creator.getLibraryClassPath(Creator.java:298)
at io.github.dsheirer.jmbe.creator.Creator.getOptions(Creator.java:244)
at io.github.dsheirer.jmbe.creator.Creator.process(Creator.java:138)
at io.github.dsheirer.jmbe.creator.Creator.createLibrary(Creator.java:412)
at io.github.dsheirer.jmbe.creator.Creator.main(Creator.java:469)
The AMBEFrame object is created twice, and hence fully processed twice. Rather than creating the AMBEFrame object and passing its reference down the line.
The get audio method used here takes frame data and creates a new AMBEFrame. However an instance of AMBEFrame is created just before this and can be passed it getAudio instead.
Another getAudio method is available that already takes an AMBEFrame object. This way the frame is not decoded, error corrected, and processed twice.
Hello,
I was having some issues compiling JMBE on various linux systems including a Raspberry Pi running Ubuntu 18.04.2 LTS (64-bit/aarch64), using Open JDK 11.0.2.
The dreaded:
* What went wrong:
Could not determine java version from '11.0.4'.
After doing some digging, I found out Gradle v4.x (what JMBE's wrapper is built with) doesn't support Open JDK 11.x. So I simply modified the build.gradle as follows. (Not pretty)
5c5,6
< sourceCompatibility = 1.8
---
> //sourceCompatibility = 1.8
> sourceCompatibility = '11'
69,70c70,71
< task wrapper(type: Wrapper) {
< gradleVersion = '4.3.1'
---
> task wrapper1(type: Wrapper) {
> gradleVersion = '5.0'
And then modified jmbe-0.3.3b/gradle/wrapper/gradle-wrapper.properties.
5c5
< distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip
---
> distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip
These changes allowed me to build JMBE without any issues on Ubuntu 18.04.2 LTS Server (64-bit/aarch64) running on a Raspberry Pi 3b+, as well as Ubuntu 18.04.2 LTS on x86_64.
Raspberry Pi: Linux RPI 4.15.0-1041-raspi2 #44-Ubuntu SMP PREEMPT Wed Jul 3 15:45:20 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux
Laptop: Linux Laptop 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
I hope this is helpful to someone, and thanks for SDRtrunk!
The main() method in the IMBEFrame class contains code that is deprecated in JDK 9. Remove the main class.
SDTrunk 0.4.0-Alpha
Love this product!
Can it do DMR?
I am using RTL2832u
running on OSX
I have tried on a Manjaro box and on Kubuntu, both fully up to date. And on both I get the following error:
(base) jason@jason-ThinkPad-X230:~/Workspace/creator-linux-x86_64-v1.0.7$ ./bin/creator Create JMBE library - starting .... Created Temporary Work Directory: /tmp/jmbe-creator12221170850678908494 Using Auto-Generated Library Path: /home/jason/Workspace/jmbe-1.0.7.jar GitHub Downloading: GitHub Release - Name:Version 1.0.7 Version: 1.0.7 HTML URL:https://github.com/DSheirer/jmbe/releases/tag/v1.0.7 Download URL:https://api.github.com/repos/DSheirer/jmbe/zipball/v1.0.7 Downloading Source Code From: https://api.github.com/repos/DSheirer/jmbe/zipball/v1.0.7 Download HTTP Status: 200 Source Code Downloaded to: /tmp/jmbe-creator12221170850678908494/DSheirer-jmbe-v1.0.7-0-g1ce0d87.zip Looking for required compile libraries here: /home/jason/Workspace/lib Error creating classpath for compile-time libraries java.nio.file.NoSuchFileException: /home/jason/Workspace/lib at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(Unknown Source) at java.base/java.nio.file.Files.newDirectoryStream(Unknown Source) at io.github.dsheirer.jmbe.creator.Creator.getLibraryClassPath(Creator.java:310) at io.github.dsheirer.jmbe.creator.Creator.getOptions(Creator.java:242) at io.github.dsheirer.jmbe.creator.Creator.process(Creator.java:137) at io.github.dsheirer.jmbe.creator.Creator.createLibrary(Creator.java:416) at io.github.dsheirer.jmbe.creator.Creator.main(Creator.java:472)
I am trying to compile jmbe-3.3a on Slackware64 14.2 I have installed the jdk 8 from oracle I have the $JAVA_HOME set properly I can build jmbe-3.2 without problems but trying 3.3a or the git master get the following output from gradle.
Task :compileJava FAILED
/root/jmbe/src/main/java/jmbe/converters/imbe/IMBEAudioConverter.java:26: error: package jmbe.iface does not exist
import jmbe.iface.AudioConverter;
^
/root/jmbe/src/main/java/jmbe/converters/imbe/IMBEAudioConverter.java:31: error: cannot find symbol
public class IMBEAudioConverter implements AudioConverter
^
symbol: class AudioConverter
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:7: error: package jmbe.iface does not exist
import jmbe.iface.AudioConversionLibrary;
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:8: error: package jmbe.iface does not exist
import jmbe.iface.AudioConverter;
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:10: error: cannot find symbol
public class JMBEAudioLibrary implements AudioConversionLibrary
^
symbol: class AudioConversionLibrary
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:59: error: cannot find symbol
public AudioConverter getAudioConverter(String codec, AudioFormat output)
^
symbol: class AudioConverter
location: class JMBEAudioLibrary
/root/jmbe/src/main/java/jmbe/converters/imbe/IMBEAudioConverter.java:79: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/converters/imbe/IMBEAudioConverter.java:93: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/converters/imbe/IMBEAudioConverter.java:99: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:12: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:27: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:34: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:40: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:46: error: method does not override or implement a method from a supertype
@OverRide
^
/root/jmbe/src/main/java/jmbe/JMBEAudioLibrary.java:58: error: method does not override or implement a method from a supertype
@OverRide
^
15 errors
FAILURE: Build failed with an exception.
Compilation failed; see the compiler error output for details.
BUILD FAILED in 3s
1 actionable task: 1 executed
I have tried using both the gradle wrapper included and installing gradle directly both produce the same result
Please update Gradle properties to use build 6.3 instead of 6.0 to resolve issues with Java 14.
distributionUrl=https://services.gradle.org/distributions/gradle-6.3-bin.zip
![image](https://user-images.githubusercontent.com/36908396/78170149-265eb700-7418-11ea-9a1b-cbf243a22451.png
AMBE tone frames are not being correctly identified so that tone audio can be generated.
I want to use this library in my own porject but when ı run gradlew.bat api command, I get "Task 'api' not found in root project 'jmbe' " eror.
After running the gradlew script I get the following output
C:\Users\KR0SIV\Desktop\jmbe-0.3.3b\jmbe-0.3.3b>gradlew.bat
Configure project :
Your finished JMBE library is here: C:\Users\KR0SIV\Desktop\jmbe-0.3.3b\jmbe-0.3.3b\build/libs
Task :help
Welcome to Gradle 4.4.
To run a build, run gradlew <task> ...
To see a list of available tasks, run gradlew tasks
To see a list of command-line options, run gradlew --help
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL in 1s
The problem is that build directory doesn't exist and no jar file was actually created.
I can compile it myself but it should be noted the script is claiming to have completed successfully when from what I can tell it created no .jar in the process.
Clicking on links to jmbe_builder.* files on "Version 0.3.2 Update 1" release page (https://github.com/DSheirer/jmbe/releases) results in "The request signature we calculated does not match the signature you provided. Check your key and signing method." error message.
Error during windows compile "Could not determine java version from '11'.
With java 11, it works editing (gradle/wrapper/gradle-wrapper.properties):
distributionUrl=https://services.gradle.org/distributions/gradle-4.10.2-all.zip
When running gradlew.bat build I see the following message but when I look in the folder I cant find the jar file (no lib or build directory)
Task :buildEnvironment
classpath
No dependencies
A web-based, searchable dependency report is available by adding the --scan option.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
Hi, I am getting this error while running SDR Trunk. I am also getting this error: JMBE audio conversion library NOT FOUND. What do these error mean and how can I repair these errors? I put the jmbe file in the same folder of sdr trunk.
I'm getting no audio when I am listening to P25-2 channels.
After some digging, I found this on the JMBE Wiki:
16:59:28.415 INFO i.g.d.a.c.m.AmbeAudioModule - AMBE CODEC successfully loaded - P25-2/DMR/NXDN audio will be available
But I never see any of that when I run the sdr-trunk file. I see the following:
i.g.d.a.c.m.ImbeAudioModule - JMBE audio conversion library IMBE CODEC successfully loaded - P25-1 audio will be available [46MB/72MB 64%]
That is the only mention of P25. I double-checked with Command + F as well.
Please excuse my lack of knowledge/proper nomenclature. I am happy to provide more details, just let me know.
When logging the library name, it's reporting 1.0.3 versus the current version.
Create an application that is fully self-contained that downloads the JMBE source code and creates the JMBE library.
Provide an application user interface that can download, compile and copy the JMBE library to a designated location to make it easier on the user to create the JMBE library.
Error when trying to build with Liberica JDK 17 (as is used with SDRtrunk).
pi@raspberrypi:~/Downloads/jmbe-1.0.7b $ sudo ./gradlew build
FAILURE: Build failed with an exception.
Where:
Settings file '/home/pi/Downloads/jmbe-1.0.7b/settings.gradle'
What went wrong:
Could not compile settings file '/home/pi/Downloads/jmbe-1.0.7b/settings.gradle'.
startup failed:
General error during semantic analysis: Unsupported class file major version 61
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.