{"id":40935352,"url":"https://github.com/gsauthof/pronto-ccf","last_synced_at":"2026-01-22T04:15:27.553Z","repository":{"id":138878179,"uuid":"453476314","full_name":"gsauthof/pronto-ccf","owner":"gsauthof","description":"Extract Infrared Pulse Codes from Pronto CCF Files","archived":false,"fork":false,"pushed_at":"2022-02-05T17:04:14.000Z","size":6,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-01-28T01:53:03.736Z","etag":null,"topics":["ccf","infrared","pronto","pronto-hex"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gsauthof.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-01-29T17:58:37.000Z","updated_at":"2023-09-12T09:35:38.000Z","dependencies_parsed_at":"2023-06-25T22:22:47.720Z","dependency_job_id":null,"html_url":"https://github.com/gsauthof/pronto-ccf","commit_stats":{"total_commits":4,"total_committers":1,"mean_commits":4.0,"dds":0.0,"last_synced_commit":"186c4b67498cc687d587862405e820727ab0e408"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gsauthof/pronto-ccf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsauthof%2Fpronto-ccf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsauthof%2Fpronto-ccf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsauthof%2Fpronto-ccf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsauthof%2Fpronto-ccf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gsauthof","download_url":"https://codeload.github.com/gsauthof/pronto-ccf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsauthof%2Fpronto-ccf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28653970,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["ccf","infrared","pronto","pronto-hex"],"created_at":"2026-01-22T04:15:26.994Z","updated_at":"2026-01-22T04:15:27.544Z","avatar_url":"https://github.com/gsauthof.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"This repository contains ccf2pulse, a tool for extracting\ninfrared pulse codes from old-school Pronto CCF files.\n\n## Background\n\nBack in the days, Philips produced a PDA like universal remote\ncontrol called [Pronto][1]. Like any universal remote control the\nPronto can also learn codes from other remote controls. For some\nreason, the Pronto and its file exchange format CCF was kind of popular.\n\n## Use Cases\n\nSay your remote-control for your old HiFi/appliance/etc. device\nis broken. Or you obtained some device with the remote control\nmissing. And - say - there isn't even any replacement\ncommercially available, but you manage to hunt down some CCF file\nfrom somebody's homepage or some IR database site such as\n[remotecentral][2].\n\nSo far, so good. But how to actually read that obscure\nproprietary CCF format?\n\nccf2pulse helps with that. It extracts the raw infrared pulses in\nan annotated text format for copy and pasting into other infrared\ncode configurations.\n\n\n## Examples\n\nDump Codes:\n\n```\n./ccf2pulse.py xyz.ccf\n[..]\nButton: Down\n    Carrier: 40.24 kHz (0x67)\n    Header:  0000 0067 0000 0012\n    once (0 on/off pairs):\n    repeat (18 on/off pairs):\n        0017 0095  0017 0095  0097 0015\n        0097 0015  0017 0095  0017 0095\n        0017 0095  0017 0095  0017 0095\n        0017 0095  0017 0095  0017 0095\n        0017 0095  0017 0095  0097 0015\n        0097 0015  0097 0015  0097 041c\n```\n\nRewrite to another carrier frequency:\n\n```\n./ccf2pulse.py xyz.ccf --rescale 38000 \n[..]\nButton: Down\n    Carrier: 38.03 kHz (0x6d)\n    Header:  0000 006d 0000 0012\n    once (0 on/off pairs):\n    repeat (18 on/off pairs):\n        0015 008c  0015 008c  008e 0013\n        008e 0013  0015 008c  0015 008c\n        0015 008c  0015 008c  0015 008c\n        0015 008c  0015 008c  0015 008c\n        0015 008c  0015 008c  008e 0013\n        008e 0013  008e 0013  008e 03e2\n```\n\nDump pulses using human readable units:\n\n```\n./ccf2pulse.py xyz.ccf --lirc  | less\n[..]\nButton: Down\n    Carrier: 40.24 kHz (0x67)\n    Header:  0000 0067 0000 0012\n    once (0 on/off pairs, in µs, decimal):\n    repeat (18 on/off pairs, in µs, decimal):\n         571 3702   571 3702  3752  521\n        3752  521   571 3702   571 3702\n         571 3702   571 3702   571 3702\n         571 3702   571 3702   571 3702\n         571 3702   571 3702  3752  521\n        3752  521  3752  521  3752 26140\n```\n\n\n## CCF Format\n\nThe Pronto CCF basically defines some buttons for a learned\ndevice, i.e. it defines the placement of some UI elements\nand the IR codes itself.\n\nThe codes are learned raw, i.e. each learned button is basically\njust a list of on/off pulse pairs. In a weird format, using weird\nunits.\n\nSee the inline comments and format documentation in\n`ccf2pulse.py`.\n\n\n## Related Work\n\nThere is pronto2lirc but it can't read binary CCF files. Instead\nit refers to CCFTools/CCFDecompile which seem to have been\nwindows-only tools, which I couldn't find online, anymore, as of\n2022.\n\nThere is the [tonto][8] project which looks like it supports some\nkind of CCF extraction feature. However, it's kind of hard to say\njust by looking at the code. It's probably hard to get going\nsince it was written in Java, decades ago, since the Java\necosystem changed much.\n\nThere is [IrScrutinizer][3] which is a Java GUI applications that\nsupports importing/exporting into various IR code formats,\nincluding CCF and LIRC. Since it's written in Java, it isn't packaged\nby Linux distributions, probably either downloads half the\ninternet via maven and/or requires trusting many unpackaged\ndependencies I haven't tried it.\n\nThe LIRC project has a huge IR remote control database in a much\nmore sane format than CCF. Besides raw codes it also supports\nmore semantic/structured codes (such as NEC) which are more\ncompact and easier to [reason about][7]. But even when using raw\ncodes, the LIRC format is more useful, since the pulses are\nspecified in microseconds.\n\nHowever, unfortunately, the LIRC project looks kind of dead,\nnowadays.  For example, the last remote control configuration was\nadded in 2018.\n\nWhen targeting microcontrollers, there are several Arduino open\nsource libraries for decoding and transmitting IR codes, such as\n[IRLib2][5] and [IRremote][6] that can also deal with raw codes.\n\n\n[1]: https://etmriwi.home.xs4all.nl/ht/pronto.htm\n[2]: http://www.remotecentral.com/\n[3]: http://www.harctoolbox.org/IrScrutinizer.html\n[4]: https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/\n[5]: https://github.com/cyborg5/IRLib2\n[6]: https://github.com/Arduino-IRremote/Arduino-IRremote\n[7]: http://www.righto.com/2010/03/understanding-sony-ir-remote-codes-lirc.html\n[8]: https://github.com/stewartoallen/tonto\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsauthof%2Fpronto-ccf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgsauthof%2Fpronto-ccf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsauthof%2Fpronto-ccf/lists"}