Giter VIP home page Giter VIP logo

orca's Introduction

ORCΛ

Orca is an esoteric programming language designed to quickly create procedural sequencers, in which every letter of the alphabet is an operation, where lowercase letters operate on bang, uppercase letters operate each frame.

This application is not a synthesizer, but a livecoding environment capable of sending MIDI, OSC & UDP to your audio/visual interfaces, like Ableton, Renoise, VCV Rack or SuperCollider.

If you need help, visit the chatroom, join the forum or watch a tutorial.

Install & Run

If you wish to use Orca inside of Electron, follow these steps:

git clone https://github.com/hundredrabbits/Orca.git
cd Orca/desktop/
npm install
npm start

Operators

To display the list of operators inside of Orca, use CmdOrCtrl+G.

  • A add(a b): Outputs sum of inputs.
  • B subtract(a b): Outputs difference of inputs.
  • C clock(rate mod): Outputs modulo of frame.
  • D delay(rate mod): Bangs on modulo of frame.
  • E east: Moves eastward, or bangs.
  • F if(a b): Bangs if inputs are equal.
  • G generator(x y len): Writes operands with offset.
  • H halt: Halts southward operand.
  • I increment(step mod): Increments southward operand.
  • J jumper(val): Outputs northward operand.
  • K konkat(len): Reads multiple variables.
  • L less(a b): Outputs smallest of inputs.
  • M multiply(a b): Outputs product of inputs.
  • N north: Moves Northward, or bangs.
  • O read(x y read): Reads operand with offset.
  • P push(len key val): Writes eastward operand.
  • Q query(x y len): Reads operands with offset.
  • R random(min max): Outputs random value.
  • S south: Moves southward, or bangs.
  • T track(key len val): Reads eastward operand.
  • U uclid(step max): Bangs on Euclidean rhythm.
  • V variable(write read): Reads and writes variable.
  • W west: Moves westward, or bangs.
  • X write(x y val): Writes operand with offset.
  • Y jymper(val): Outputs westward operand.
  • Z lerp(rate target): Transitions operand to input.
  • * bang: Bangs neighboring operands.
  • # comment: Halts a line.

IO

  • : midi(channel octave note velocity length): Sends a MIDI note.
  • % mono(channel octave note velocity length): Sends monophonic MIDI note.
  • ! cc(channel knob value): Sends MIDI control change.
  • ? pb(channel value): Sends MIDI pitch bench.
  • ; udp: Sends UDP message.
  • = osc(path): Sends OSC message.
  • $ self: Sends ORCA command.

MIDI

The MIDI operator : takes up to 5 inputs('channel, 'octave, 'note, velocity, length).

For example, :25C, is a C note, on the 5th octave, through the 3rd MIDI channel, :04c, is a C# note, on the 4th octave, through the 1st MIDI channel. Velocity is an optional value from 0(0/127) to g(127/127). Note length is the number of frames during which a note remains active. See it in action with midi.orca.

MIDI MONO

The MONO operator % takes up to 5 inputs('channel, 'octave, 'note, velocity, length).

This operator is very similar to the default Midi operator, but each new note will stop the previously playing note, would its length overlap with the new one. Making certain that only a single note is ever played at once, this is ideal for monophonic analog synthesisers that might struggle to dealing with chords and note overlaps.

MIDI CC

The MIDI CC operator ! takes 3 inputs('channel, 'knob, 'value).

It sends a value between 0-127, where the value is calculated as a ratio of 36, over a maximum of 127. For example, !008, is sending 28, or (8/36)*127 through the first channel, to the control mapped with id0. You can press enter, with the ! operator selected, to assign it to a controller. By default, the operator sends to CC64 and up, the offset can be changed with the command cc:0, to set the offset to 0.

MIDI PITCHBEND

The MIDI PB operator ? takes 3 inputs('channel, 'lsb, 'msb).

It sends two different values between 0-127, where the value is calculated as a ratio of 36, over a maximum of 127. For example, ?008, is sending an MSB of 28, or (8/36)*127 and an LSB of 0 through the first midi channel.

MIDI BANK SELECT / PROGRAM CHANGE

This is a command (see below) rather than an operator and it combines the MIDI program change and bank select functions.

The syntax is pg:channel;msb;lsb;program. Channel is 0-15, msb/lsb/program are 0-127, but program will automatically be translated to 1-128 by the MIDI driver. program typically corresponds to a "patch" selection on a synth. Note that msb may also be identified as "bank" and lsb as "sub" in some applications (like Ableton Live).

msb and lsb can be left blank if you only want to send a simple program change. For example, pg:0;;;63 will set the synth to patch number 64 (without changing the bank)

UDP

The UDP operator ; locks each consecutive eastwardly ports. For example, ;hello, will send the string "hello", on bang, to the port 49160 on localhost. In commander, use udp:7777 to select the custom UDP port 7777, and ip:127.0.0.12 to change the target IP. UDP is not available in the browser version of Orca.

You can use the listener.js to test UDP messages. See it in action with udp.orca.

OSC

The OSC operator = locks each consecutive eastwardly ports. The first character is used for the path, the following characters are sent as integers using the base36 Table. In commander, use osc:7777 to select the custom OSC port 7777, and ip:127.0.0.12 to change the target IP. OSC is not available in the browser version of Orca.

For example, =1abc will send 10, 11 and 12 to /1, via the port 49162 on localhost; =a123 will send 1, 2 and 3, to the path /a. You can use the listener.js to test OSC messages. See it in action with osc.orca or try it with SonicPi.

Advanced Controls

Some of Orca's features can be controlled externally via UDP though port 49160, or via its own command-line interface. To activate the command-line prompt, press CmdOrCtrl+K. The prompt can also be used to inject patterns or change settings.

Project Mode

You can quickly inject orca files into the currently active file, by using the command-line prompt — Allowing you to navigate across multiple files like you would a project. Press CmdOrCtrl+L to load multiple orca files, then press CmdOrCtrl+B and type the name of a loaded .orca file to inject it.

Default Ports

UDP Input OSC Input UDP Output OSC Output
49160 None 49161 49162

Commands

All commands have a shorthand equivalent to their first two characters, for example, write can also be called using wr. You can see the full list of commands here.

  • play Plays program.
  • stop Stops program.
  • run Runs current frame.
  • bpm:140 Sets bpm speed to 140.
  • apm:160 Animates bpm speed to 160.
  • frame:0 Sets the frame value to 0.
  • skip:2 Adds 2, to the current frame value.
  • rewind:2 Removes 2, to the current frame value.
  • color:f00;0f0;00f Colorizes the interface.
  • find:aV Sends cursor to string aV.
  • select:3;4;5;6 Move cursor to position 3,4, and select size 5:6(optional).
  • inject:pattern;12;34 Inject the local file pattern.orca, at 12,34(optional).
  • write:H;12;34 Writes glyph H, at 12,34(optional).
  • time Prints the time, in minutes seconds, since 0f.
  • midi:1;2 Set Midi output device to #1, and input device to #2.
  • udp:1234;5678 Set UDP output port to 1234, and input port to 5678.
  • osc:1234 Set OSC output port to 1234.

Base36 Table

Orca operates on a base of 36 increments. Operators using numeric values will typically also operate on letters and convert them into values as per the following table. For instance Do will bang every 24th frame.

0 1 2 3 4 5 6 7 8 9 A B
0 1 2 3 4 5 6 7 8 9 10 11
C D E F G H I J K L M N
12 13 14 15 16 17 18 19 20 21 22 23
O P Q R S T U V W X Y Z
24 25 26 27 28 29 30 31 32 33 34 35

Transpose Table

The midi operator interprets any letter above the chromatic scale as a transpose value, for instance 3H, is equivalent to 4A.

0 1 2 3 4 5 6 7 8 9 A B
_ _ _ _ _ _ _ _ _ _ A0 B0
C D E F G H I J K L M N
C0 D0 E0 F0 G0 A0 B0 C1 D1 E1 F1 G1
O P Q R S T U V W X Y Z
A1 B1 C2 D2 E2 F2 G2 A2 B2 C3 D3 E3

Companion Applications

  • Pilot, a companion synth tool.
  • Aioi, a companion to send complex OSC messages.
  • Estra, a companion sampler tool.
  • Gull, a companion sampler, slicer and synth tool.
  • Sonic Pi, a livecoding environment.
  • Remora, a ESP32 Led controller firmware.

Links

Extras

  • This application supports the Ecosystem Theme.
  • Download and share your patches on PatchStorage.
  • Support this project through Patreon.
  • See the License file for license rights and limitations (MIT).
  • Pull Requests are welcome!

orca's People

Contributors

bcgreen24 avatar ctcutler avatar dependabot[bot] avatar echophon avatar everm1nd avatar frarees avatar gadgetoid avatar hamstah avatar jakubvaltar avatar jcmorrow avatar kwmu4k avatar l3kn avatar lctrt avatar makio135 avatar martinberlin avatar mashaal avatar metasyn avatar mrdoob avatar nathan-kansu avatar neauoire avatar njanssen avatar nlebellier avatar nobodycarestrue avatar npisanti avatar okyeron avatar ondras avatar rain-sk avatar rekkabell avatar ryanramage avatar unthingable 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  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

orca's Issues

P breaks anything to its right

It's not so much that P is broken, it's that it breaks any operator to the right of it that is caught in it's upper P-len.

Screen Shot 2019-03-15 at 3 01 05 PM

possible Note Length fix?

in the io.midi.js file, the convertLength section should be replaced with something like:

  function convertLength (val, bpm) {
    // TODO get bpm from daw midi
    if (!bpm) {
      bpm = 120
    }
    return (60000 / bpm) * (val  / (bpm / 32) )
  }

this brings note lengths closer to 1 = 1/16th and f = 16/16

screen shot 2019-03-06 at 8 15 00 pm

here is an example of 120 bpm displaying 1 - f (bottom to top) values when the code is replaced with the above.

this also only works for 120 bpm (not sure how to get orca's current bpm to be read as the bpm in the io.midi.js).

you can still notice that the lengths aren't perfect though and maybe needs some fine tuning, especially when notes overlap more problems arise.

maybe headed in the right direction though. :-)

display scaling?

image

it's very difficult to read at 4k resolution on my monitor, and while I can change the monitor resolution to resolve this issue on my end, it would be far more convenient to just have some options for display scaling, if possible

add quick guide for controlling a soft synth with orca

It would be great if people who found orca can very quickly start making sounds with it.

I saw there's some work getting started at #20 + Pilot. In addition to our toy synth, what do you think about having some helpful links for linking Orca with common soft synths? For me it took a while to search the net and figure out how to set up Orca => Midi => SuperCollider.

Links that were helpful to me: A guide about enabling IAC Driver, and SuperCollider's MIDIIn example.

Song repo

It would be amazing to have a (folder, wiki, repo) of songs that people have created and would be willing to donate. I've seen some amazing ones on twitter, and it would be nice to have the src to play around with.

A lot of times when I am writing code for projects I need some quick .orca files that produce something nice. I really appreciate the popcorn.orca file, but grow weary of it 😢

Allow midi command to chose port

I am using a synth called helm and it unfortunately does not have the ability to filter MIDI channels.

I would like to request that an additional operand to the : command be added for the port, so that I can set up two virtual midi ports, and route them to the individual helm synths.

I imagine this would be very nice feature for folks that have multiple analog devices.

Certain base36 number literals being parsed as instructions

For example, when trying to use the T instruction with a length of 16 (g), the g is being parsed as the instruction instead, causing all the values originally locked inside the track to start executing on their own as well. However, this doesn't happen when creating the g using an Add instruction on the line above.

Example code:

0gTCDEFGHIJKLMNOPQR
...................

Arbitrary files overwrite

Hi guys!
Just checking this very nice project.
While trying to build using npm, a high severity bug alert popped up:

screenshot 2019-02-06 at 08 17 25

Is this dependency going to be updated so that we can sleep safe and sound? 😀

V monitor ..

I was wanting some kind of V monitor to see how many V's were in use in the current project and also how many more were available to use..

also 10 x times more Vs would be awesome :D

Add button to toggle hardware acceleration

i can't use the Window Capture or Game Capture sources in OBS to capture footage of Orca unless i build Orca from source and explicitly disable its hardware acceleration using this method.

to get around this (and since not everyone needs to disable it in the first place) the ability to toggle hardware acceleration from within Orca would be nice. i would add it in a PR myself but Orca's codebase goes a little too far over my head 😛

Bug with new V when using banged V in K

This is a bug i discovered after i started using Banged V's inside a K ..
my setup is this ..

image

....................................................................................
....................................................................................
....................................................................................
..........................1D4.......................................................
.........................xV.........................................................
.................................................................................... <---inserting a V here will make :34c magically dissapear!
...............................8Kx..................................................
..................................:34c..............................................
....................................................................................
....................................................................................
....................................................................................
....................................................................................
.............................................................

When inserting a new V above the K .. orca responds by removing the : object..

video is here..

ydidVkillit.zip
despite using the UDP commands in this video example .. i found it still occurs with just normal ie ,non udp operation ..

Incidentally the error doesnt happen if you insert the new V below the K ..

Tabs for multiple songs?

Just played the TOPLAP15 thing.. and it struck me that it was really difficult to transition between songs .. i had to make the one i will play next be on an inactive midi channel in order for it to play nothing.. then arm it for daw sync after.. when i wanted to play it ..

I was thinking with @nobodycarestrue that it would be great to have tabs where we could load and have ready separate orca songs.. with a way of making the ones not playing have all the correct settings ie for me loopmidi sync enabled and ready to go .. but to have it "turned off" i guess? untill ready to play it ? .. any ideas? .. @hamstah @neauoire ?

maybe T is slow?

......D1.................
......*..................
.....1cg.123456789abcdefg
..Dg..0gT*...............
aV*...bV.................
.........................
.........................
.........................
...Va.Vb.................
.........................

I probably won't explain this clearly, but to bring to your attention, for a while I thought C and D were slightly off by 1 frame (or something). If you notice with the example above, when 1cg clocks a gT* (even when c is banged with a D1) and compared to just a regular Dg, Dg will bang at the 0 while T is outputting a frame behind. Always thought this lag was because of C being slow, but now seeing 1cg output a 0 in sync with Dg's bang, makes me think T is the slow one?

Midi slows pretty significantly when moving around after..

After you are running quite a few midi out objects.. (and this could very well be down to my poor coding and layout) .. overloading things.. i noticed midi gets pretty sluggish when moving the cursor reasonably quickly to get around to another place in the map .. in musical timing.. to keep the flow going..

I am using Windows 10 .. windows Build of Orca.. / Loopmidi ..

wondering if there was any way of improving this latency as it really is sometimes interfering with the flow of the jam im doing in orca.. .. would be great if it could be improved somehow ..

But i just have to say .. Orca is an extremely enjoyable way to make music .. and thank you so much for making it ..
much respect..

Sense

Reopen last open orca file

A lot of editors, when you exit and reopen them, will open the last file(s). I think this would be consistent with user expectations.

When writing with UDP's w, the letter should be locked

After the latest fix from a git pull of the master..

Updating 3c34858..ba3bb7c
Fast-forward
desktop/core/library/c.js | 2 +-
desktop/core/library/d.js | 6 +--
desktop/core/library/g.js | 24 +++--------
desktop/core/library/o.js | 7 ++--
desktop/core/library/p.js | 17 ++++----
desktop/core/library/q.js | 27 ++++---------
desktop/core/library/t.js | 21 +++++-----
desktop/core/library/x.js | 7 ++--
desktop/core/operator.js | 5 ++-
desktop/core/orca.js | 4 +-
desktop/main.js | 4 +-
desktop/sources/index.html | 6 ++-
desktop/sources/scripts/source.js | 79 +++++++++++++++++++++++++++----------
desktop/sources/scripts/terminal.js | 8 +++-
examples/benchmark.orca | 12 +++---
examples/read+write.orca | 19 ++++-----
examples/udp+loop.orca | 15 +++++++
17 files changed, 152 insertions(+), 111 deletions(-)
create mode 100644 examples/udp+loop.orca

I have noticed the following..

  1. Inside a T Capital objects populate as operators..
  2. Capital objects into V from T populate as objects when udp written ..;w ..
..1V*............
......V1.........
......*..........
.....1c8.........
.....178TABDFG...
......nV.........
.................
.................
...V1.Vn.........
...*;w.12:11.....
............G....```

Q in latest update no longer grabs multiple object with "length"

In the last update of the master where several core operator objects were replaced..
I have discovered Q no longer functions as expected..

Before the update 4Q would result in a Query length of 4 . . . . which we could then move around with X and Y parameters.. which then grabbed multiple objects in a line.. like the example code below shows..

1D1.54Q.....
.*;f346.....
............
......#f456#
......#f346#
......#f453#
......#f246#
......#r...#

Since the update the Length of the Query object seems not to correspond to the length of the query itself .. but rather an Offset value to the query with a length of only 1..

1D1.54Q.....
.*;...3.....
............
......#f456#
......#f346#
......#f453#
......#f246#
......#r...#

Declaring Macros with the / operator

A new custom operator /, the macro operator.

Where abc/xywh would make an instance of a rectangle of the grid, so like 0055/ would select a 5x5 rectangle at position 0,0.

And this macro can be used anywhere else in the file like /abc where a,b,c would be passed to the rectangle as parameters(overwriting cells in that selected macro).

Notes canceling each other bug

So now with one bar note lengths, I'm sure some have noticed that some notes have been cancelling each other out. (This bug has always been there but was less noticeable with the shorter note length max.)

I've been using my note length test to try to figure this out and unfortunately there is no way to consistently recreate the issue. It seems to be semi-random?

All I for sure know is that if a note is retriggered while still playing, there is a possibility of it cancelling out the next note(s) played after.

Here's the test with the results to follow:

aVg................................
...................................
..Va.......Va.......Va.......Va....
.Dg.......Dg.......Dg.......Dg.....
..:01Cw1...:01Ew5...:01gw9...:02Cwd
..Va.......Va.......Va.......Va....
.Dg.......Dg.......Dg.......Dg.....
..:01cw2...:01Fw6...:01Awa...:02cwe
..Va.......Va.......Va.......Va....
.Dg.......Dg.......Dg.......Dg.....
..:01Dw3...:01fw7...:01awb...:02Dwf
..Va.......Va.......Va.......Va....
.Dg.......Dg.......Dg.......Dg.....
..:01dw4...:01Gw8...:01Bwc...:02dwg

Bang rate of g:
BangRate-G

Bang rate of f:
BangRate-F

Bang rate of c:
BangRate-C

Bang rate of 8:
BangRate-8

Bang rate of 4:
BangRate-4

Bang rate of 2:
BangRate-2

Bang rate of 1:
BangRate-1

Here is also a plain D1 with note length of 1:
BangRate-D1

Unable to change program size with ctrl&meta [, ], {, and }

ctrl/meta+] increase program size vertically.
ctrl/meta+[ decrease program size vertically.
ctrl/meta+} increase program size horizontally.
ctrl/meta+{ decrease program size horizontally.

It seems that the following key combinations do not work for me on Xubuntu 18.04. Nothing simply happens. Increasing and decreasing the grid size with just [, ], { and } works fine though.

At first I thought it was because of how these symbols are written with my icelandic keyboard (alt gr+6 to 8) but I was unable to get this work even with an english keyboard.

Pixelated zoom

When adjusting zoom level, the canvas renderer becomes quite pixelated. Here is a screenshot of 8x.

Screen Shot 2019-04-21 at 7 12 46 am

I believe this happens when using the native webFrame zoom and fillText together. https://stackoverflow.com/a/21123769

Environment:
Current Orca: 045566b
MacOSx with external monitor (4k)

Insert mode selection problem and more.. windows 10

When selecting text and moving around with arrows .. text behaves not as expected..

  1. moving selection with up arrow .. = diagonal movement of selection upwards direction.
  2. moving selection with down arrow = diagonal movement of selection downwards direction
  3. moving selection to the right .. does not move selected text..

Orca as a tool to for the blind & visually impaired?

I have a friend who works with blind and visually impaired students. He's been wanting to teach them coding & he is thinking he will learn python to teach his students python.

With technology like 3D printing, he has been able to teach blind/low vision students how to write their own name. Something we take for granted.

But then it got me thinking.. While ORCA is a very visual experience: What would it take to get it to output to some sort of Braille display?

I think that ORCA's visual strengths would translate very well into a tactile environment.

p.s. funny coincidence: https://www.linuxjournal.com/magazine/orcamdashtake-killer-whale-ride

Doing some research, it seems that full page braille displays are not affordable yet, but even a 1 line display might be a good-for-now option.

Key retriggering and Z operator

when you hold down Z the operator start spawning both under the cursor and from the left side, i think this is an error that occurs when two Z are one near the other.

Add support for MIDI CC

Hi there – what a great little project ⭐️

Any plans to add support for MIDI CC events? Would be amazing.

It could be something like adding a new method here such as

function convertCC (control, value) {
 // return the data 
}

and creating a new MIDI_CC operator (or extending the existing one) with a new operator with the following signature:

? . . . .
# ? -> new "MIDI CC" operator 
# . MIDI CHANNEL 0-F
# . MIDI CC MSB 0-F
# . MIDI CC LSB 0-F
# . VALUE LSB
# . VALUE MSB

# Example for Chan 0, Cutoff (CC 19) value 0 
? 0 1 3 0 0

Ctrl + / Shortcut Does not Work in Linux

The 'Ctrl + /' shortcut for toggling comment blocks does not work in Linux. I'm using the latest version of Orca (pulled today, 4/15/2019). Confirmed it works in Windows.

Capital addition to Vars.. cant be on the same line ?

When trying the new Capital V's i discovered that the capital input AV held with an H will only pass a value to VA when NOT on the same line.

captialvnotonsameline
capitalvunderworks

example of the not working arrangement ..

H.R15..VA AV2....?.

example of working arrangement ..

..H.R15...... ..AV3....
VA.. .........3...

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.