{"id":22887678,"url":"https://github.com/mrexplode/ltc4j","last_synced_at":"2025-05-07T11:21:43.754Z","repository":{"id":50398300,"uuid":"260904777","full_name":"MrExplode/ltc4j","owner":"MrExplode","description":"SMPTE LTC signal generator for Java","archived":false,"fork":false,"pushed_at":"2022-07-29T00:07:56.000Z","size":140,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-31T09:37:41.990Z","etag":null,"topics":["generating-ltc-signals","java","library","ltc","smpte","timecode","timecode-generator"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MrExplode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-03T12:04:18.000Z","updated_at":"2024-09-11T01:31:26.000Z","dependencies_parsed_at":"2022-09-10T02:01:54.603Z","dependency_job_id":null,"html_url":"https://github.com/MrExplode/ltc4j","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrExplode%2Fltc4j","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrExplode%2Fltc4j/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrExplode%2Fltc4j/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrExplode%2Fltc4j/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MrExplode","download_url":"https://codeload.github.com/MrExplode/ltc4j/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252866123,"owners_count":21816397,"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":["generating-ltc-signals","java","library","ltc","smpte","timecode","timecode-generator"],"created_at":"2024-12-13T20:37:49.931Z","updated_at":"2025-05-07T11:21:43.729Z","avatar_url":"https://github.com/MrExplode.png","language":"Java","readme":"# ltc4j [![Build Status](https://github.com/MrExplode/ltc4j/actions/workflows/build.yml/badge.svg)](https://github.com/MrExplode/ltc4j/actions)\r\n\r\nSMPTE LTC signal generator for Java\r\n\r\n**Disclaimer:** At this moment, doesn't work properly\r\n\r\nThis library focuses on generating ltc signals. This implies that you have to handle the timing, but also this makes slowing and accerlating time possible.\r\n\r\n### Related libraries / programs\r\n-   [artnet4j](https://github.com/cansik/artnet4j) - working with ArtNet on Java\r\n-   [ShowManager](https://github.com/MrExplode/Timecode) - send ArtNet, LTC and MTC (planned) timecode, dispatch OSC commands, scheduled music player\r\n-   [JavaTimecode](https://github.com/stranck/JavaTimecode) - timecode library, in Java, work in progress\r\n## Usage\r\nFramerates:\r\n-   `Framerate.FRAMERATE_24`\r\n-   `Framerate.FRAMERATE_25`\r\n-   `Framerate.FRAMERATE_DROPFRAME`\r\n-   `Framerate.FRAMERATE_30`\r\n\r\n**An example of the** `LTCGenerator` **class**\r\n```java\r\nint hour, min, sec, frame = ... // times\r\nMixer mixer = ... // your output\r\nint sampleRate = 44100; //audio sample rate\r\nLTCGenerator generator = new LTCGenerator(mixer, Framerate.FRAMERATE_25, sampleRate);\r\ngenerator.init(); // handle the exception\r\n// by calling start method, the generator will begin playing timecode\r\ngenerator.start();\r\n// the currenty set time will be played.\r\ngenerator.setTime(hour, min, sec, frame);\r\n```\r\n**Using the** `LTCPacket` **class**\r\nIf you want to handle the the outputting on your own, you might want to use this class.\r\n```java\r\nint hour, min, sec, frame = ...\r\nLTCPacket packet = new LTCPacket(hour, min, sec, frame, Framerate.FRAMERATE_25);\r\nbyte[] data = packet.asByteArray();\r\n// work with data\r\n```\r\n**An example of timing**\r\nWith this example you can get a precise timing, that calculates time values from elapsed time, therefore not relying on perfectly on-time loops.\r\n```java\r\nlong start = 0;\r\nlong time = 0;\r\nint framerate = ... // your framerate\r\nLTCGenerator generator = ... // the generator instance\r\nwhile (System.currentTimeMillis() \u003e= time + (1000 / framerate) {\r\n    long elapsed = time - start;\r\n    long var = elapsed;\r\n    int hour = (int) (var / 60 / 60 / 1000);\r\n    var = var - (hour * 60 * 60 * 1000);\r\n    int min = (int) (var / 60 / 1000);\r\n    var = value - (min * 60 * 1000);\r\n    int sec = (int) (var / 1000);\r\n    var = value - (sec * 1000);\r\n    int frame = (int) (var / (1000 / framerate));\r\n    // work with time values\r\n    generator.setTime(hour, min, sec, frame);\r\n}\r\n```\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrexplode%2Fltc4j","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrexplode%2Fltc4j","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrexplode%2Fltc4j/lists"}