Vladimir Smirnov

A page for my personal and learning projects

Some projects:

GN-Launchpad

A JSON-configurable host environment for the Novation Launchpad

This is an in-progress project.

GN-Launchpad is a host and configuration platform for the Novation Launchpad written in TypeScript with JavaScript compilation target. The goal of the project is to create a JSON-configurable host that allows users to quickly and with great flexibility configure the behavior of their Launchpad for custom applications within any MIDI environment. The design follows a JSON-configurable “batteries included, but removable” approach, which provides sensible defaults, but also allows quick and extensible configuration. Current MIDI host environment targets include Cycling74 Max and Chrome, while theoretically any MIDI-capable JavaScript environment is possible.

The idea is to be able to configure the launchpad behavior with a simple JSON configuration like below. The below configuration means toggle one button on and off, but only one per row.


{
    "scenes": [{
        "sceneName": "toggler",
        "sceneIndex": 0,
        "handlers": [{
            "type": "xyButton",
            "row": "all",
            "col": "all",
            "handlerStates": [{
                "index": 0,
                "color": "off",
                "transitions": [{
                    "eventType": "push",
                    "toIndex": 1
                }]
            },
            {
                "index": 1,
                "color": "red",
                "transitions": [{
                    "eventType": "push",
                    "toIndex": 0
                }],
                "sideEffects": [{
                    "row": "same",
                    "col": "all",
                    "color": "off"
                }]
            }]
        }]
        
    }]
}
                

KiteAudio

A UI widget library built in vanilla JavaScript using the SVG canvas
Project accepted to the 2018 Web Audio Conference

The purpose of this project was to provide a zero-dependency library of SVG-based UI widgets that could be used for building audio applications.

The development of the project addressed three areas of concern: how to structure the code base and class design to facilitate long-term development; how to structure state management for consistent behavior and easy-to-implement feature changes; how to structure the audio modules to facilitate behavior sharing, confinement of responsibilities, and flexibility in an audio application architecture.

The codebase is structured around abstract base classes which implement the core functionality, state management, and initialization, and additional functionality is provided by mixins. Each specific class is required to conform to the contract specified by the base class. This codebase structure allows for robust long-term development, ensuring that each new implemented module relies on a solid base of core functionality, and is concerned only with implementing the specific behavior required by the module. State management is implemented using a single-source-of-truth approach where component state is stored in the simplest possible representation and propagated throughout the component on each state change. This design allows for predictable behavior, business logic that is easy to reason about, and confinement of behavior so that feature changes may be trivially implemented without breaking the component.

Anvil

A music database browser and manager built with Spring and React

Anvil is a music database browser and manager built with Spring and React. It allows users to search for music artists, place them in collections, like them, and recommend them to other users. It was built as a learning project.

Weathervane

A weather forecast app built with AngularJS
Technologies: AngularJS

A weather forecast app built with AngularJS. Uses the Google Maps API to geocode a variety of location formats (i.e. address, zipcode, landmark name etc.) and the Apixu API to grab forecast data. Provides current weather, 5, and 10-day forecasts. Has a custom background animation using the html canvas.

Moolti

A tiny in-progress library for canvas-based animation

The idea for this library is to be able to create canvas animations declaratively by specifying 'anchors' that define how the animation evolves over time, creating figures, and attaching properties of these figures to the anchors.

For example, creating an arc that travels along a linear path from (0, 0) to (500, 100) with velocity 0.1 would look something like this:


let animator = new Animator(canvas);

let anchor1 = animator.createAnchor({},
    Transform()
        .getDistance({"v": 0.1})
        .positionOnLinearPath({"x0": 0, "y0": 0, "x1": 500, "y1": 100})
        .go()
);

let arc = new Arc(animator, {
    fillStyle: () => "rgb(" + anchor1.linked("d")() + ",100,120",
    cx: anchor1.linked("x"),
    cy: anchor1.linked("y"),
    r: 10
});
                

JS Object Constraint

A tool to constrain JavaScript object properties to specified limists

Used to apply a constraining function to a state object of arbitrary nestedness, whose leaves are values that need to be constrained (i.e. to min or max values). In order for ConstraintSpec to work properly, it's constructor must be given an object that exactly mirrors the nested structure of the object to be constrained, with the leaves containing instances of the Constraint class.

Watch-n-mirror

A bash tool for development under Linux to watch a directory for changes and mirror it to a different directory with arbitrary ownership and privileges. Requires inotifywait.

This is a simple-as-pie bash tool. It watches a directory for changes and copies changes to a second directory with arbitrary ownership and priviliges that you set. This is useful if you want to, for exmaple, work on a project as one user, and have it served by a server that is running as a different user when the server needs to be able to modify files in the project.

Max Tools

An ongoing collection of Max tools

Max is my go-to tool for building anything audio-related. Besides its own rich collection of objects, it allows integrating JavaScript, Java, Python, as well as compiling Max objects from C or C++. I've recently started to be more organized about maintaining tools I build for max and putting them in this repo.

Genna

A generative sampler instrument built in Max
A generative instrument built in Max that I used for part of my dissertation at Duke. It generates rhythm based on a probability histogram, generates notes based on a 'kernel' and 'offset' definition, and manipulates samples by rhythmic granular splicing. You can hear some of the results here.

JHF Photo-booth

Max and JavaScript code for an interactive art installation for John Hope Franklin's centennial celebration

When I worked with Slippage, one of our tasks was to create an installation for John Hope Franklin's centennial celebration at the Nasher Museum. The installation would resemble a photo-booth, where instead of taking photos, visitors would record their testimonies regarding the influence of John Hope Franklin's work on them. There were some distinguished guests, including the activist Angela Davis. The 'photo-booth' would integrate the testimonies in real-time into a video collage playing on the outside, interspersed with John Franklin's own interviews. I used Max and JavaScript for the project, with Max's Jitter components handling the video processing, and JavaScript to provide the master controller that links the different elements.