Coder Social home page Coder Social logo

martineausimon / nvim-lilypond-suite Goto Github PK

View Code? Open in Web Editor NEW
117.0 117.0 8.0 1.95 MB

Neovim plugin for writing LilyPond scores, with asynchronous make, midi/mp3 player, fast syntax highlighting, "hyphenation" function, and support for LaTex and Texinfo files

License: GNU General Public License v3.0

Lua 99.88% Vim Script 0.12%
asynchronous audio-player ftplugin hyphenation hyphenation-rules latex lilypond lilypond-book lua lyluatex lyrics neovim syntax texinfo

nvim-lilypond-suite's People

Contributors

kljunas2 avatar madskjeldgaard avatar martineausimon avatar t4y 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

nvim-lilypond-suite's Issues

[FR] Get function documentation

This might very well be a giant undertaking, but I am really missing a way to hit K on some keyword or function and get the documentation for this... Do you see any plausible way to accomplish this?

Fluidsynth doesn't work as a player on latest MacOS

Hi!

Just wanted to say that installing the latest fluid synth from homebrew and using that as a player in lilypond-suite doesn't work currently.

I had to specify timidity as the midi_synth to make the functionality work (and also install timidity of course)

              midi_synth = "timidity", 

Player not working when file path contains space

Hi!
When launching player using <F3> with a file containing space in path/name (eg. $HOME/simple test.ly), it results as failure:

stat: cannot statx '/home/jerome/simple': No such file or directory
stat: cannot statx 'test.midi': No such file or directory
Error executing Lua callback: ...hare/nvim/lazy/nvim-lilypond-suite/lua/nvls/lilypond.lua:37: attempt to compare nil with number
stack traceback:
        ...hare/nvim/lazy/nvim-lilypond-suite/lua/nvls/lilypond.lua:37: in function 'lilyPlayer'
        ...hare/nvim/lazy/nvim-lilypond-suite/ftplugin/lilypond.lua:26: in function <...hare/nvim/lazy/nvim

Notice that it's working fine for file without space in path/name (eg. $HOME/simpletest.ly).

(environment: ArchLinux)

PDF viewer is not launcher when file path contains space

Hi!
When launching player using with a file containing space in path/name (eg. $HOME/simple test.ly), it results as failure:

[NVLS] File Cinema Paradiso.pdf doesn't exists

Notice that it's working fine for file without space in path/name (eg. $HOME/simpletest.ly).

(environment: ArchLinux)

[FR] Ability to change midi playback speed

Hi,

Looking at fluidsynth I can't find any command line switches for setting the playback tempo of a midi file, even though it is exposed in the libfluidsynth api... Do you have any idea if it's possible to send a message from nvim to fluidsynth at init or at runtime to change the playback tempo?

Syntax highlighting does not work with LunarVim

Hello,

using LunarVim, syntax highlighting does not work. The plugin itself loads, the syntax of the file is recognized as "lilypond", the commands work - only the syntax highlighting does not.

This is my minimal config.lua:

lvim.plugins = {
  {
    "martineausimon/nvim-lilypond-suite",
    depencencies = "MunifTanjim/nui.nvim",
    config = function()
      require('nvls').setup()
    end
  }
}

I am using lvim.plugins as per the LunarVim documentation, if I directly use require("lazy").setup(), LunarVim breaks.

I thought this was related to #14 but given that it still does not work even if the plugin is the only entry in the config file, that does not seem to be the case.

Any ideas what I may be doing wrong?

`.lilyrc` no longer works. This option is obsolete since nvim support exrc

I'm considering removing the .lilyrc option which complicates the code, and is unnecessary as neovim now supports exrc.

To use a different configuration per folder (useful for example to define a different "main" file per folder) ,you will need to create the .nvim.lua file in your directory, containing the new config e.g.:

require('nvls').setup({
  lilypond = {
    options = {
      main_file = "my_main_file.ly",
    },
  },
})

make sure you have the following option in your init.lua:

vim.opt.exrc = true

`E79: Cannot expand wildcards` on `:LilyCmp` and `:LilyPlayer`

The issue

Today, I have encountered an issue where :LilyCmp and :LilyPlayer both yield the following error. My <FILENAME>s usually only contain lower and upper case letters, and possibly dashes (-) to separate words.

Both operations do not work on projects which worked in the past. Even the last project I worked on when making my previous issue a few days ago does not work anymore. I am really not sure if the problem is related to the plugin or something else.

I should also mention that opening the PDF using :Viewer works just fine!

The error message

For :LilyCmp

Compiling <FILENAME>.ly...
E79: Cannot expand wildcards

and for :LilyPlayer

[NVLS] Converting <FILENAME>.midi to mp3...
E79: Cannot expand wildcards

Related information

:h 79 shows the following. To my knowledge, there are no wildchars in my filenames though. I am even more certain about this fact, since files that previously compiled just fine cause this issue.

							*E79*   
  Cannot expand wildcards

A filename contains a strange combination of characters, which causes Vim to
attempt expanding wildcards but this fails.  This does NOT mean that no
matching file names could be found, but that the pattern was illegal.

I can compile the files just fine in the terminal using lilypond <FILENAME>.

Slurs break syntax highlighting with `\editionMod`

The issue

First off, I should mention that everything works as expected inside a "normal" Lilypond file!

I have started to use the edition engraver to apply tweaks to my score. For the first time now, I also tried setting slurs using the edition engraver, as opposed to directly putting them into the main lilypond source files. However, the slurs cause the syntax highlighting to break and many elements won't be highlighted anymore. I have attached a few screenshots below. (I also attached a sample file to test with)

I also tried the syntax highlighting provided by lilypond. There appears to be no highlights defined whatsoever for the edition engraver, which makes me assume that this plugin includes a few special syntax highlights for these.

Screenshots

Using nvim-lilypond-suite's highlighting

With the slurs

image

Without the slurs

I simply commented out all lines containing slurs to show/see what the syntax highlighting should look like.

image

Using Lilypond's highlighting

With the slurs

image

Without the slurs

image

Sample file

Here is the file containing all the \editionMods, which I \include into the main lilypond file.

\include "global.ly"

\consistToContexts #edition-engraver Score.PianoStaff.Staff.Voice
\consistToContexts #edition-engraver Score.PianoStaff.Dynamics

\addEdition tweaks
\addEdition fingering
\addEdition dynamics
\addEdition articulations

\editionMod dynamics 2 0/4 music.Dynamics \p

\editionMod articulations 4 5/8 music.Voice.A \(
\editionMod articulations 7 0/8 music.Voice.A \)

\editionMod dynamics 9 0/4 music.Dynamics \sf
\editionMod articulations 9 0/4 music.Voice.A \(

\editionMod dynamics 10 0/4 music.Dynamics \mp

\editionMod articulations 12 0/4 music.Voice.A \)
\editionMod articulations 12 3/4 music.Voice.A \(

\editionMod articulations 13 0/4 music.Voice.A \)

\editionMod dynamics 15 0/4 music.Dynamics \sf
\editionMod articulations 15 0/4 music.Voice.A \(

\editionMod dynamics 16 0/4 music.Dynamics \mp
\editionMod tweaks 16 0/4 music.Dynamics \once\override DynamicText.X-offset = #-0.5

\editionMod articulations 18 0/4 music.Voice.A \)
\editionMod articulations 18 3/4 music.Voice.A \(

\editionMod articulations 19 0/4 music.Voice.A \)

\editionMod dynamics 21 0/4 music.Dynamics \mf
\editionMod articulations 21 0/4 music.Voice.A \(
\editionMod articulations 21 3/4 music.Voice.A \)

\editionMod articulations 22 0/4 music.Voice.A \(

\editionMod articulations 23 1/4 music.Voice.A \)

\editionMod dynamics 25 0/4 music.Dynamics \mf
\editionMod articulations 25 0/4 music.Voice.A \(
\editionMod articulations 25 3/4 music.Voice.A \)

\editionMod articulations 26 0/4 music.Voice.A \(

\editionMod fingering 27 2/8 music.Voice.B -1
\editionMod fingering 27 3/8 music.Voice.B -2
\editionMod fingering 27 4/8 music.Voice.B -3
\editionMod fingering 27 5/8 music.Voice.B -5
\editionMod articulations 27 1/4 music.Voice.A \)
\editionMod articulations 27 3/8 music.Voice.B \(

\editionMod fingering 28 0/8 music.Voice.B -3
\editionMod fingering 28 1/8 music.Voice.B -5
\editionMod dynamics 28 0/4 music.Dynamics \>
\editionMod dynamics 28 2/4 music.Dynamics \p
\editionMod articulations 28 3/8 music.Voice.B \)
\editionMod articulations 28 2/4 music.Voice.A \(

\editionMod articulations 29 2/4 music.Voice.A \)

\editionMod articulations 30 2/4 music.Voice.B \(

\editionMod dynamics 31 1/4 music.Dynamics \<
\editionMod dynamics 31 7/8 music.Dynamics \!
\editionMod articulations 31 0/4 music.Voice.B \)
\editionMod articulations 31 1/4 music.Voice.B \(

\editionMod fingering 32 2/16 music.Voice.B -2
\editionMod fingering 32 3/16 music.Voice.B -3
\editionMod fingering 32 4/16 music.Voice.B -4
\editionMod dynamics 32 1/8 music.Dynamics \>
\editionMod articulations 32 2/4 music.Voice.B \)
\editionMod articulations 32 3/4 music.Voice.A \(

\editionMod dynamics 33 0/4 music.Dynamics \pp
\editionMod tweaks 33 0/4 music.Dynamics \once\override DynamicText.X-offset = #-0.0
\editionMod articulations 33 0/4 music.Voice.A \)
\editionMod articulations 33 5/8 music.Voice.A (

\editionMod articulations 34 0/4 music.Voice.A )

\editionMod articulations 36 0/4 music.Voice.A \(

\editionMod dynamics 36 0/4 music.Dynamics \p

\editionMod articulations 40 0/4 music.Voice.A \)

\editionMod articulations 42 0/4 music.Voice.A \(

\editionMod articulations 46 0/4 music.Voice.A \)

\editionMod dynamics 48 0/4 music.Dynamics \p
\editionMod dynamics 48 0/4 music.Voice.A \(

\editionMod dynamics 50 0/4 music.Voice.A \)

\editionMod dynamics 51 2/4 music.Voice.A \(
\editionMod dynamics 52 0/4 music.Voice.A \)

\editionMod dynamics 53 0/4 music.Dynamics \pp

FluidSynth: Path to Soundfont for SF3

Hello!
This is something between a bug and a feature request, but I'll bring it out in case there's a way to solve it.
I was wondering if there was a way to add a custom path when invoking fluidsynth.
I've seen that when doing:

fluidsynth $PATH_TO_SOUNDFONT

FluidSynth starts with that soundfont loaded.

My issue is that setting a default.sf2 symlink only limits the usage to SF2 files, when fluidsynth can also work with SF3 files. And setting the symlink from an SF3 file to default.sf2 gives an error (for obvious reasons). And also setting a symlink to default.sf3 doesn't load anything at all because if nothing is specified when invoking fluidsynth, it expects a default.sf2.

In case this is relevant. I've tried in both MacOS Monterrey (Intel) and Ventura (M1).

Add dependency installation step for MacOS

Hi

The wiki is missing installation instructions for the dependencies on MacOS, it's pretty simple, but here they are:

brew install fluid-synth

and

brew install timidity

Options not found (on MacOS)

After installing Lilypond-nvim for the first time, I get this error with the default configuration from the README. I have installed lilypond, fluid-synth and timidity.

Error detected while processing /Users/mads/dotfiles/nvim/init.lu
a:
E5113: Error while calling lua chunk: /Users/mads/.config/nvim/lu
a/settings.lua:18: /Users/mads/dotfiles/nvim/init.lua../opt/homeb
rew/Cellar/neovim/0.9.1/share/nvim/runtime/syntax/syntax.vim[43].
.BufReadPost Autocommands for "*": Vim(append):Error executing lu
a callback: ...brew/Cellar/neovim/0.9.1/share/nvim/runtime/filety
pe.lua:21: Error executing lua: ...brew/Cellar/neovim/0.9.1/share
/nvim/runtime/filetype.lua:22: /Users/mads/dotfiles/nvim/init.lua
../opt/homebrew/Cellar/neovim/0.9.1/share/nvim/runtime/syntax/syn
tax.vim[43]..BufReadPost Autocommands for "*"..FileType Autocomma
nds for "*"..function <SNR>1_LoadFTPlugin[19]..script /Users/mads
/.local/share/nvim/site/pack/packer/start/nvim-lilypond-suite/ftp
lugin/lilypond.lua: Vim(runtime):E5113: Error while calling lua c
hunk: ...ack/packer/start/nvim-lilypond-suite/lua/nvls/config.lua
:3: attempt to index local 'nvls_options' (a nil value)
stack traceback:
        ...ack/packer/start/nvim-lilypond-suite/lua/nvls/config.l
ua:3: in main chunk
        [C]: in function 'require'
        ...k/packer/start/nvim-lilypond-suite/ftplugin/lilypond.l
ua:2: in main chunk
        [C]: in function 'nvim_cmd'
        ...brew/Cellar/neovim/0.9.1/share/nvim/runtime/filetype.l
ua:22: in function <...brew/Cellar/neovim/0.9.1/share/nvim/runtim
e/filetype.lua:21>
        [C]: in function 'nvim_buf_call'
        ...brew/Cellar/neovim/0.9.1/share/nvim/runtime/filetype.l
ua:21: in function <...brew/Cellar/neovim/0.9.1/share/nvim/runtim
e/filetype.lua:10>
        [C]: in function 'vimcmd'
        /Users/mads/.config/nvim/lua/settings.lua:18: in function
 'options'

It seems like the options variable is nil when ftdetect is fired off?

Syntax highlighting doesn't work when using lazy.nvim

Hi,

Getting some weirdness here after I migrated from Packer to Lazy...

With this setup I get syntax highlighting (although the English names with flats and sharps are not correctly colored):

    {
        'martineausimon/nvim-lilypond-suite',
        dependencies = 'MunifTanjim/nui.nvim',
        config = function()
        end
    },

With this I don't:

    {
        'martineausimon/nvim-lilypond-suite',
        dependencies = 'MunifTanjim/nui.nvim',
        config = function()
            require('nvls').setup({})
        end
    },

Any idea what might be going on here?

Edit: I also have this autocmd:

api.nvim_create_autocmd({"BufEnter"}, {
    pattern = {"*.ly"},
    command = "setlocal formatoptions-=c formatoptions-=r formatoptions-=o | syntax sync fromstart",
    group = group
})

Ftdetect error

Hi, and thanks for what looks like an absolutely awesome plugin!

Trying to run it on Arch Linux, and getting this error:

Error detected while processing /home/kf/.local/share/nvim/site/pack/packer/start/nvim-lilypond-suite/ftdetect/filetype.lua:
E5113: Error while calling lua chunk: ...k/packer/start/nvim-lilypond-suite/ftdetect/filetype.lua:9: 'group' must be a string or an integer.
stack traceback:
        [C]: in function 'nvim_create_autocmd'
        ...k/packer/start/nvim-lilypond-suite/ftdetect/filetype.lua:9: in main chunk

Checkhealth returns no relevant errors. Nvim version:

NVIM v0.7.2
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by builduser

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/share/nvim"

Run :checkhealth for more info

EDIT:

OK, looking into it a bit more now, and the vim.api.nvim_create_autocmd is wrong.
This works:

	vim.api.nvim_create_autocmd(
		{ 'BufNewFile', 'BufRead' },
		{
			command = "set ft=lilypond",
			pattern = { '*.ly', '*.ily' },
            group =  vim.api.nvim_create_augroup("LilypondAutocmds", { clear = true})
		}
	)

mpv player doesn't use my defaults

Hi,

Getting a weird behavior from mpv when using LilyPlayer: For some reason it defaults to using the internal soundcard, even when all other mpv use gets routed through my external one via jack. In my mpv.conf I have

fs=yes
audio-device=jack 
vo=gpu

If I remove the config-dir flag in this function:

  vim.api.nvim_buf_call(lilyPlayer.bufnr, function() 
    fn.execute("term mpv --msg-level=cplayer=no,ffmpeg=no " ..
      "--loop --config-dir=/tmp/ " .. file)
    fn.execute('stopinsert')
  end)

everything seems to work normally, except that everything gets mixed to mono and routed into the left speaker. Adding the --audio-channels=stereo flag still results in mono, but at least it gets routed to both speakers.

So I guess the main problem here is that mpv doesn't source the user's config. Is there a specific reason for using /tmp instead?

EDIT: thinking a bit further on this: would it be an idea to expose the mpv flags to the user through a g: variable?

Player <F3> doesn't seem to be working.

Hello!
I managed to get pretty much everything working, but for some reason the shortcut F3 doesn't work.
It gives me the next error:

callback: ...k/packer/start/nvim-lilypond-suite/lua/nvls/lilypond.lua:26: attempt to comp                    a
re nil with number
stack traceback:
        ...k/packer/start/nvim-lilypond-suite/lua/nvls/lilypond.lua:26: in function 'lilyPlayer'
        ...k/packer/start/nvim-lilypond-suite/ftplugin/lilypond.lua:26: in function <...k/packer/start/nvim-li
lypond-suite/ftplugin/lilypond.lua:24>

Screen Shot 2023-01-26 at 9 35 01 PM

I also can't seem to find the lilypond.lua the log says nor those directories.

I'm using MacOS Monterrey 12.6.1

[FR] Auto-close player on completion

Hi,

Is there a way to close the player automatically after it has reached the end of the file? I currently have it set up not to loop, so I get an exit code 0 when it finishes. Maybe it's possible to trap this somehow and add a hook to it? I don't know enough about the inner workings of the floating window to take a stab at this....

Specifying a main file to compile (and open preview on, and open playback on)

Hello, first of all sweet plugin! So far I used Frescobaldi for editing because of the midi player, the point-and-click and the auto-complete suggestions. This plugin basically tackles all of which kept me in Frescobaldi and I can finally let lose of these shackles and work in neovim for the entire process.


The issue

There is a slight nuisance which makes me not use any of the features beyond syntax highlighting and auto-completion. I like to split my lilypond project into multiple files, and I rarely spend time in the main file that needs to be compiled. On their own, these separate files cannot be compiled into the actual pdf — they are simply being \included into the main file.

I do need to compile that main file, but for that to work I currently need to switch to that one any time I want to compile, open the viewer, or play the midi. It would be great to somehow specify the main file to perform these operations on. That avoids switching back and forth all the time which can become quite distracting and annoying.

Frescobaldi has a nice feature for this. When you have multiple tabs open with different files, you can right click a tab and tick a box saying Always Engrave This Document (which I always do on the main file). Then anytime you want to compile the thing, it directly compiles the file on which you ticked that box instead of the currently selected one. It is a really nice feature, which is the only thing I am really missing from this plugin.

Possible ways to tackle it

I have been wondering for a while how one could incorporate this here though (functionality wise). Here are a few ideas I had.

  • Hard coding the name of the main file as main.ly is certainly an option (which could be overridden as needed through local vimrc files for each project). To not have a main file, the variable holding this value could be set to an empty string or nil or something of the likes.
  • Include a mapping or command where you can mark a specific buffer as the main one (similar to how Frescobaldi does it). It would then compile, open viewer, and open the player on that buffer instead of the currently open one.
  • Keep the first opened file as the main buffer. Any subsequently opened buffers will not be targeted for compilation, etc.. This might be the least ideal approach though, especially if you launch vim with multiple files then it can become ambiguous. It would probably also add an unnecessary level of nuisance if you happen to open multiple main files.

"Guile signaled an error for the expression beginning here"

Gradually moving my life over to nvim and my lilypond scores that compile fine in Frescobaldi don't seem to work in nvim...various scores (including small test scores) spit out the same error message:

opt/homebrew/Cellar/lilypond/2.24.2/share/lilypond/2.24.2/ly/init.ly|65 col 2| error: Guile signaled an error for the expression beginning here

Any idea what this could be? Is it something to do with my version of Guile perhaps?

:LilyCmp <F5> Doesn't seem to work

Pressing or runing :LilyCmp doesn't compile a pdf file. I can only manually compile from a terminal. What should I do to enable it? Thanks for a great work!

Tripled entries in completion

Completion shows triplicats.the same three entries in completion menu. I'm using your completion config. I have no idea how to fix this.

scheme indentation?

Hi,

I'm just wondering if there is a way to get correct indentation of scheme parts of a .ly file?

Player control mappings don't work

Hi,

I like the look of the new player! One thing, though: I can only get the keys p q and l to work for respectively play, quit and loop. I copied the setup from the readme and tweaked it a little bit:

require('nvls').setup({
    lilypond = {
        mappings = {
            player = "<F3>",
            compile = "<F5>",
            open_pdf = "<F6>",
            switch_buffers = "<C-Space>",
            insert_version = "<F4>"
        },
        options = {
            pitches_language = "english",
            output = "pdf"
        },
    },
    latex = {
        mappings = {
            compile = "<F5>",
            open_pdf = "<F6>",
            lilypond_syntax = "<F3>"
        },
        options = {
            clean_logs = false
        },
    },
    player = {
        mappings = {
            quit = "q",
            play_pause = "p",
            loop = "<A-l>",
            backward = "h",
            small_backward = "<S-h>",
            forward = "l",
            small_forward = "<S-l>",
            decrease_speed = "j",
            increase_speed = "k",
            halve_speed = "<S-j>",
            double_speed = "<S-k>"
        },
        options = {
            row = "2%",
            col = "99%",
            width = "37",
            height = "1",
            border_style = "single",
            winhighlight = "Normal:Normal,FloatBorder:Normal"
        },
    },
})

vim.cmd([[autocmd FileType lilypond set formatoptions-=cro]])

I'm on Arch linux, Nvim 0.8.0, and all the dependencies are installed and working.

Tips and tricks

Not an issue per se, but just felt like it would be nice to share a few tricks here...

  1. use nvim-overseer to run a continuous compilation pipeline every time you save an .ly file. The work-flow goes like this:
    Define a template for overseer somewhere in your configuration like this:
overseer.register_template({
    name = "lilypond",
    builder = function(params)
        return {
            cmd = {"lilypond", vim.fn.expand("%:p:t")},
            name = "lilypond",
            cwd = "",
            env = {},
            components = {
                "default",
            },
            metadata = {},
        }
    end,
    desc = "Compile lilypond file",
    tags = {overseer.TAG.BUILD},
    params = {},
    priority = 50,
    condition = {
        filetype = {"lilypond"},
    },
})

After opening a lilypond file, run :OverseerRun and select the job from the list. After this, run :OverseerQuickaction watch and hit enter to select current working directory.

This will start a background job where overseer compiles to pdf every time you save. If you combine this with an autosave-plugin and a pdf viewer that automatically updates, you will get live, immediate feedback on your scores.

  1. Make sure nvim doesn't start next line with >> after enclosing a block with these:
    vim.cmd([[autocmd FileType lilypond set formatoptions-=cro]])
    Or, in lua:
local api = vim.api
local group = api.nvim_create_augroup("MyAutocmds", { clear = true})

api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, {
    pattern = {"*.ly"},
    callback = function()
        vim.opt.formatoptions  = 'jql'
    end,
    group = group
})

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.