PianoPlayer - Automatic fingering generator for piano scores

Overview

PianoPlayer

Codacy Badge Downloads lics DOI

Automatic piano fingering generator.
Find the optimal fingering combination to play a piano score. Optionally visualize it in 3D with vedo.

Download and Install:

pip install pianoplayer

to enable sound you may need to:

sudo apt install libasound2-dev
pip install simpleaudio

Installing without 3D rendering

To only install the core functionality and skip everything else, use the following:

pip install music21
pip install --no-deps pianoplayer

To visualize the output annotated score install the latest musescore, or any other renderer of MusicXML files.

Windows 10 users can place this file: pianoplayer.bat on their desktop (edit the path to your local anaconda or python installation). Check out this link in case of installation problems.

CLI Usage:

Example command line from terminal:
pianoplayer scores/bach_invention4.xml --verbose -n10 -rvzm
will find the right hand fingering for the first 10 measures, pop up a 3D rendering window and invoke musescore.

The output is saved as a MusicXML file with name output.xml.

pianoplayer         # if no argument is given a GUI will pop up (on windows try `python pianoplayer.py`)
# Or
pianoplayer [-h] [-o] [-n] [-s] [-d] [-k] [-rbeam] [-lbeam] [-q] [-m] [-v] [--vedo-speed]
            [-z] [-l] [-r] [-XXS] [-XS] [-S] [-M] [-L] [-XL] [-XXL]
            filename
# Valid file formats: MusicXML, musescore, midi (.xml, .mscz, .mscx, .mid)
#
# Optional arguments:
#   -h, --help            show this help message and exit
#   -o , --outputfile     Annotated output xml file name
#   -n , --n-measures     [100] Number of score measures to scan
#   -s , --start-measure  Start from measure number [1]
#   -d , --depth          [auto] Depth of combinatorial search, [2-9]
#   -rbeam                [0] Specify Right Hand beam number
#   -lbeam                [1] Specify Left Hand beam number
#   --quiet               Switch off verbosity
#   -m, --musescore       Open output in musescore after processing
#   -b, --below-beam      Show fingering numbers below beam line
#   -v, --with-vedo       Play 3D scene after processing
#   -z, --sound-off       Disable sound
#   -l, --left-only       Fingering for left hand only
#   -r, --right-only      Fingering for right hand only
#   -XXS, --hand-size-XXS Set hand size to XXS
#   -XS, --hand-size-XS   Set hand size to XS
#   -S, --hand-size-S     Set hand size to S
#   -M, --hand-size-M     Set hand size to M
#   -L, --hand-size-L     Set hand size to L
#   -XL, --hand-size-XL   Set hand size to XL
#   -XXL, --hand-size-XXL Set hand size to XXL

GUI Usage:

Just type pianoplayer in a terminal (or double click the pianoplayer.bat file), then:

newgui

  • press Import Score (valid formats: musescore, MusicXML, MIDI, PIG)
  • press GENERATE (output.xml is written)
  • press Musescore to visualize the annotated score
  • press 3D Player to show the animation (Press Esc to quit the application)

Example output, as displayed in musescore:

(If fingering numbers are not visible enough try -b option.)

bachinv4

pianoplayer3d

How the algorithm works:

The algorithm minimizes the fingers speed needed to play a sequence of notes or chords by searching through feasible combinations of fingerings.

One possible advantage of this algorithm over similar ones is that it is completely dynamic, which means that it takes into account the physical position and speed of fingers while moving on the keyboard and the duration of each played note. It is not based on a static look-up table of likely or unlikely combinations of fingerings.

Fingering a piano score can vary a lot from individual to individual, therefore there is not such a thing as a "best" choice for fingering. This algorithm is meant to suggest a fingering combination which is "optimal" in the sense that it minimizes the effort of the hand avoiding unnecessary movements.

Parameters you can change:

  • Your hand size (from 'XXS' to 'XXL') which sets the relaxed distance between thumb and pinkie.
  • The beam number associated to the right hand is by default nr.0 (nr.1 for left hand). You can change it with -rbeam and -lbeam command line options.
  • Depth of combinatorial search, from 3 up to 9 notes ahead of the currently playing note. By default the algorithm selects this number automatically based on the duration of the notes to be played.

Limitations

  • Some specific fingering combinations, considered too unlikely in the first place, are excluded from the search (e.g. the 3rd finger crossing the 4th).
  • Hands are always assumed independent from each other.
  • In the 3D representation with sounds enabled, notes are played one after the other (no chords), so the tempo within the measure is not always respected.
  • Small notes/ornaments are ignored.
Comments
  • cannot find vtkplotter package

    cannot find vtkplotter package

    I receive the following error on Windows 10 and Ubuntu 18.04 as well after I import a score and click on 3D player in the GUI.

    VirtualKeyboard: cannot find vtkplotter package. Not installed?
    Try:
    (sudo) pip install --upgrade vtkplotter
    

    Any idea?

    bug 
    opened by kohanyirobert 10
  • Problem installing

    Problem installing

    Hello! The last month, i've been trying to install this program, but i just can't seem to do it. I never worked with python before, but i managed to get pip install working now. When i put in the pip install --upgrade pianoplayer , it says :

    Collecting pianoplayer Using cached pianoplayer-2.1.0.tar.gz (1.2 MB) Collecting music21 Using cached music21-5.7.2.tar.gz (18.5 MB) Collecting vtkplotter Using cached vtkplotter-2020.3.1.tar.gz (18.4 MB) ERROR: Could not find a version that satisfies the requirement vtk (from vtkplotter->pianoplayer) (from versions: none) ERROR: No matching distribution found for vtk (from vtkplotter->pianoplayer)

    when i then try to open the batch file, it just flashes and dissapears. Could someone please help me out? Thank you! Regards, Brend

    opened by BrendRR 10
  • Suggestion to UI

    Suggestion to UI

    Instead of writing fingering numbers as lyrics, could you consider using MuseScore's fingering notation? I think it would be more ergonomic and aesthetically more pleasing.

    opened by mhoangvslev 8
  • pianoplayer) (from versions: none) ERROR: No matching distribution found for vtk (from vtkplotter->pianoplayer)"">

    " Using cached vtkplotter-2020.3.1.tar.gz (18.4 MB) ERROR: Could not find a version that satisfies the requirement vtk (from vtkplotter->pianoplayer) (from versions: none) ERROR: No matching distribution found for vtk (from vtkplotter->pianoplayer)"

    Hi, I'm trying to install this for windows 10 and I get this error when I enter "pip install --upgrade pianoplayer" what should I do? I'm using python 3.8.5 if that matters.

    opened by gabezilla52 6
  • AttributeError: 'Instrument' object has no attribute 'tie'

    AttributeError: 'Instrument' object has no attribute 'tie'

    I'm getting the following error when running pianoplayer "xy.mid" --verbose -n10 -rvz (tested on Windows with Python 3.8 & 3.7, and on Manjaro python 3.8)

    Traceback (most recent call last):
      File "/home/anton/.local/bin/pianoplayer", line 195, in <module>
        rh.noteseq = reader(sf, beam=args.rbeam)
      File "/home/anton/.local/lib/python3.8/site-packages/pianoplayer/scorereader.py", line 51, in reader
        if n.tie and (n.tie.type=='continue' or n.tie.type=='stop'): continue
    AttributeError: 'Instrument' object has no attribute 'tie'
    
    opened by IngoOutgo 4
  • Errors package

    Errors package

    I downloaded the 2000 most popular piano sheet music from Musescore, as mxl.

    I ran the lastest pip version of pianoplayer on all of the files (on XXS setting), and started getting errors, like https://github.com/marcomusy/pianoplayer/issues/21 and others (python errors).

    Here I share an archive of all of the files that had execution errors (148 out of 2000), in the hope this helps you make this system more robust.

    File names are constructed from musescore ID, and title, so you can always trace back to musescore.com in order to see the file.

    errors.zip

    opened by AmitMY 4
  • Hand size keeps defaulting to M, MuseScore3 not showing fingering

    Hand size keeps defaulting to M, MuseScore3 not showing fingering

    Running this on Windows, so not sure how much of it has to do with this!

    Whenever I try to run it from either the GUI or command line using -S, -XS, etc, it defaults to M. It also seems to run through it twice (e.g., I see 'Your hand span set to size-M which is 17.22 cm (max relaxed distance between thumb and pinkie)' appear twice with the fingering output following it.

    Additionally, opening the output.xml file in MuseScore3 does not show any fingering, just the music. Scanning through the output file XML doesn't seem to clearly show any fingering.

    My apologies if this has already been addressed - I've searched through the issues and haven't seen anything in regard to these two issues!

    opened by kchurch05 3
  • Exception in Tkinter Callback

    Exception in Tkinter Callback

    Love this program as it's very helpful in learning fingering for new songs but getting an Exception in Tkinter calklback on a couple scores and hoping you might be able to help?

    Saving score to output.xml
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Matth\anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:\Users\Matth\anaconda3\Scripts\pianoplayer", line 93, in generateCMD
        sf.write('xml', fp='output.xml')
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\__init__.py", line 252, in write
        return super().write(*args, **kwargs)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\base.py", line 2562, in write
        return formatWriter.write(self, regularizedConverterFormat, fp, subformats, **keywords)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\converter\subConverters.py", line 927, in write
        dataBytes = generalExporter.parse()
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\musicxml\m21ToXml.py", line 363, in parse
        outObj = self.fromGeneralObject(obj)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\musicxml\m21ToXml.py", line 399, in fromGeneralObject
        outObj = meth(obj)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\musicxml\m21ToXml.py", line 411, in fromScore
        scOut = sc.makeNotation(inPlace=False)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\__init__.py", line 13127, in makeNotation
        **subroutineKeywords)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\__init__.py", line 6040, in makeNotation
        bestClef=bestClef)
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\__init__.py", line 5765, in makeMeasures
        inPlace=inPlace,
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\makeNotation.py", line 577, in makeMeasures
        'within any measures' % (e, start, end))
    music21.exceptions21.StreamException: cannot place element Piano with start/end 180.0/180.0 within any measures
    

    On a different score I get the following error:

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Matth\anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:\Users\Matth\anaconda3\Scripts\pianoplayer", line 89, in generateCMD
        self.lh.noteseq = reader(sf, beam=self.LeftHandBeam)
      File "C:\Users\Matth\anaconda3\lib\site-packages\pianoplayer\scorereader.py", line 32, in reader
        strm = sf.parts[beam].flat
      File "C:\Users\Matth\anaconda3\lib\site-packages\music21\stream\iterator.py", line 328, in __getitem__
        e = fe[k]
    IndexError: list index out of range
    

    I did some research and found the following: This error occurs when you run a program using the Canvas library (used from Unit 2 onwards) more than once. This is a known problem with Canvas, and is not caused by your programming. The only solution is to close all Python windows then re-run IDLE after each time you run your program.

    Not sure if the above is relevant. Any idea on how to fix the issue?

    bug 
    opened by mathiasjg 3
  • Exception on loading a music xml file

    Exception on loading a music xml file

    Windows 7, x64 system with python 3.6.

    I get an exception after loading a XML file. The program first prints the following

    Your hand span set to size-M which is 17.22 cm
    (max relaxed distance between thumb and pinkie)
    Reading beam 0 with 63 objects in stream.
    meas.1   finger:2 on C4         v=0.1      [2, 2, 3, 2, 5, 4] d:
    meas.1   finger:2 on C4         v=0.1      [2, 3, 2, 5, 4] d:5
    meas.2   finger:3 on D4         v=0.1      [3, 2, 5, 4, 2] d:5
    meas.2   finger:2 on C4         v=0.1      [2, 5, 4, 2, 2] d:5
    meas.2   finger:5 on F4         v=0.1      [5, 4, 2, 2, 3] d:5
    meas.3   finger:4 on E4         v=0.1      [4, 2, 2, 3, 2] d:5
    meas.3   finger:2 on C4         v=0.6      [2, 2, 3, 2, 5, 4] d:
    meas.3   finger:2 on C4         v=0.8      [2, 3, 2, 5, 4] d:5
    meas.4   finger:3 on D4         v=0.9      [3, 2, 5, 4, 1] d:5
    meas.4   finger:2 on C4         v=0.8      [2, 5, 4, 1, 1] d:5
    meas.4   finger:5 on G4         v=3.3      [5, 4, 1, 1, 5] d:5
    meas.5   finger:4 on F4         v=3.3      [4, 1, 1, 5, 3] d:5
    meas.5   finger:1 on C4         v=3.2      [1, 1, 5, 3, 2, 1] d:
    meas.5   finger:1 on C4         v=4.0      [1, 5, 3, 2, 1] d:5
    meas.6   finger:5 on C5         v=1.3      [5, 4, 3, 2, 1] d:5
    meas.6   finger:4 on A4         v=0.8      [4, 3, 2, 1, 5] d:5
    meas.6   finger:3 on F4         v=0.4      [3, 2, 1, 5, 5] d:5
    meas.7   finger:2 on E4         v=0.7      [2, 1, 5, 5, 4, 2] d:
    meas.7   finger:1 on D4         v=0.6      [1, 5, 5, 4, 2, 4] d:
    meas.7   finger:5 on B-4        v=0.5      [5, 5, 4, 2, 4, 3] d:
    meas.7   finger:5 on B-4        v=0.6      [5, 4, 2, 4, 3] d:5
    meas.8   finger:4 on A4         v=0.5      [4, 2, 4, 3, 1] d:5
    meas.8   finger:2 on F4         v=0.7      [2, 4, 3, 1, 2] d:5
    meas.8   finger:4 on A4         v=0.9      [4, 3, 1, 2, 1] d:5
    meas.9   finger:3 on G4         v=0.9      [3, 2, 3, 2, 5] d:5
    meas.9   finger:2 on C4         v=0.1      [2, 3, 2, 5, 4] d:5
    meas.10   finger:3 on D4        v=0.1      [3, 2, 5, 4, 2] d:5
    meas.10   finger:2 on C4        v=0.1      [2, 5, 4, 2, 3] d:5
    meas.10   finger:5 on F4        v=0.1      [5, 4, 2, 3, 2] d:5
    meas.11   finger:4 on E4        v=0.8      [4, 2, 3, 2, 5] d:5
    meas.11   finger:2 on C4        v=0.8      [2, 3, 2, 5, 4] d:5
    meas.12   finger:3 on D4        v=0.9      [3, 2, 5, 4, 1] d:5
    meas.12   finger:2 on C4        v=2.6      [2, 5, 4, 1, 5] d:5
    meas.12   finger:5 on G4        v=1.9      [5, 4, 1, 5, 3] d:5
    meas.13   finger:4 on F4        v=2.1      [4, 1, 5, 3, 1] d:5
    meas.13   finger:1 on C4        v=2.6      [1, 5, 3, 2, 1] d:5
    meas.14   finger:5 on C5        v=1.3      [5, 4, 3, 2, 1] d:5
    meas.14   finger:4 on A4        v=0.8      [4, 3, 2, 1, 5] d:5
    meas.14   finger:3 on F4        v=0.6      [3, 2, 1, 5, 4] d:5
    meas.15   finger:2 on E4        v=0.6      [2, 1, 5, 4, 2] d:5
    meas.15   finger:1 on D4        v=0.4      [1, 5, 4, 2, 3] d:5
    meas.15   finger:5 on B-4       v=0.3      [5, 4, 2, 3, 2] d:5
    meas.16   finger:4 on A4
    meas.16   finger:2 on F4
    meas.16   finger:3 on G4
    meas.17   finger:2 on F4
    meas.17   finger:1 on C4
    meas.17   finger:1 on C4
    meas.18   finger:5 on A4
    meas.18   finger:3 on F4
    meas.18   finger:4 on G4
    meas.19   finger:0 on F4
    Your hand span set to size-M which is 17.22 cm
    (max relaxed distance between thumb and pinkie)
    

    and then throws an exception

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1705, in __call
    __
        return self.func(*args)
      File "pianoplayer", line 89, in generateCMD
        self.lh.noteseq = reader(sf, beam=self.LeftHandBeam)
      File "C:\Program Files\Python36\lib\site-packages\pianoplayer\scorereader.py",
     line 32, in reader
        strm = sf.parts[beam].flat
      File "C:\Program Files\Python36\lib\site-packages\music21\stream\iterator.py",
     line 328, in __getitem__
        e = fe[k]
    IndexError: list index out of range
    

    I have attached the xml file that causes this error. Any pointers to this would be very helpful. TIA

    hb.zip

    opened by GitterHubber 3
  • Odd results for some accidentals

    Odd results for some accidentals

    This is a neat piece of software -- thanks for writing it!

    I've been playing with it a bit and noticed that for some "weird" accidentals like Cb the program outputs bizarre fingering choices. If I rewrite the note as B the fingering makes much more sense. I haven't tried the other comparable accidentals (B#, E#, Fb) to know if this is a general or specific problem (nor have I looked at double sharps or double flats). You may not even be actively working on this software anymore, but in case you are this is a minor issue that could use correcting. Thanks!

    Best, Jeffrey

    opened by jncarey 3
  • Double sharps are not recognized

    Double sharps are not recognized

    So for this score: https://musescore.com/user/147231/scores/1029831

    I get many errors:

    ERROR note not found F##

    Definitely makes sense why it's not recognized, just wanted to let you know in case you want to fix

    opened by AmitMY 2
  • On Windows

    On Windows

    "pip install pianoplayer" gives

    ERROR: Cannot install pianoplayer==1.0.0, pianoplayer==1.1.0, pianoplayer==1.1.1, pianoplayer==2.0.0, pianoplayer==2.0.1, pianoplayer==2.0.4, pianoplayer==2.0.5, pianoplayer==2.0.6, pianoplayer==2.0.7 and pianoplayer==2.1.0 because these package versions have conflicting dependencies.

    opened by AllTheProjects 1
  • Cannot visualize: `ERROR: texture file wood1 does not exist`

    Cannot visualize: `ERROR: texture file wood1 does not exist`

    Hello. I'm trying to visualize my MIDI file with this command:

    pianoplayer midi_file.midi -vz
    

    However, the command fails with these errors:

    [vedo.mesh.py:463] ERROR: texture file wood1 does not exist
    [vedo.mesh.py:463] ERROR: texture file wood1 does not exist
    Traceback (most recent call last):
      File "/home/hiroki/.local/bin/pianoplayer", line 224, in <module>
        vk = VirtualKeyboard(songname=xmlfn)
      File "/home/hiroki/.local/lib/python3.9/site-packages/pianoplayer/vkeyboard.py", line 41, in __init__
        self.build_keyboard()
      File "/home/hiroki/.local/lib/python3.9/site-packages/pianoplayer/vkeyboard.py", line 91, in build_keyboard
        self.vp += Text('PianoPlayer ^'+__version__+" ",
    NameError: name 'Text' is not defined
    

    I couldn't find the texture files on my computer. How can I get them?

    opened by toku-sa-n 3
  • No output.xml

    No output.xml

    After the program is finished processing, there is no output.xml file, or it is nowhere to be found. The first time running the program, it was found in the folder, but no longer. Also, the GUI Musescore function does not work, returning 'musescore' is not recognized as an internal or external command, operable program or batch file..

    opened by ztianhan 0
  • Timing information units ?

    Timing information units ?

    Hi,

    I am trying to understand the data in the INote class, in particular self.time and self.duration

    https://github.com/marcomusy/pianoplayer/blob/master/pianoplayer/scorereader.py#L20

    What are their units ? Are they measured in seconds or are they relative to another time reference ?

    Cheers

    opened by nyue 0
Releases(2.2.0)
Owner
Marco Musy
EMBL
Marco Musy
Convert complex chord names to midi notes

ezchord Simple python script that can convert complex chord names to midi notes Prerequisites pip install midiutil Usage ./ezchord.py Dmin7 G7 C timi

Alex Zhang 2 Dec 20, 2022
Bot Music Pintar. Created by Rio

๐ŸŽถ Rio Music ๐ŸŽถ Kalo Fork Star Ya Bang Hehehe Requirements ๐Ÿ“ FFmpeg NodeJS nodesource.com Python 3.8+ or 3.7 PyTgCalls Generate String Using Replit โคต

RioProjectX 7 Jun 15, 2022
Python library for audio and music analysis

librosa A python package for music and audio analysis. Documentation See https://librosa.org/doc/ for a complete reference manual and introductory tut

librosa 5.6k Jan 06, 2023
A Quick Music Player Made Fully in Python

Quick Music Player Made Fully In Python. Pure Python, cross platform, single function module with no dependencies for playing sounds. Installation & S

1 Dec 24, 2021
A tool for retrieving audio in the past

Rewinder A tool for retrieving audio in the past. Ever felt like, I need to remember that discussion which happened 10 min back. Now you can! Rewind a

Bharat 1 Jan 24, 2022
Cobra is a highly-accurate and lightweight voice activity detection (VAD) engine.

On-device voice activity detection (VAD) powered by deep learning.

Picovoice 88 Dec 16, 2022
MelGAN test on audio decoding

Official repository for the paper MelGAN: Generative Adversarial Networks for Conditional Waveform Synthesis The original work URL: https://github.com

Jurio 1 Apr 29, 2022
Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline

upai-gst-dl-plugins Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline Introduction Thanks to the work done by @j

UPAI.IO 11 Dec 11, 2022
Simple discord bot by @merive ๐Ÿค–

Parzibot Powerful and Useful Discord Bot on Python. The source code of the bot is available to everyone. Parzibot uses English language. This is free

merive_ 3 Dec 28, 2022
Neural building blocks for speaker diarization: speech activity detection, speaker change detection, overlapped speech detection, speaker embedding

โš ๏ธ Checkout develop branch to see what is coming in pyannote.audio 2.0: a much smaller and cleaner codebase Python-first API (the good old pyannote-au

pyannote 2.1k Dec 31, 2022
Pyrogram bot to automate streaming music in voice chats

Pyrogram bot to automate streaming music in voice chats Help If you face an error, want to discuss this project or get support for it, join it's group

Roj 124 Oct 21, 2022
Multi-Track Music Generation with the Transfomer and the Johann Sebastian Bach Chorales dataset

MMM: Exploring Conditional Multi-Track Music Generation with the Transformer and the Johann Sebastian Bach Chorales Dataset. Implementation of the pap

102 Dec 08, 2022
This Bot can extract audios and subtitles from video files

Send any valid video file and the bot shows you available streams in it that can be extracted!!

TroJanzHEX 56 Nov 22, 2022
Python game programming in Jupyter notebooks.

Jupylet Jupylet is a Python library for programming 2D and 3D games, graphics, music and sound synthesizers, interactively in a Jupyter notebook. It i

Nir Aides 178 Dec 09, 2022
Improved Python UI to convert Youtube URL to .mp3 file.

YT-MP3 Improved Python UI to convert Youtube URL to .mp3 file. How to use? Just run python3 main.py Enter the URL of the video Enter the PATH of where

8 Jun 19, 2022
Minimal command-line music player written in Python

pyms Minimal command-line music player written in Python. Designed with elegance and minimalism. Resizes dynamically with your terminal. Dependencies

12 Sep 23, 2022
FPGA based USB 2.0 high speed audio interface featuring multiple optical ADAT inputs and outputs

ADAT USB Audio Interface FPGA based USB 2.0 High Speed audio interface featuring multiple optical ADAT inputs and outputs Status / current limitations

Hans Baier 78 Dec 31, 2022
Code to work with wave files!

Code to work with wave files!

Mohammad Dori 3 Jul 15, 2022
Python Audio Analysis Library: Feature Extraction, Classification, Segmentation and Applications

A Python library for audio feature extraction, classification, segmentation and applications This doc contains general info. Click here for the comple

Theodoros Giannakopoulos 5.1k Jan 02, 2023
XA Music Player - Telegram Music Bot

XA Music Player Requirements ๐Ÿ“ FFmpeg (Latest) NodeJS nodesource.com (NodeJS 17+) Python (3.10+) PyTgCalls (Lastest) MongoDB (3.12.1) 2nd Telegram Ac

RexAshh 3 Jun 30, 2022