{"id":20397639,"url":"https://github.com/jwdeveloper/jw_piano","last_synced_at":"2025-04-12T13:09:47.055Z","repository":{"id":45819340,"uuid":"445038237","full_name":"jwdeveloper/JW_Piano","owner":"jwdeveloper","description":"Play piano with your friends ","archived":false,"fork":false,"pushed_at":"2023-09-11T22:16:55.000Z","size":36905,"stargazers_count":8,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-12T13:09:33.041Z","etag":null,"topics":["bukkit","mc","midi","midi-player","minecraft","piano","plugin","spigot","spigot-plugin"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jwdeveloper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-06T04:20:01.000Z","updated_at":"2024-08-25T20:26:48.000Z","dependencies_parsed_at":"2023-02-12T03:01:33.452Z","dependency_job_id":null,"html_url":"https://github.com/jwdeveloper/JW_Piano","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwdeveloper%2FJW_Piano","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwdeveloper%2FJW_Piano/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwdeveloper%2FJW_Piano/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwdeveloper%2FJW_Piano/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jwdeveloper","download_url":"https://codeload.github.com/jwdeveloper/JW_Piano/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248571884,"owners_count":21126522,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bukkit","mc","midi","midi-player","minecraft","piano","plugin","spigot","spigot-plugin"],"created_at":"2024-11-15T04:15:55.795Z","updated_at":"2025-04-12T13:09:47.033Z","avatar_url":"https://github.com/jwdeveloper.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n![alt text](https://raw.githubusercontent.com/jwdeveloper/JW_Piano/master/resources/images/banner.png)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://discord.gg/2hu6fPPeF7\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/social-media/discord.png\"  /\u003e\u003c/a\u003e\u003ca href=\"https://github.com/jwdeveloper/JW_Piano\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/social-media/github.png\"  /\u003e\u003c/a\u003e\u003ca href=\"https://www.spigotmc.org/resources/piano.103490/\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/social-media/spigot.png\"  /\u003e\u003c/a\u003e\u003c/p\u003e\n\nA Minecraft plugin that adds a playable piano to the game would allow players to interact with a piano in the game world.\nThis piano would function just like a real-life piano, allowing players to play individual notes or full melodies using their real keyboard with Desktop app connection.\nThe plugin would add a new level of creativity and musical expression to the game, allowing players to showcase their musical talents and compose their own tunes.\nAdditionally, the piano could be used as a decorative item in the game world, adding a new element of realism and immersion to the game.\nOverall, this plugin would be a fun and unique addition to Minecraft, providing players with a new way to interact with the game world and express themselves.\n\n\n[Download Desktop App](https://github.com/jwdeveloper/JW_Piano_Desktop/releases/latest/download/JW_Piano_Desktop.jar)\n\n\n[Download Resourcepack](https://download.mc-packs.net/pack/5fb90b8870c925ec73f6debc7b7dfb18ec565ebc.zip)\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003eOraxen\u003c/summary\u003e\n\n\n### Oraxen configuration\n -  Setup for all users that willing to use Piano with Oraxen\n\n[open piano Oraxen config file](https://github.com/jwdeveloper/JW_Piano/blob/master/src/main/resources/oraxen/jw_piano_oraxen_config.yml)\n\n``` yaml\n#Generated template for Oraxen, It only contains models from pianopack\n#Remember to refresh config when pianopack got updated\n#Note that when you change LEATHER_HORSE_ARMOR to other material functionalities as Colored keys, Pianos, will not work\n\nbench:\n displayname: bench\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/bench\n  custom_model_data: 167072\n\nflyingnote:\n displayname: flyingnote\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/flyingnote\n  custom_model_data: 167073\n\nicon:\n displayname: icon\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/icons/icon\n  custom_model_data: 167074\n\npiano-black-key:\n displayname: piano black key\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/key/piano_black_key\n  custom_model_data: 167075\n\npiano-black-key-down:\n displayname: piano black key down\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/key/piano_black_key_down\n  custom_model_data: 167076\n\npiano-key:\n displayname: piano key\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/key/piano_key\n  custom_model_data: 167077\n\npiano-key-down:\n displayname: piano key down\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/key/piano_key_down\n  custom_model_data: 167078\n\npiano-pedal:\n displayname: piano pedal\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/pedal/piano_pedal\n  custom_model_data: 167079\n\npiano-pedal-down:\n displayname: piano pedal down\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/pedal/piano_pedal_down\n  custom_model_data: 167080\n\npianist-body:\n displayname: pianist body\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/pianist/pianist_body\n  custom_model_data: 167081\n\npianist-hands:\n displayname: pianist hands\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/pianist/pianist_hands\n  custom_model_data: 167082\n\npianist-head:\n displayname: pianist head\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/pianist/pianist_head\n  custom_model_data: 167083\n\nelectric-piano:\n displayname: electric piano\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/piano/electric_piano\n  custom_model_data: 167084\n\ngrand-piano:\n displayname: grand piano\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/piano/grand_piano\n  custom_model_data: 167085\n\ngrand-piano-close:\n displayname: grand piano close\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/piano/grand_piano_close\n  custom_model_data: 167086\n\nup-right-piano-close:\n displayname: up right piano close\n material: LEATHER_HORSE_ARMOR\n excludeFromInventory: true\n Pack:\n  generate_model: false\n  model: item/jw/piano/up_right_piano_close\n  custom_model_data: 167087\n\n\nnote_a:\n  texture: icons/notes/a\n  ascent: 2\n  height: 2\n  code: 4096\nnote_aSharp:\n  texture: icons/notes/a_sharp\n  ascent: 2\n  height: 2\n  code: 4097\nnote_b:\n  texture: icons/notes/b\n  ascent: 2\n  height: 2\n  code: 4098\nnote_c:\n  texture: icons/notes/c\n  ascent: 2\n  height: 2\n  code: 4099\nnote_cSharp:\n  texture: icons/notes/c_sharp\n  ascent: 2\n  height: 2\n  code: 4100\nnote_d:\n  texture: icons/notes/d\n  ascent: 2\n  height: 2\n  code: 4101\nnote_dSharp:\n  texture: icons/notes/d_sharp\n  ascent: 2\n  height: 2\n  code: 4102\nnote_e:\n  texture: icons/notes/e\n  ascent: 2\n  height: 2\n  code: 4103\nnote_f:\n  texture: icons/notes/f\n  ascent: 2\n  height: 2\n  code: 4104\nnote_fSharp:\n  texture: icons/notes/f_sharp\n  ascent: 2\n  height: 2\n  code: 4105\nnote_g:\n  texture: icons/notes/g\n  ascent: 2\n  height: 2\n  code: 4112\nnote_gSharp:\n  texture: icons/notes/g_sharp\n  ascent: 2\n  height: 2\n  code: 4113\n  \n\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eAPI for plugin developers\u003c/summary\u003e\n\nJW_Piano provides programming API to manipulate Pianos behaviour.\nYou can use it but adding JW_Piano.jar as soft dependency to your Plugin\n \n\n### Create Piano\n\n ```java\n        public void creatingPiano(Player player) {\n         Optional\u003cPiano\u003e optional = PianoApi.create(player.getLocation(), \"new piano\");\n         if (optional.isEmpty()) {\n            Bukkit.getConsoleSender().sendMessage(\"Unable to create piano ;\u003c\");\n            return;\n         }\n         Piano piano = optional.get();\n        }\n```\n \n\n### Register new skin\n\n ```java\n\n  public void addSkin(Piano piano) {\n     int customModelId = 100;\n     String name = \"custom skin\";\n     ItemStack itemStack = new ItemStack(Material.STICK);\n     PianoSkin customSkin = new PianoSkin(customModelId, name, itemStack);\n     piano.getSkinManager().register(customSkin);\n     piano.getSkinManager().setCurrent(customSkin);\n  }\n```\n\n### Register new effect\n\n ```java\n\n  public void addNewEffect(Piano piano) {\n        EffectInvoker customEffect = new CustomEffect();\n        piano.getEffectManager().register(customEffect);\n        piano.getEffectManager().setCurrent(customEffect);\n    }\n\n\n    public class CustomEffect implements EffectInvoker {\n        @Override\n        public String getName() {\n            return \"custom\";\n        }\n\n        @Override\n        public void onNote(PianoKey pianoKey, Location location, int noteIndex, int velocity, Color color) {\n            Bukkit.getConsoleSender().sendMessage(color + \"Note: \" + noteIndex + \"  Volume:\" + velocity);\n            location.getWorld().spawnParticle(Particle.NOTE, location, 1);\n        }\n\n        @Override\n        public void onDestroy() {\n            Bukkit.getConsoleSender().sendMessage(getName() + \"Destroyed\");\n        }\n\n        @Override\n        public void onCreate() {\n            Bukkit.getConsoleSender().sendMessage(getName() + \"Created\");\n        }\n\n        @Override\n        public void refresh() {\n            Bukkit.getConsoleSender().sendMessage(getName() + \"Refreshed\");\n        }\n    }\n  }\n```\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommon issues\u003c/summary\u003e\n\n\n### Resourcepack\n -  When you have some problems with resourcepack download it directly\n\n### Desktop app configuration, `config.yml` \u003e `plugin.websocket.server-ip`\n -  Make sure port you are trying to use is open\n -  When you've got problems with connection try to change `plugin.websocket.server-ip` or  `plugin.websocket.port`\n -  Check if you need to create new port in the server hosting panel and then set in to `plugin.websocket.port`\n -  When your server use proxy use Proxy IP to `plugin.websocket.server-ip`\n -  When you server IP has port ignore port. Example: \n\nWrong: `craftplayer.com:22225`\n\nCorrect: `craftplayer.com`\n\n -  When you are running server locally set value to `localhost` to `plugin.websocket.server-ip`\n -  When above solutions does not help set IP that you use in Minecraft server lists to `plugin.websocket.server-ip`\n\u003c/details\u003e\n\n[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/0KSN7dfi7PQ/0.jpg)](https://www.youtube.com/watch?v=0KSN7dfi7PQ\u0026ab_channel=JW)\n\n\n[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/PSbwsbX7xc0/0.jpg)](https://www.youtube.com/watch?v=PSbwsbX7xc0\u0026t=27s\u0026ab_channel=JW)\n\n\n![alt text](https://raw.githubusercontent.com/jwdeveloper/JW_Piano/master/resources/images/style.png)\n\n\n![alt text](https://raw.githubusercontent.com/jwdeveloper/JW_Piano/master/resources/images/webclient.png)\n\n\n![alt text](https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/banners/configuration.png)\n\n``` yaml\n#\n# \u003cPluginConfig\u003e\n# \n# piano.models-limit\n#  Limit of pianos that could be spawn on the server\n# \n# piano.piano-range\n#  Piano became interactive when player distance to piano is lower or equal that `piano-range`\n# \n# \n# sounds.namespace\n#  Name of the folder that sounds are save in resourcepack\n# \n# \n# sounds.sound-category\n#  Define sound category from minecraft settings that sound will play in.\n#  Allowed categories [AMBIENT, BLOCKS, HOSTILE, MASTER, MUSIC, NEUTRAL, RECORDS, VOICE, WEATHER]\n# \n# \u003c/PluginConfig\u003e\n# \n# plugin.resourcepack.url\n#    If you need to replace default resourcepack with your custom one\n#    set this to link of you resourcepack\n#    ! after plugin update make sure your custom resourcepack is compatible !\n# \n# \n# plugin.resourcepack.download-on-join\n#    Downloads resourcepack when player joins to server\n# \n# \n# plugin.websocket.run\n#    When false websocket will not run \n# \n# \n# plugin.saving-frequency\n#    Determinate how frequent data is saved to files, value in minutes\n# \n# \n# plugin.language\n#    If you want add your language open `languages` folder copy `en.yml` call it as you want \\n\" +\n#  \"set `language` property to your file name and /reload server \n# \n# \n# plugin.websocket.port\n#    Set port for websocket\n# ! Make sure that port is open\n# ! When you have server on hosting, generate new port on the hosting panel\n# \n# \n# \n# plugin.websocket.server-ip\n#    Set own IP for websocket, by default plugin use IP of your server\n# ! When you are using proxy set here proxy IP\n# ! When you are running plugin locally on your PC, set 'localhost'\n# ! When default IP not works try use IP that you are using in minecraft server list\n# \n# \n\nplugin:\n  version: 1.2.3\n  resourcepack:\n    url: https://download.mc-packs.net/pack/5fb90b8870c925ec73f6debc7b7dfb18ec565ebc.zip\n    download-on-join: false\n  websocket:\n    run: true\n    port: 443\n    server-ip: localhost\n  saving-frequency: 5\n  language: en\npiano:\n  models-limit: 10\n  piano-range: 3.0\nskins:\n  value-1:\n    name: none\n    custom-model-id: 0\n    material: AIR\n  value-2:\n    name: upright piano\n    custom-model-id: 167087\n    material: LEATHER_HORSE_ARMOR\n  value-3:\n    name: grand piano\n    custom-model-id: 167085\n    material: LEATHER_HORSE_ARMOR\n  value-4:\n    name: electric piano\n    custom-model-id: 167084\n    material: LEATHER_HORSE_ARMOR\n  value-5:\n    name: grand piano closed\n    custom-model-id: 167086\n    material: LEATHER_HORSE_ARMOR\nsounds:\n  value-1:\n    name: Default\n    namespace: minecraft\n    sound-category: VOICE\n\n```\n\n![alt text](https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/banners/commands.png)\n\n``` yaml\n\n\ncommands: \n# /piano\n  piano: \n    children: \n      - update\n      - resourcepack\n      - lang\n      - colors\n    permissions: \n      - jw-piano.commands.piano\n    description: base plugin commands, /piano opens piano list\n    usage: /piano\n# /piano update\n  update: \n    permissions: \n      - update\n    description: download plugin latest version, can be trigger both by player or console\n    usage: /piano update\n\n# /piano resourcepack\n  resourcepack: \n    children: \n      - download\n      - link\n    description: downloads plugin resourcepack\n    usage: /piano resourcepack\n# /piano resourcepack download\n  download: \n    description: downloads plugin resourcepack\n    usage: /piano resourcepack download\n\n# /piano resourcepack link\n  link: \n    description: sending to player resourcepack link\n    usage: /piano resourcepack link\n\n\n# /piano lang \u003clanguage\u003e\n  lang: \n    permissions: \n      - lang\n    arguments: \n      - language:\n          type: text\n          description: select language\n          options: \n              - cs\n              - de\n              - en\n              - es\n              - fr\n              - it\n              - ko\n              - pl\n              - pt\n              - ru\n              - tr\n              - zh\n    description: Changes plugin languages, changes will be applied after server reload. Change be use both be player or console\n    usage: /piano lang \u003clanguage\u003e\n\n# colors\n  colors: \n    children: \n      - page\n    description: command used for internal color picker system, just ignore it\n# page\n  page: \n    arguments: \n      - color:\n          type: text\n\n\n\n\n```\n\n![alt text](https://raw.githubusercontent.com/jwdeveloper/SpigotFluentAPI/master/resources/banners/permissions.png)\n\n``` yaml\npermissions: \n\n# ======================================== jw-piano =================================\n  jw-piano.*: \n    description: full access\n\n# ======================================== jw-piano.piano ===========================\n  jw-piano.piano.*: \n    description: full access\n\n# ======================================== jw-piano.piano.keyboard ==================\n  jw-piano.piano.keyboard.*: \n    description: full access\n\n  jw-piano.piano.keyboard.use: \n    description: player click on the piano keys\n\n# ======================================== jw-piano.piano.bench =====================\n  jw-piano.piano.bench.*: \n    description: full access\n\n  jw-piano.piano.bench.use: \n    description: player sit on the bench\n\n# ======================================== jw-piano.piano.pedal =====================\n  jw-piano.piano.pedal.*: \n    description: full access\n\n  jw-piano.piano.pedal.use: \n    description: player can push sustain pedal with 'f' press\n\n# ======================================== jw-piano.commands ========================\n  jw-piano.commands.*: \n    description: full access\n\n  jw-piano.commands.piano: \n    description: player can open piano list gui\n\n  jw-piano.commands.lang: \n    description: Allow player to change plugin language\n\n  jw-piano.commands.update: \n    description: players with this permission can update plugin\n\n# ======================================== jw-piano.gui =============================\n  jw-piano.gui.*: \n    description: full access\n\n# ======================================== jw-piano.gui.midi-player =================\n  jw-piano.gui.midi-player.*: \n    description: full access\n\n  jw-piano.gui.midi-player.speed: \n    description: player can change speed of midi player\n\n  jw-piano.gui.midi-player.player-type: \n    description: MIDI player type\n\n  jw-piano.gui.midi-player.next-song: \n    description: player can play next song\n\n  jw-piano.gui.midi-player.previous-song: \n    description: player can play previous song\n\n  jw-piano.gui.midi-player.play-stop: \n    description: player can play or stop midi player\n\n  jw-piano.gui.midi-player.select-song: \n    description: player can add song to MIDI player\n\n  jw-piano.gui.midi-player.remove-song: \n    description: player can remove song from MIDI player\n\n# ======================================== jw-piano.gui.bench =======================\n  jw-piano.gui.bench.*: \n    description: full access\n\n  jw-piano.gui.bench.move: \n    description: player can move bench around\n\n# ======================================== jw-piano.gui.bench.settings ==============\n  jw-piano.gui.bench.settings.*: \n    description: full access\n\n  jw-piano.gui.bench.settings.active: \n    description: player can disable bench\n\n# ======================================== jw-piano.gui.piano =======================\n  jw-piano.gui.piano.*: \n    description: full access\n\n  jw-piano.gui.piano.generate-token: \n    description: player can generate token for desktop app\n\n  jw-piano.gui.piano.volume: \n    description: player can teleport to piano\n\n  jw-piano.gui.piano.rename: \n    description: player can rename piano\n\n  jw-piano.gui.piano.teleport: \n    description: player can teleport to piano\n\n  jw-piano.gui.piano.skin: \n    description: player can change piano skin\n\n  jw-piano.gui.piano.effect: \n    description: player can change piano particle effect\n\n  jw-piano.gui.piano.sound: \n    description: player can change piano sound\n\n  jw-piano.gui.piano.clear: \n    description: player can refresh piano model\n\n# ======================================== jw-piano.gui.piano.settings ==============\n  jw-piano.gui.piano.settings.*: \n    description: full access\n\n  jw-piano.gui.piano.settings.keyboard-pressing-active: \n    description: player can enable/disable clicking at the piano keys\n\n  jw-piano.gui.piano.settings.pedal-pressing-active: \n    description: player can enable/disable pushing sustain pedal after 'f' press\n\n  jw-piano.gui.piano.settings.desktop-app-active: \n    description: piano will receiving data from desktop-app\n\n  jw-piano.gui.piano.settings.pianist-active: \n    description: pianist will appear and start playing\n\n# ======================================== jw-piano.gui.piano-list ==================\n  jw-piano.gui.piano-list.*: \n    description: full access\n\n  jw-piano.gui.piano-list.create: \n    description: player can create piano\n\n  jw-piano.gui.piano-list.remove: \n    description: player can remove piano\n\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwdeveloper%2Fjw_piano","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjwdeveloper%2Fjw_piano","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwdeveloper%2Fjw_piano/lists"}