GithubHelp home page GithubHelp logo

tmhglnd / mercury Goto Github PK

View Code? Open in Web Editor NEW
271.0 12.0 13.0 274.86 MB

A minimal and human-readable language and environment for the live coding of algorithmic electronic music.

Home Page: http://www.timohoogland.com/mercury-livecoding

License: GNU General Public License v3.0

JavaScript 2.75% Max 97.17% Nearley 0.08%
mercury mercury-environment human-readable-language language visuals sounds livecoding live-coding performance creative-coding

mercury's Introduction

๐ŸŒ• Mercury Live Coding Environment

A minimal and human-readable language for the live coding of algorithmic electronic audiovisual performances.

Mercury currently has 2 versions:

  • Original version running in Max8 (Windows/Mac only) (you're in the right place)
  • Web version running in the browser (Windows/Mac/Linux) go to this repo

๐Ÿš€ Start coding with the latest full version:

GitHub release (latest SemVer)

๐Ÿ‘พ Or sketch in the browser playground! (recommended for beginners)

๐Ÿ™ Support Mercury by becoming a Patron

๐Ÿ’ฌ Join the Discord Community!

Livecoding Performance with Mercury (photo: Zuzanna Zgierska)

๐Ÿ“‹ Table of Contents

๐Ÿ“Ÿ About

Mercury is a minimal and human-readable language for the live coding of algorithmic electronic music.

All elements of the language are designed around making code more accessible and less obfuscating for the audience. This motivation stretches down to the coding style itself which uses clear descriptive names for functions and a clear syntax. Furthermore the editor is restricted to 30 lines of code, keeping all code always visible. Mercury provides the performer with an extensive library of algorithms to generate or transform numbersequences that can modulate parameters, such as melody and rhythm, over time. The environment produces sound in conjunction with visuals. Besides looking at the code, the audience is also looking at the visuals that are reactive to the sound or generated by the sound.

It is named after te planet Mercury. Mercury rules the creation and expression of our mental processes. The planet implores us to express ourselves. Mercury is about a quick wit, quick thinking. It lets us move from one thing to the next.

Mercury is programmed in the Cycling'74 Max8 node-based creative coding environment, as an abstracted layer on the Max/MSP audio engine and with the use of Node4Max for parsing, lexing and generative algorithms and Jitter/OpenGL for the visuals and the responsive texteditor.

Mercury uses the Total Serialism NodeJS package available on npmjs.com. This package contains an extensive library of algorithmic composition methods.

Screenshot of the Mercury environment

๐ŸŽฎ Features Overview

Quick access to playback of samples and change timing and tempo of samples or synthesizers

set tempo 89

new sample kick_909 time(1/4)
new sample hat_909 time(3/16)

Make rhythmic patterns with sequences of numbers and probabilities

list loBeat [1 0 0 1 0.5]
list hiBeat [0 1 0.2 0]

new sample tabla_lo time(1/8) play(loBeat)
new sample tabla_hi time(1/8) play(hiBeat)

Generate psuedorandom melodic content for a synthesizer in a range and set a scale

set scale minor d
set randomSeed 31415

list melody random(16 0 24)

new synth saw note(melody) time(1/16) shape(4 100)

Design sounds with various effects

new sample chimes time(2) speed(-0.25) fx(reverb 0.3 15) fx(drive 10) fx(lfo 1/8 sine)

Easily give multiple instruments the same effects

new sample chimes time(2)
new sample harp_down time(3)
new sample gong_lo time(5)

set all fx(lfo 1/16) fx(delay) fx(reverb 0.5 11)

Generate sequences algorithmically to compose complex structures and choose from an extensive library of algorithms to work with

set scale minor a 

list rhythm euclidean(32 13)

list melody spread(5 0 24)
list melody palinedrome(melody)
list melody clone(melody 0 5 7 3)
list melody lace(melody melody)

new synth triangle note(melody 1) shape(1 80) play(rhythm)

Control external midi devices or send midi to other applications and use clock sync

set midi getPorts
//=> prints the available devices to the console
new midi "Your Awesome Midi Device" time(1/4) note(7 1) length(100) sync(on)

Control other environments via OSC-messages

list params [0.25 0.5 0.75]

new emitter osc address(yourDevice) theParam(params) time(1/4)

// emits => /yourDevice/theParam 0.25
//          /yourDevice/theParam 0.5
//          /yourDevice/theParam 0.75
//          /yourDevice/theParam 0.25
//          etc...

Easily control parameters in Mercury via external OSC-messages

new synth triangle fx(reverb '/extOSC/verbAmount') fx(filter low '/extOSC/cutoff' 0.4) time(1) shape(1 1000)

AND MANY MORE (TO COME...)

๐Ÿ”ญ Vision / Goals

  • Provide creatives with a quick and hands-on coding environment/language to expres, communicate and improvise livecoded works.
  • Use the environment as a teaching tool for:
    • introduction to (electronic) music
    • algorithmic composition
    • sequencing and pattern generating
    • sound design
    • creative coding and live coding
  • Provide creatives with an hands-on language to create realtime processes
    • code sound and music
    • code visuals and let them react to sound
  • Provide creatives with an extensive library of algorithmic composition techniques
    • released as a seperate Node Package titled Total-Serialism
    • included in the Mercury environment through Node4Max
  • Provide creatives with a multi-purpose non-linear-sequencer
    • use OSC to communicate with other platforms
    • use MIDI to communicate with other platforms and devices
  • Provide creatives with an easy sampler/synthesizer for sounddesign and composition
    • use external OSC to control parameters in the sampler/synthesis
    • use external MIDI devices and messages to play the sampler/synthesizers (coming soon...)
  • Release a browser version and standalone Electron app, making getting started easier
  • Collaborate in Mercury via the browser with Flok and code music together
  • Extending the Mercury users-community and including extensions on the environment in the master-branch

โญ๏ธ watch and star this repo to keep up-to-date with the latest changes whenever they're made

๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป Collaborative Coding

You can code together in Mercury using the amazing Flok live coding environment in the browser. The easiest way to get started is by combining Flok with the Mercury Playground, but you can also combine Flok with the Mercury Max8 version.

๐Ÿ’ป Install

OR

  • ๐Ÿค“ I'll just download and figure it out myself
$ cd ~/Documents/Max\ 8/Projects
$ git clone http://github.com/tmhglnd/mercury
$ cd mercury
$ open mercury_ide/mercury_ide.maxproj

โš  Troubleshooting

It could be that you are having issues with Mercury. Please follow the steps below:

โŒจ๏ธ External Editor

Instead of using the editor built in the Max Mercury version you can also load an external textfile or use a plugin for Pulsar (previously Atom).

๐Ÿ“– Documentation

Full explanation of all the possibilities in Mercury:

๐Ÿ’ป System Requirements

These system requirements are recommended to install and run Max and Mercury on your computer. Lower specs may work but it's not guaranteed. A dedicated Graphics Card (GPU) is also recommended to run the visual side of Mercury smoothly (the text-editor runs on the graphics card as well).

OS CPU RAM
Mac OSX 10.13 (at least 10.11.6+) Intel i5 processor 8 GB
Windows 10 (7 or 8 may work) Intel i5 or AMD mult-core processor 8 GB

๐ŸŽต Sounds

Most sounds in Mercury are downloaded from freesound.org and are licensed with Creative Commons Attribution or Creative Commons 0 licenses. If not downloaded from freesound it is made sure that the license allows to redistribute the sounds via the Mercury environment and that you can use them in your projects. A list of all the available sounds and the original sample can be found here:

๐Ÿ” Further reading

๐Ÿ‘พ Made with Mercury

๐Ÿ“ Contribute

Contributions to the Mercury environment are much appreciated in whatever form they come! You can contribute in any of the following ways:

  • Add suggestions, bugs or feature-requests to the issues
  • Make additions or changes to the Documentation, Tutorials, Examples and any other text in this repository
  • Adjust the source code or make bugfixes and add features by forking and sending a pull request (see the Guidelines)

In order to make changes to various types of source code files you will need the following:

  • patchers - Requires Max8 environment and license to edit/modify/save the patchers of this project.
  • JS code - Requires a standard code-editor (eg. VSCode or Atom) to edit/modify/save the JS code.
  • GenExpr Code - Requires a standard code-editor (eg. VSCode or Atom) to edit/modify/save the GenExpr code.

Guidelines

In order to receive your contribution please follow these steps:

  1. Fork this repository (click fork in the top right)
  2. Clone the repository to your computer git clone https://github.com/<this-is-you>/<forked-repo>.git
  3. Branch the Fork git checkout -b <name-your-branch>
  4. Make any changes/additions to the code or docs
  5. Add, commit and push your changes git add . git commit -a git push origin <your-branch-name>
  6. Go to your forked repo in the browser and click compare & pull request, then create pull request
  7. Please add a comment to clarify what you did and why

All steps with examples and images

๐Ÿ”‹ Powered By

๐Ÿ™ Thanks

  • Roald van Dillewijn for working together on osc and midi functionalities combined with his Digilog modified guitar-pedals
  • Guillem Gongora Moral for using Mercury as a composition tool and sharing valuable feedback in the process
  • Anne Veinberg for working with Mercury and a Mercury extensions for the CodeKlavier project
  • Rafaele Maria Andrade for collaboration on networked performance between Mercury and Knurl
  • Repo banner image by Annebel Bunt
  • Live performance image by Zuzanna Zgierska

โœจ Inspiration

During the development of Mercury (both the playground and the full version) I've found inspiration in many other live coding environments, practices and other platforms. Some of these are:

  • Hydra - Live coding visual synthesizer by Olivia Jack
  • Sema - Live coding language design platform combined with Machine Learning
  • MIMIC Project - a web platform for the artistic exploration of musical machine learning and machine listening.
  • Tidal - Live coding of patterns
  • Sonic Pi - The live coding synth for everyone
  • Tone.js - Webaudio framework for programming synths and sequencers
  • Nearley - Parsing toolkit

๐Ÿ“„ Licenses

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

mercury's People

Contributors

linalab avatar tmhglnd avatar warmfilly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mercury's Issues

Ring thin when scale applied

I was thoroughly testing the transformation methods of the rings and came across something that could be improved. When applying a scale to a ring and thinning said ring some of the notes are repeated even though having the same scale note applied to them.
I.e.:
set scale minor c ring notes (0 1 2 3 4 5 6 7) ring notes thin(notes)
sounds like:
ring notes (0 0 2 3 3 5 7 7)
when it should maybe sound like:
ring notes (0 2 3 5 7)

I think it's a matter of applying the scale to the ring before transforming it, but I think in thin() doesn't make sense that some notes are repeated after the transformation.

Work with specific Mercury filetype (.mcy)

Could be nice to introduce a specific Mercury filetype *.mcy? This has a few benefits:

  • easily search for your mercury code files by searching for .mcy extension
  • specific syntax highlighting for other code editors like Atom/Sublime/VSCode that automatically recognizes the filetype and apply it.

Designing a syntax highlighting has to be researched for this.

Ring every() accepting floats

I was wondering if ring every() could accept floats (or fractions) to have rings played other than every full bars.

Convert indentation tabs to spaces

When loading a textfile with tabs used for indentation the indents are not converted to spaces correctly and there introduce an error in the result of the code on screen:

new synth sine name(s)
	set s note(notes 1) time(1/16) shape(1 300)
^^^^ tab of 4 spaces wide 

results in:

new synth sine name(s)
set s note(notes 1) time(1/16) shape(1 300) 

should result in:

new synth sine name(s)
    set s note(notes 1) time(1/16) shape(1 300)
^^^^ tab of 4 spaces wide

OSC output instrument

Add the ability to create a named osc-instrument that can send modulated parameters over time to specified addresses. Add set functions for ip-address and port input/output number.

Example:

set ip 127.0.0.1
set in 8000
set out 9000

ring myVals [0 0.3 0.6 1]
new osc name(myOsc) time(1/16) send(amp myVals)

Resulting output over time:

/myOsc/amp 0
/myOsc/amp 0.3
/myOsc/amp 0.6
/myOsc/amp 1
/myOsc/amp 0
/myOsc/amp 0.3
...

Support for del key

Implement a way to delete characters placed on the right of the cursor to be mapped, for example, with the del ascii code value

Multiple ring methods in same line

It could be useful to save space to be able to choose transformational ring methods to be called right after generative methods. For example:
ring notes spreadInclusive(4 0 3)
ring notes palin(notes)
to
ring notes spreadInclusive(4 0 3) palin(notes)
or something similar.
There might be a better option to call for the spreadInclusive() generated ring in the palin().

OSC ip and port settings

Add function for OSC ip and port settings. Add this to user interface settings and code functionality.

Example:

set ip 127.0.0.1
// set ip localhost

set in 8000 //incoming osc-messages port
set out 9000 //outgoing osc-messages port

Text overflowing at right margin

Exact same thing that happened at the bottom of the window (#29), but also happens when reached a large amount of characters before the line automatically switches.

Store preferences in local folder

Preferences are now overwritten everytime users pull the newest version of Mercury. Preferences should be stored locally in a folder somewhere under ~/Documents/Mercury/ for example

L-system sequence generator

Add javascript function that allows to generate an Lindemayer-System tree sequence based on predefined rules, axiom and number of generations. Useful for procedurally generating of rhythms, melodies and other sequential data.

Example:

// syntax: linden(<nth-generation> <axiom> <rule-1> <rule-2>)

ring mySystem linden(6 0 [0 0 1] [1 0])
// returns: [0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0]

OSC input address as function arguments

Add functionality to allow for osc-addresses as argument in functions of instruments.
For example using a gyroscope axis to control cutoff in a filter:

new synth saw note(0 0) name(bass)
    set bass fx(filter /gyro/x 0.5)

Feedback and suggestions for the Tutorials

I'm currently working on a tutorial section. This should be a low-entry section that walks the user through all the basic steps of coding in Mercury, but also introduces some of the basic musical concepts like measure, rhythm, pitch, notation, scales, algorithmic composition, serialism. Currently meanly focussed on the modern western music notation but i'm definitely interested to extend this to other systems (although I realise this is something that also has to be implemented in the code first, related to #39 ).

Go to Tutorials

Any suggestions, feedback, corrections, ideas are more then welcome in the comments or via pull request! ๐Ÿ™

Addition of Scala files

An addition for scale could include the use of the Scala format due to the immense library of already existing scales in .scl format.

The music concepts of scale, mode and tuning are somewhat similar to each other depending on the source. There should be a clear distinction for naming the different functions within Mercury.
I.e.: scale for all the pitches within a division of the octave (12-TET), mode for the intervalic choice of said pitches (Major), leaving tuning unused, meaning the correction of the intonation in a specific note.

Method and keyword naming inconsistencies

Some methods/keywords work with camelCase, others have under_scores, some have only lowercase. This is inconsistent and should all follow one convention.

Suggested convention:

function()
long_name()

keyword
long_keyword

Saving file with .txt adds extra .txt extension

When saving a code file and the filename has xxx.txt when saving it adds an extra .txt resulting in xxx.txt.txt. If the .txt is not provided it doesn't ask for replace if the filename has the same name as an existing file because it doesn't recognize it without the .txt

Collision between set scale and detune()

Detune() still appears to be working in the latest version but it causes weird glitches with set scale, probably due to the latter applying the scale to the integers of the list, but not the decimals.
Would be useful to think what the function of detune() is within the environment: what should happen if set scale and detune() appear together.
And detune() needs to be added to the documentation.

Add MP3 sample support

MP3 files don't seem to be supported as a sample type. When i try to load the two attached samples called dog_1.wav and dog_2.mp3, the first file is loaded if i use the 'Show loaded sounds' command, but the second one is not loaded.

dogs.zip

Shift modifier not working properly Win10

Shift modifiers to access characters above numbers don't work anymore (i.e: ( is reported as 9). It seems to be due to a switch from taking the input from ASCII values in quickKey.maxpat.
Sticking to ASCII values might also solve the issue with area specific keyboard layouts (my [ is accessed through a AltGr modifier key in the spanish keyboard layout, but still reporting 91 as the ASCII value).

Multiple arguments for OSC sends

Currently the osc output does not support sending multiple arguments as an array over the same address. Ideally this would be possible, similar as to providing arguments for other functions.

ring val1 [0.25 0.5 0.75]
ring val2 [3 1 4]

new emitter osc name(myOSC) time(1/4) 
	set myOSC aMessage(val1 val2)

// emits => /myOSC/aMessage 0.25 3
            /myOSC/aMessage 0.5 1
            /myOSC/aMessage 0.75 4
            /myOSC/aMessage 0.25 3
            etc...

adsr arguments inconsistency

The shape() method should generate an envelope with the following arguments:

No note-off message is triggered

shape(<attack><release>)

Note-off message is triggered after attack+decay time is passed

shape(<attack><decay><release>)

Freeze FX

An FFT-freezer that records a few FFT frames freezes the instrument sound an play's back the frames. A trigger of 1 retriggers the frame-recording.

fx(freeze <trigger> <interpolate-between-trigger> <framecount>)
ring triggerFreeze [1 0 0 1]
new sample bowl_hi time(1) fx(freeze triggerFreeze)

Ring methods documentation update

Update of the documentation needed, specially the ring methods. Maybe there could be a merge or redirect to the total-serialism library in this field.

Only display cmd floating window

Be able to hide the audio and rendering screen if needed leaving only the cmd in a floating window (useful for when checking other windows in the background, like the documentation).

Simple math operations to rings

I was wondering if it's possible to perform simple math operations to existing rings.
For example I have:
ring pattern (0 1 2 4)
and I thought it would be useful to generate other rings from this one, like (multiplying by 0.25):
ring probabilities (0 0.25 0.5 1)

"Speed" argument in samples does nothing

Pretty self explanatory:
new sample clap_909 name(clap) g(1) set clap time(1/2) speed(1)
and
new sample clap_909 name(clap) g(1) set clap time(1/2) speed(2)
sound exactly the same.

individual volume for instruments within one group

Hey master Sun,

Just playing around with Mercury and perhaps Im doing something wrong, but perhaps not.
I think it would be good if one could set the volume of the individual instruments in a group, even if that group gets an overall volume attribute. Like below. I tried gain and volume just to see if it made a difference but couldnt spot one.

Thanks, your trusty tester,
wooloogooloo

new sample kick_sub time(1/4) name(base)
new sample snare_dub time(1/8) gain(0.1) name(base)
new sample gong_lo time (1/1) name(base) volume(0.1)
new sample harp_down time (2/1) name(base)
set base gain(0.3)

Multi-speaker output and panning

Allow for more than 2 speakers as output in the DAC.

Design choices:

  • Can amount of speakers dynamically be changed?
  • What will the speaker position argument be for the panning?
    • -1 to 1 (where 0 is center front, -1 or 1 are full left/right)
    • 0 to number-of-speakers-1 where an integer means fully panned in selected speaker
    • vector-based-panning where the position is a polar-coordinate (angle, distance)
    • all of the above and preference can be changed.

Order of variables in shape()

The order of the variables in shape() is not as mentioned in the documentation (attack in ms, sustain in ms and release in ms), but it's seems to work like this (attack in ms, sustain in ms, gain of sustain in 0-1 and release in ms). Release cannot be called without calling gain of sustain.

Envelope modulation with ring bug

Fix the bug where the decay time from the envelope can not be modulated with a ring of values if the attack time is not modulated. This is because the total note-duration is only calculated on the modulation of the attack time.

Initial font for editor must be mono-spaced

Make sure the initial selected font for the editor is a mono-spaced font that is installed on the Operating System. Is it possible to ship custom fonts with the project and make sure those fonts can be selected by the OpenGL text object?

Express envelope duration as relative division instead of milliseconds?

Having a way of expressing the duration of envelopes,shape()-method, in relative divisions can give a better feel for how long a sound will last over time, and also gives the possibility to change the tempo of the piece and stretching/shrinking the envelope with it.

example

set tempo 100
new synth saw note(0 2) shape(1/16 1/4 1) time(2)
//=> is similar to: shape(150 600 2400)
set tempo 140
new synth saw note(0 2) shape(1/16 1/4 1) time(2)
//=> is similar to: shape(107 429 1714)

Questions:

  • should setting the envelope in milliseconds still be possible?
  • should this be a different function?
  • should an extra argument make sure if it chooses between ms or timevalue?

Formant Filter FX

Add a formant filtering effect with possible modulation and morphing between vowels. Function naming could be fx(formant), fx(vowel), or maybe more understandibly fx(speak).

new synth saw fx(speak e)

multiple vowels

ring vowels [a e i o]

new synth saw fx(speak vowels 1/4)

Visuals not working

Sound and editor work normal, however the visuals in the background are not showing.
Thank you for this amazing and fun music coding tool

Text overflowing in 1920x1080 Win10

The text in the console overflows at the bottom and doesn't properly adjust when reaching more than 23 lines in 1920x1080 resolution (Win10). It seems to be a problem with the different screen ratios setup (also doesn't work in other ratios except 4:3). Specially annoying when working in fullscreen where the ratio cannot be adjusted manually.

History not finding the aproppiate path

jit.textfile: ~/Desktop//mercuryHistory/mrcry_2020.05.04_15.35.22.txt: error -1 creating file
Pretty self explanatory. I guess it's still in development :)

File -> New

Menu button File -> New does nothing, maybe should clear the console

Fix shortkeys for windows and non-US/UK keyboards

Most of the alt-shortkeys are not working on windows or non-US/UK keyboards. This needs to be fixed. Most likely by choosing a preset of keyboard layout or having the option to make custom keyboard shortcut bindings.

Code after set [name] does not evaluate

In
new sample snare_909 name(snr) g(1)
set snr time(1/2)
the code after set doesn't evaluate. Either it is a name() recognition problem or a set problem.
new sample snare_909 name(snr) g(1) time(1/2)
does work.

Automatically log code

Add an option to automatically store the current code everytime the code gets executed. This can be stored under ~/Documents/Mercury/logs for example.

Samples with uppercase extension are not loaded

I have a folder with two samples called 808_kick.wav and 808_snare.WAV. Note the uppercase extension on the second file. If i load this folder the second sample doesn't appear to be loaded, and also doesn't show up if i use the 'Show loaded sounds' command.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.