Make visual music sheets for thatskygame (graphical representations of the Sky keyboard)

Overview

sky-python-music-sheet-maker

This program lets you make visual music sheets for Sky: Children of the Light. It will ask you a few questions, and does not require previous knowledge of the command line to run.

More details at the Sky-Music website.

Table of contents

Usage

Installation

The program requires Python >= 3.6 and the following packages:

  • PIL (preferably pillow)
  • import_resources (for Python < 3.8)
  • pyYaml
  • mido (optional: for generating midi output)
  • requests (optional: for generating a link to skymusic.herokuapp.com)

The program can be installed by simply unzipping the code on your computer, and running the main script file, or by installing it in your Python distribution with pip: pip install .

The program can be installed on a desktop computer, or a smartphone if a Python IDE is installed (such as Pythonista).

The program can also be installed in a virtualenv to mitigate possible dependency clashes with system site-packages.

git clone https://github.com/sky-music/sky-python-music-sheet-maker.git
cd sky-python-music-sheet-maker
python3 -m venv --clear venv
source venv/bin/activate
pip3 install -r requirements.txt

You can activate the virtual environment with source venv/bin/activate, to exit the virtual enviroment use the deactivate command. Note, it is possible some packages are distributed via bdist_wheel, hence the wheel package may be required.

See here for further details on how to download and install.


Plug-and-play versions

If you’re afraid of the command line, there is a website running this script. There is also a bot running an older version of the program, on thatskygame Discord server, that can be called by typing !song in a channel. Executable binaries are also available for download at https://sky-music.github.io.


Running the script

python 
   
    /sky-python-music-sheet-maker/src/skymusic/command_line_player.py

   

If you have installed the program by pip, just type: skymusic instead.

Flower Dance intro music sheet

As well as using QWERT ASDFG ZXCVB keys on the keyboard (like a piano), there are other supported notations for the notes you provide:

  • Sky column/row notation (A1 A2 A3 A4 A5, B1 B2 B3 B4 B5, C1 C2 C3 C4 C5)
  • English notation, followed by an optional number for octaves (C1, D1, E1, F1, G1, A1, B1)
  • Jianpu (1 2 3 4 5 6 7, followed by + or - for octaves)
  • French do ré mi + octave number
  • Japanese do ré mi + octave number

Note that for musical notations supporting octaves (such as English, Jianpu, and doremi), the starting octave is 1, by convention. Typing a note name without octave (e.g. F) implicitely assumes that it belongs to the starting octave (e.g. F1). However for notes belonging to the next octave (higher pitch), you will have to use the number 2 (C2, D2, E2, etc). So the full range of the piano write C1-C3. This convention is different from SkyStudio's which assumes that the instrument range is C4-C6 (this is true for the basic Sky piano, but not for other instruments such as the winter piano). If you're used to start the octave at 4 (C4, D4, E4...), then enter -3 when asked for an octave shift.

You can type these directly in the command line prompt, but you are strongly advised to save the notes first in a text file. Text files are looked for by the program in the 'test_songs' folder. if you installed the program with pip, this folder must be moved in the Documents folder of your user home directory.

The output will be HTML, SVG, or PNG, with small icons of the Sky keyboard. If you use Western notation or Jianpu notation, it will also convert to Sky notation (ABC1-5) in a text file.

After generating a sheet, you are encouraged to publish the file on https://sky-music.github.io

Configurations

Advanced usage

In contrast with the website or bot versions, the command-line version supports functions for faster processing of songs:

  • the default answer to any question can be put in the skymusic_preferences.yaml file. This way, you will no longer be asked this question (for instance the aspect ratio of the visual sheet). You can even put the notes in there!

  • songs can be processed in a batch by placing preference-like .yaml files in the batch_songs directory (see the example files in this folder to learn the right keywords) and passing the following flag to command_line_player.py:

      -b/--batch_mode
    
  • HTML visual sheets generated after July, 2020 1st can be read again by the program for further modification. These sheets can be recognized by the

    field they contain.

Customized configurations for default directory are supported via command line flags, flags that are not passed or are not valid will reference their default fallback values defined in command_line_player.py:

  • input/output directories where the module will read from/write to can be defined by passing the following flag with the desired directory to command_line_player.py respectively:

      --in_dir 
         
      --out_dir 
         
    
         
  • a custom batch directory for storing preference .yaml files can be defined by passing the following flag with the desired directory to command_line_player.py:

      --batch-dir 
         
    
         
  • the default preference .yaml file path where command_line_player.py reads from can be modified by passing the follow flag with the desired path:

      -p/--pref_file 
         
    
         
  • by default, conversion of the song to a music recording using JSON format is disabled. A link to hear the song being played on https://sky-music.herokuapp.com can be generated, to enable it setting the following flag with the website API key (this key will be given to trusted players):

      -u/--skyjson_url 
         
    
         

Note that to minimize strain to the server, the -u/--skyjson_url and -b/--batch_mode flags are mutually exclusive, meaning that only either one of them can be passed to the module but not both. Further help can be invoked via the -h/--help flag.

Note: json recording feature requires the requests library, which can be installed via the pip package manager by running:

pip install requests

Docker images

Since it might be a bit difficult to ensure that all client python3 installations are functional and reproducible, there is a Dockerfile and Compose file provided. The Dockerfile contains the instructions to assemble a base image to run skymusic, while the Compose file orchestrate the instructions to run the image.

The prebuilt containers have the base skymusic modules included. INPUT_DIR specifies where the container will look for song inputs. OUTPUT_DIR is where the container will output generated music sheets.

  1. Install Docker
  2. Install Docker Compose
  3. Run the skymusic module
INPUT_DIR=/path/to/dir/containing/test/songs \
OUTPUT_DIR=/path/to/output/dir/ \
docker-compose run skymusic

After running, the output will be placed in /tmp/output/, referring to the path inside the container. Your OUTPUT_DIR is bind mounted to /tmp/output.

The first time you execute the above command, Docker will pull the image from the Docker Registry and cache it. Any subsequent runs will utilize the cached image. Note this is a development image with all optional dependencies included.

Credits

Authors

Co-authors: Tracey L, jmmelko


Contributors

Assets:

SVG icons are thanks to madwurmz.

Codebase:

Various contributions from Specy-wot (html & js), Jurassimok (Setup.py), Skyventuree, heronwr (command-line arguments).

Docker images by heronwr aka lambdaw.

Re-use and branching:

This program is not being actively maintained by its original creator Tracey. Assistance is currently provided by jmmelko, but this may not last. Feel free to branch the code and build upon it.

Translators:

  • skyventuree, a.k.a. こじめ (Vietnamese)
  • jmmelko (French)
  • Kai00 (simplified chinese)
  • we are looking for a japanese translator

Info

License

MIT License

Copyright (c) 2020 Tracey

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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.

Code of conduct

We use an adapted version of the Contributor Covenant Code of Conduct, please see CODE_OF_CONDUCT.md for more details.


Contributing

There are several domain-specific guidelines for contributions, largely dealing with the previously established structure of the repo. Please see CONTRIBUTING.md for more details.

Comments
  • TODOs for Query, a new class for bot interaction

    TODOs for Query, a new class for bot interaction

    As discussed for #102, and directly with Alex here:

    To make music-maker / bot interaction easier, it would be desirable to create a new class. The underlying reason is that a bot is conversational, i.e. it asks and answers questions in no definite order, while the music-maker script is a linear “old-fashioned” program with prompts (input() & print().

    The code is being pushed in the dev branch.

    TODOs:

    • [x] finish QueryOpen
    • [x] Think about how the asking locutor will “know” that it has been talked back
    • [x] change the list of valid locutors from test strings to something else (objects? Class names?)
    • [x] implement my secret hash-like feature and the corresponding functions in QueryMemory
    • [x] try using the objects inside Communicator and bot to see how it works
    • [x] add support for the Information class in def store() method of QueryMemory
    • [x] add sorting by time stamp in QueryMemory
    • [x] IMPORTANT: finish implementing the prerequisites property. In particular, for each Query check that the dependencies have been answered to. Currently the prerequisites is only used to make a topological sort.
    • [x] let Tracey digest the code, test it with test_comm.py, give directions, make corrections, beautify it
    • [x] enable the use of UIDs to define prerequisites (dependencies)? Problem: the UID is only created once the Query has been sent (or manually).
    help wanted Bot 
    opened by jmmelko 36
  • Suggestions for the new music feature

    Suggestions for the new music feature

    I have some suggestions regarding the new music feature in the bot.

    1. Link the sky-music.github.io website once an user finished with the composition of the song, saying something like "for more music sheets visit the website ---", it's a library of songs in the end, always good to publicize it.

    2. Black mode in the sheets? Not really that important but it could be a nice touch.

    3. Give option to also export the song in the sky music app/sky studio format based on the bpm of the song, if not given, use 220

    The format is this one:

    [{
    name:" ",
    bpm:" ",
    isComposed: true,
    bitsPerPage: 16,
    pitchLevel: 0,
    songNotes[
          {
                 key:"Key0", //Key goes from top left to bottom right 
                 time:1000 //Timestamp since the beginning of the song
          }
    }]
    

    It's an array because it supports multiple song import/export, each note time is calculated with the bpm , each "cell" increases the timestamp by 60000/bpm, empty cells just increase the timestamp and don't add any other notes. Notes pressed together have the same timestamp.

    This is a JSON but can be given both .JSON or .txt file extension.

    Any attribute can be added to the format like the author name and other information, but the name of the song must be the first attribute. Jmmelko and Tracey already are familiar to this format, I made a script to convert the html songs to this format on the sky-music.github.io website.

    opened by Specy 30
  • TODO's before queries can be used in the Discord bot

    TODO's before queries can be used in the Discord bot

    • [x] address TODOs listed in #104

    • [x] rewrite the methods from responder.py into communicator.py

    • [x] rewrite the instructions. Maybe this should be done by parser??

    • [x] write the music sheet maker's questions as queries, in the create_queries() method of communicator.py

    • [x] make sure Parser works with queries

    • [x] determine if the use of asyncio is mandatory for the command line version to work

    • [x] In music sheet maker, decide how to return the results of queries from one method to the overlapping one (the one which called this method), by returning Reply objects or directly doing Query.reply_to

    • [x] check if the query_stock structure is adequate

    • [x] address TODOs left in the code as comments

    about the name 'Responder' or 'Communicator', any is fine. The problem is that Responder is not centred on communicating through Query messages.

    The communicator/responder is what's between Parser and the outside. Right now, I feel that the current Responder class is still way too structured for only the command line — all of the Responder.ask_to_select_mode() ask_song_key def ask_song_headers etc. methods need to be written as each queries now

    Bot 
    opened by t1-tracey 29
  • Octaves 1, 2, and 3 give parsing errors

    Octaves 1, 2, and 3 give parsing errors

    For most people, absolute octave numbers mean nothing. If the song is within a single octave, they simply give note names (eg C, B, G) and that's fine because our code assumes the octave is 4.

    But if the songs spans several octaves, some people will input the song starting from octave 1. This gives errors because we assume that Sky's piano starts at C4.

    We have three options from here, I will list them by order of my preference:

    1. Change 'note_shift' back to 'octave_shift', use 'octave_shift' before parsing the song to interpret user input
    2. use note_shift before parsing the song. Then we do octave_shift = int(note_shift/n), and note_shift = note_shift - octave_shift*n, where n = 12 or 7, depending on which point of view we choose (real-world's chromatic or Sky's heptatonic system)
    3. Try to parse the song with different octave_shift and chooses the one which gives less errors

    My preferences goes to solution no1 because now that we handle all the musical keys available in Sky, we don't need to transpose songs within Sky's system (the initial use of note_shift was to transpose songs to work with C), while transposition within the general chromatic scale will be handled elsewhere (#32)

    What do you think Tracey?

    enhancement help wanted 
    opened by jmmelko 20
  • Next steps for Midi rendering

    Next steps for Midi rendering

    It was so fun and easy to add midi output!

    At the present time it does not support other keys than C, but I am confident that after we validate the western branch we can do it.

    Please fell free to test it.

    I think it is safe to merge it in the beta and/or the master branch, because in case of a bug we can still disable the midi output, or write a caution "this is a beta feature" message. But only after we decide what to do with the western_branch


    • [x] test it (-> Tracey)
    • [x] decide if the “broken chord” note is alright (I have chosen a short high pitched note) (-> Tracey)
    • [x] add support for other keys than C (-> mimizan)
    • [x] add support for non-English keys
    • [x] see how to change tempo, do we add a constant in main?
    • [x] decide if we stick to piano or let the user choose its instrument among a list
    • [x] in the documentation, tell that midi rendering is only intended for testing the melody, not for simulating the musical rendering in Sky, especially because pauses are always of the same duration so that the rhythm is not always right (->Tracey) https://sky.bloomexperiment.com/t/summary-of-output-modes/450?u=cactusflower
    enhancement help wanted 
    opened by jmmelko 20
  • (Maybe) Split parsers.py into files

    (Maybe) Split parsers.py into files

    As suggested by Strawb:

    The code in parsers.py is very long.

    The reason for that is that it handles many different input formats (aka song notations), and uses long hard coded variables, such as dictionaries, regular expressions, etc.

    I think we could easily split the NoteParsers into different files:

    • SkyKeyboardNoteParser
    • SkyNoteParser
    • EnglishNoteParser
    • EnglishChordsNoteParser
    • DoremiNoteParser
    • JianpuNoteParser

    I suppose we would also have to put the generic NoteParser in a separate file.

    I can do it but I need confirmation from our Code Mistress.

    This is our 100th issue!

    Happy birthday everyone 🥳🎂

    enhancement needs-testing 
    opened by jmmelko 14
  • Add methods to write images to buffer (without needing to write to a filepath)

    Add methods to write images to buffer (without needing to write to a filepath)

    How to write to a file without needing to write it to disk

    buffer = StringIO()
    # use it as any other file here to write to it
    buffer.seek(0) # reset the reader to the beginning
    await channel.send(file=discord.File(buffer, "filename"))
    
    Bot needs-testing 
    opened by t1-tracey 14
  • Stuck with implementing 'create song' for bot

    Stuck with implementing 'create song' for bot

    Current work: https://github.com/e-a-h/That-Sky-Bot/blob/dev-music/cogs/Music.py


    My earlier test (copied code from the old main.py): https://github.com/t1-tracey/That-Sky-Bot/blob/dev-music/cogs/Music.py

    Bugs channel example: https://github.com/e-a-h/That-Sky-Bot/blob/dev-music/cogs/Bugs.py


    I don't know how to implement asking the questions. Alex recommended to make each question a model, (which is in line with what Strawb suggested about making Parser, Song and Renderer separate). that will mean more reorganising.

    I keep feeling too overwhelmed and incompetent on my own, about what to prioritise next, I need help

    help wanted Bot 
    opened by t1-tracey 13
  • Bug when finding song key for notes specified without octaves

    Bug when finding song key for notes specified without octaves

    note_parser = EnglishNoteParser()
    print(note_parser.calculate_coordinate_for_note('G', 'Ab', note_shift=0))
    

    I was doing some testing with Let it go and this case fails, I will look into it

    bug help wanted 
    opened by t1-tracey 13
  • Commits not present in the western scales branch

    Commits not present in the western scales branch

    Besides the obvious, I have introduced a few enhancements into the master and beta branches, that are in NOT the western branch. Pushing them from the master to the western_scale branch would be dangereous, I think, since western is ahead master on several other aspects. Even though GitHub is smart, I fear that these improvements may get lost after we merge western_scale into the master. So I will list them below so we can check that they are still in the master after the merging:

    • [x] in main.css: font-size: 1.0em
    • [x] new file: css/warning.txt
    • [x] new file: elements/readme_elements.txt
    • [x] in instruments.py: optional PIL import with definition of no_PIL_module variable
    • [x] in main.py : compact writing of for ask_for_mode()
    • [x] in main.py: new version of load_file(), including a use of re and only one return parameter
    • [x] in main.py: compact value assignement of the ENABLED_MODES constant
    • [x] in main.py: compact writing of allowed song notations (for mode in InputModes...)
    • [x] in main.py: use of the new method read_lines()
    • [x] in notes.py: optional PIL import
    • [x] in songs.py: optional PIL import and "if no_PIL_module == False:" statement in init() and "if no_PIL_module == True" statement in write_png function
    • [x] new file python/tools/readme_tools.txt
    enhancement help wanted 
    opened by jmmelko 12
  • TODOs for the WesternNoteParser parsers

    TODOs for the WesternNoteParser parsers

    • [x] Test the WesternNoteParser — address any errors, make sure it works with some test songs, make sure the other notations (Jianpu, Sky etc.) are still working

    • [x] Create test songs for all input modes

    • [x] Test ascii output (and sky-western conversion)

    • [x] Replace find_key with the new find_western_key.

    • [x] In main.py, for finding keys, maybe could we implement allowing the user to choose from the top 3 possible keys if there is no perfect match? (Like with the modes)

    • [x] Test what happens when several modes are detected

    • [x] Remove (or comment) Jianpu2Western functions

    • [x] Avoid using the old position_maps

    • [x] rewrite detect_input_type

    • [x] cleanup is welcome if you find anything

    • [x] check that the coordinate of the western note is in the range of the Sky piano (0,0) to (2,4) before returning it, otherwise raise an error, so that a broken harp will be produced

    • [x] Specifically test input_mode and music recognition

    • [x] specifically test with dirty input (typos, missing octaves)

    As for Jianpu and do re mi, I wasn't sure if they needed this NoteParser. But I just realised that maybe it could help to generate the coordinates rather than the long dictionaries currently used. I haven’t thought through this yet though.

    • [x] finish implementation of Jianpu parsing

    • [x] specifically test Jianpu and doremi parsing

    • [x] check if the old trick to set pauses (breaks) to the (-1,-1) position is still used and/or that pauses are parsed correctly, including in find_keys and detect_input_type methods

    • [x] before merging the western branch into the beta branch, archive the master in the stable

    Any of these tasks are ok hehe

    help wanted 
    opened by t1-tracey 12
  • Two ideas for Two hand piano (by Kimu)

    Two ideas for Two hand piano (by Kimu)

    When a music score is split into two layers, one for each hand :

    • merge the notes of both layers into a unique layer
    • Use a different color for each hand

    To do that: Use highlighted frame =0 for the first layer, and highlighted frame =-1 for the second one. Because using highlighted frame >0 would confuse the notes with quavers

    Then assign the color of frame = max to -1, so that the colors for frame 0 and -1 are very different.

    85A5FAEF-9C38-4FBB-8AB9-D1A738E2659F

    enhancement 
    opened by jmmelko 1
  • MusicSheetMaker song_creation as a list of self.methods?

    MusicSheetMaker song_creation as a list of self.methods?

    I think it is possible to make the song_creation method a pure list of calls to self.methods, using only the recipient as the input parameter. To do, this 2 steps:

    • [ ] Create a retrieve_song_notes methods, which searches for the latest query about notes and get the notes out of it. Tricky part: handle files.
    • [ ] Make create_song a loop iterating over a dictionary of self.methods, calling them one by one, with recipient as the only parameter
    • [ ] Add an n integer or 'string' input parameter in create_song so we can skip to the call of method of the nth method or referenced by 'string'

    Then, the code in the cog would become:

    for i in range(len(maker.continue_song)):
        q = maker.continue_song(recipient=player, method=i)
        execute(q)
    
    wontfix Bot 
    opened by jmmelko 0
  • Ideas for new features

    Ideas for new features

    We will list here ideas of new features. Relative priorities will be decided according to player’s demands, if the code makes its way to Discord...

    • under-the-hood changes:
      • [x] a new class for handling bot/code interaction (#104). I am not talking about player/bot interaction, which is something else. [suggested by @e-a-h & @t1-tracey ]
      • [x] make chord_sky_grid a separate class (#75) [suggested by @t1-tracey]
      • [x] (maybe) putting the Renderer outside Song (#99)
      • [ ] wrap the time-consuming functions in a function and offload it to another thread using asyncio, to avoid clogging the bot [suggested by @AEnterprise].

    .

    • Front end features:
      • [x] dark mode (thank you Specy)
      • [x] link to generate a song on Sky-music.github.io (just have to test it and pull it to the Music Cog of thatSkyBot)
      • [ ] add measure dividers (parse |, add vertical line drawing)
      • [x] database storage of songs, with the ability to search [suggested by @e-a-h] => this is implemented in the website at [email protected]
      • [x] two-hands, or two-instruments [suggested by @IchigoDaifuku aka Strawb]
      • [ ] better handling of lyrics (how?)
      • [ ] better tempo handling
      • [ ] key transposition (aka transposition in the chromatic scale) [suggested by @jmmelko and @e-a-h]
    enhancement 
    opened by jmmelko 0
Owner
null
Official Matplotlib cheat sheets

Official Matplotlib cheat sheets

Matplotlib Developers 6.7k Jan 9, 2023
Peloton Stats to Google Sheets with Data Visualization through Seaborn and Plotly

Peloton Stats to Google Sheets with Data Visualization through Seaborn and Plotly Problem: 2 peloton users were looking for a way to track their metri

null 9 Jul 22, 2022
https://there.oughta.be/a/macro-keyboard

inkkeys Details and instructions can be found on https://there.oughta.be/a/macro-keyboard In contrast to most of my other projects, I decided to put t

Sebastian Staacks 209 Dec 21, 2022
Alternative layout visualizer for ZSA Moonlander keyboard

General info This is a keyboard layout visualizer for ZSA Moonlander keyboard (because I didn't find their Oryx or their training tool particularly us

null 10 Jul 19, 2022
Dipto Chakrabarty 7 Sep 6, 2022
Graphical display tools, to help students debug their class implementations in the Carcassonne family of projects

carcassonne_tools Graphical display tools, to help students debug their class implementations in the Carcassonne family of projects NOTE NOTE NOTE The

null 1 Nov 8, 2021
Graphical visualizer for spectralyze by Lauchmelder23

spectralyze visualizer Graphical visualizer for spectralyze by Lauchmelder23 Install Install matplotlib and ffmpeg. Put ffmpeg.exe in same folder as v

Matthew 1 Dec 21, 2021
Splore - a simple graphical interface for scrolling through and exploring data sets of molecules

Scroll through and exPLORE molecule sets The splore framework aims to offer a si

null 3 Jun 18, 2022
🧇 Make Waffle Charts in Python.

PyWaffle PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts. It provides a Figure constructor class Waffle, which coul

Guangyang Li 528 Jan 2, 2023
🧇 Make Waffle Charts in Python.

PyWaffle PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts. It provides a Figure constructor class Waffle, which coul

Guangyang Li 397 Feb 17, 2021
Make sankey, alluvial and sankey bump plots in ggplot

The goal of ggsankey is to make beautiful sankey, alluvial and sankey bump plots in ggplot2

David Sjoberg 156 Jan 3, 2023
GitHubPoster - Make everything a GitHub svg poster

GitHubPoster Make everything a GitHub svg poster 支持 Strava 开心词场 扇贝 Nintendo Switch GPX 多邻国 Issue

yihong 1.3k Jan 2, 2023
Make your BSC transaction simple.

bsc_trade_history Make your BSC transaction simple. 中文ReadMe Background: inspired by debank ,Practice my hands on this small project Blog:Crypto-BscTr

foolisheddy 7 Jul 6, 2022
Make scripted visualizations in blender

Scripted visualizations in blender The goal of this project is to script 3D scientific visualizations using blender. To achieve this, we aim to bring

Praneeth Namburi 10 Jun 1, 2022
I'm doing Genuary, an aritifiacilly generated month to build code that make beautiful things

Genuary 2022 I'm doing Genuary, an aritifiacilly generated month to build code that make beautiful things. Every day there is a new prompt for making

Joaquín Feltes 1 Jan 10, 2022
Lumen provides a framework for visual analytics, which allows users to build data-driven dashboards from a simple yaml specification

Lumen project provides a framework for visual analytics, which allows users to build data-driven dashboards from a simple yaml specification

HoloViz 120 Jan 4, 2023
Visual Python is a GUI-based Python code generator, developed on the Jupyter Notebook environment as an extension.

Visual Python is a GUI-based Python code generator, developed on the Jupyter Notebook environment as an extension.

Visual Python 564 Jan 3, 2023
A small script written in Python3 that generates a visual representation of the Mandelbrot set.

Mandelbrot Set Generator A small script written in Python3 that generates a visual representation of the Mandelbrot set. Abstract The colors in the ou

null 1 Dec 28, 2021
PyFlow is a general purpose visual scripting framework for python

PyFlow is a general purpose visual scripting framework for python. State Base structure of program implemented, such things as packages disco

null 1.8k Jan 7, 2023