Giter Club home page Giter Club logo

sonic-pi-autocomplete's Introduction

Atom + Sonic Pi Integration with Ultra Cow Powers!!!

This plugin allows remote controlling Sonic Pi via Atom.

Sonic Pi is fun to play with, but its built-in editor relies a lot on ctrl-i to get real stuff done. With this plugin, you can livecode without having to worry about nitty things like which parameters can you slide or control, or what are the currently available parameters for all synths, fx, samples, and functions, or whether 1 stood for linear slide_shape for one parameter, or saw mod_wave for another.

sonic-pi-atom-screenshot

Usage

Start up Sonic Pi or the Sonic Pi server (over UDP), and get live coding in Atom!

Note that the support for executing huge files with the Play Huge File command, will only work with Sonic Pi 2.11 excluding commit https://github.com/samaaron/sonic-pi/commit/16a55e7657ea5d457c70e7594adcdcbb2b9e1ccd (meaning you'll have to compile it from source though, good luck!)

Default Key Bindings

Key Binding Action Description
alt-r sonic-pi-autocomplete:play-file Sends content of the currently open buffer to Sonic Pi for instant playback
ctrl-alt-r sonic-pi-autocomplete:play-selection Sends currently selected text to Sonic Pi for instant playback
alt-shift-r sonic-pi-autocomplete:stop Tells Sonic Pi to stop all playback
unbinded sonic-pi-autocomplete:play-huge-file Plays a large file that can't be sent over a single OSC message

Get Started

Basic Usage

Try typing

play :c4,

Now type adsr, and hit enter to use the snippet. Use tab and shift-tab to jump between the attack, decay, sustain and release values. Change them if you want!

Now key in amp: 0.5, or some other slidable parameter. You'll know if it's slidable if there's something on the right saying 'Slide Syn. Pms.' (Sliding Synth Parameters).

Now key in slideshape, hit enter, and bam! There will now be amp_slide and amp_slide_shape parameters

Key in the value for amp_slide, and amp_slide_shape... oh wait... was 1 a linear slide or a stepped slide?

Who cares! Just type in linear, cubic, or whatever you want, hit enter and you should have something like this:

play :c4, attack: 0.01, decay: 0, sustain: 1, release: 0.1, amp: 0.5, amp_slide: 1, amp_slide_shape: 1

Add x = in front to get something like this: x = play :c4, attack: 0.01, ....

Try typing control on a new line, you should be able to see x as a :beep synth instance. Now you'll be able to see what parameters you can control or slide for :beep.

This works for all synths, the most recent use_synth available in the current scope will determine the synth played. This also works if you use x = synth :tb303, :c4, attack: 0.01 or whatever function that returns a synth instance.

Parsing directives

Aliasing #@

control

Sometimes, you may want to use control a lot, and you end up defining a helper function like this:

def c(*args)
  control *args
end

Now if you want to alias this shortened c function with the original control function, you can create a comment on a new line that goes like this:

#@ control c

And now whenever you are in scope of the alias comment, you will be able to get autocompletion for c just as you would in control

play

Here's another aliasing directive that can come in handy: #@ play <alias_name> <optional: parameter index to start suggestions> <optional: synth_used>

This will let you control at which parameter of the aliased alias_name function will autocompletions for the synth parameters appear for either the current synth, (or synth_used, if provided). It doesn't have to be for the play command, as demonstrated in the example below:

drone = synth :dark_ambience, :c2, sustain: 56, release: 8

#@ play ctldrone 0 :dark_ambience
define :ctldrone do |*args|
  control drone, *args
end
sleep 4
ctldrone note: :eb2
Note instances

It's also possible to alias identifiers with instances of synths by using #@ :synthname identifier

Here's an example:

define :rndplay do
  return play rand * 120
end

use_synth #$

In the same way, if you have a function that changes synths, but the use_synth is not in scope, you can use #$ :synthname like this:

define :waw do
  use_synth :tb303
end

waw
#$ :tb303
play :c4, cutoff: 80, cutoff_min: 60

to get autocompletions for the tb303 synth.


Full list of autocomplete features:

Functions, Names and Parameters:
  • All Synth symbols
  • All FX symbols
  • All Sample symbols
  • All functions
  • All parameters + parameter type
Smart Snippets
  • adsr
    • attack, decay, sustain, release
  • asr
    • attack, sustain, release`
  • pluck
    • sustain: 0, release
  • slide
    • adds a _slide setting for the parameter just before the cursor
  • slidecurve
    • same as slide but also adds a _slide_curve parameter
  • slideshape
    • same as slide but also adds a _slide_shape parameter
  • All integer enumerations representing wave shapes in wave shape / slide shape parameters
    • step
    • linear
    • sine
    • welch
    • squared
    • cubed
    • saw
    • pulse
    • triangle
    • sine

What's new?

v.2.1: Minor fixes

  • Enumeration autocomplete now works in all places (in control fn, with_fx)
  • Fixed NPEs (argh)
  • Fixed aliases not working sometimes

v.2.0: Huge Update

  • Much smarter autocompletion.
  • Support for ALL samples, synths, fxs, functions, and their respective params
  • Smart scope-based contextual autocompletion with pre-parsing features
  • Added autocompletion directives
  • Previously, sending OSC messages over UDP to the Sonic Pi server directly limited the maximum file size
  • Sonic Pi v.2.11 (still under dev) now supports loading files into the buffer and playing it directly with the /save-and-run-buffer-via-local-file OSC command
  • This feature can be accessed via the command palatte (ctrl-shift-P) as Play Huge File, but you can create your own keybindings.

v1.0: The fork

  • rkh seems to have stopped development on atom-sonic, so I decided to reincarnate it as sonic-pi-autocomplete
  • Improved autocomplete, now with context sensing
  • Fixed not able to run code, creds to this patch
  • Added necessary snippets from live_loops to amp_slide: 1, amp_slide_curve: 3
  • Updated all synth names, samples, fx to the latest release: Sonic Pi v2.10
  • Added placeholders for things like note_slide_shape, because memorizing 0: Step, 1: Linear, etc... won't cut

TODO:

  • Add autocomplete for cue and sync
  • Allow function aliasing directives to be placed right before functions so that the redundant alias name parameter needn't be there.

sonic-pi-autocomplete's People

Contributors

euwbah avatar rkh avatar mariadeanton avatar

Stargazers

 avatar Odysseas (Ody) Krystalakos avatar  avatar kleerkoat avatar Patrick Kennedy avatar Scinawa avatar Fly Chang avatar Derek Kniffin avatar Robbie Jacobs avatar  avatar Emlyn Corrin avatar

Watchers

James Cloos avatar  avatar Scinawa avatar

Forkers

inncee81

sonic-pi-autocomplete's Issues

Atom completely crashes under Arch

If this plugin is active, atom will simply crash on startup. The error message is: "The editor has crashed."

Atom version info:

Atom    : 1.44.0
Electron: 4.2.12
Chrome  : 69.0.3497.128
Node    : 10.11.0

apm info:

Community Packages (36) /home/beto/.atom/packages
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] (disabled)
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] (disabled)
├── [email protected]
└── [email protected]

System Info:

OS: Arch Linux x86_64 
Host: Primebook C11B 
Kernel: 5.5.7-arch1-1 
CPU: Intel Celeron N3350 (2) @ 2.400GHz 
GPU: Intel HD Graphics 500 
Memory: 3764MiB 

Please tell me if the coredump might be relevant to you, so I can attach it. It references libpthread, electron, and lastly sonic-pi autocomplete.

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.