{"id":13497211,"url":"https://github.com/dnet/pySSTV","last_synced_at":"2025-03-28T21:32:10.102Z","repository":{"id":8694919,"uuid":"10358472","full_name":"dnet/pySSTV","owner":"dnet","description":"Python classes for generating Slow-scan Television transmissions","archived":false,"fork":false,"pushed_at":"2024-01-22T22:08:54.000Z","size":343,"stargazers_count":117,"open_issues_count":1,"forks_count":27,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-01-24T03:42:47.676Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pypi.python.org/pypi/PySSTV","language":"OpenEdge ABL","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/dnet.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,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2013-05-29T11:49:17.000Z","updated_at":"2024-04-15T01:56:29.460Z","dependencies_parsed_at":"2024-04-15T01:56:28.006Z","dependency_job_id":"704d6789-5df7-4afc-95d0-a576a64901fa","html_url":"https://github.com/dnet/pySSTV","commit_stats":{"total_commits":212,"total_committers":11,"mean_commits":"19.272727272727273","dds":0.09905660377358494,"last_synced_commit":"65241a6b71435ba2c55a9b3155f67ecb4a276ef6"},"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnet%2FpySSTV","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnet%2FpySSTV/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnet%2FpySSTV/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnet%2FpySSTV/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dnet","download_url":"https://codeload.github.com/dnet/pySSTV/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246105341,"owners_count":20724297,"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":[],"created_at":"2024-07-31T20:00:26.730Z","updated_at":"2025-03-28T21:32:09.706Z","avatar_url":"https://github.com/dnet.png","language":"OpenEdge ABL","readme":"SSTV generator in pure Python\n=============================\n\nPySSTV generates SSTV modulated WAV files from any image that PIL can open\n(PNG, JPEG, GIF, and many others). These WAV files then can be played by any\naudio player connected to a shortwave radio for example.\n\nMy main motivation was to understand the internals of SSTV in practice, so\nperformance is far from optimal. I tried keeping the code readable, and only\nperformed such optimizations that wouldn't have complicated the codebase.\n\nCommand line usage\n------------------\n\n    $ python -m pysstv -h\n    usage: __main__.py [-h]\n                  [--mode {MartinM1,MartinM2,ScottieS1,ScottieS2,ScottieDX,Robot36,PasokonP3,PasokonP5,PasokonP7,PD90,PD120,PD160,PD180,PD240,PD290,WraaseSC2120,WraaseSC2180,Robot8BW,Robot24BW}]\n                  [--rate RATE] [--bits BITS] [--vox] [--fskid FSKID]\n                  [--chan CHAN] [--resize] [--keep-aspect-ratio]\n                  [--keep-aspect] [--resample {nearest,bicubic,lanczos}]\n                  image.png output.wav\n\n    Converts an image to an SSTV modulated WAV file.\n\n    positional arguments:\n      image.png             input image file name\n      output.wav            output WAV file name\n\n    options:\n      -h, --help            show this help message and exit\n      --mode {MartinM1,MartinM2,ScottieS1,ScottieS2,ScottieDX,Robot36,PasokonP3,PasokonP5,PasokonP7,PD90,PD120,PD160,PD180,PD240,PD290,WraaseSC2120,WraaseSC2180,Robot8BW,Robot24BW}\n                            image mode (default: Martin M1)\n      --rate RATE           sampling rate (default: 48000)\n      --bits BITS           bits per sample (default: 16)\n      --vox                 add VOX tones at the beginning\n      --fskid FSKID         add FSKID at the end\n      --chan CHAN           number of channels (default: mono)\n      --resize              resize the image to the correct size\n      --keep-aspect-ratio   keep the original aspect ratio when resizing\n                                (and cut off excess pixels)\n      --keep-aspect         keep the original aspect ratio when resizing\n                                (not cut off excess pixels)\n      --resample {nearest,bicubic,lanczos}\n                            which resampling filter to use for resizing\n                                (see Pillow documentation)\n\nPython interface\n----------------\n\nThe `SSTV` class in the `sstv` module implements basic SSTV-related\nfunctionality, and the classes of other modules such as `grayscale` and\n`color` extend this. Most instances implement the following methods:\n\n - `__init__` takes a PIL image, the samples per second, and the bits per\n   sample as a parameter, but doesn't perform any hard calculations\n - `gen_freq_bits` generates tuples that describe a sine wave segment with\n   frequency in Hz and duration in ms\n - `gen_values` generates samples between -1 and +1, performing sampling\n   according to the samples per second value given during construction\n - `gen_samples` generates discrete samples, performing quantization\n   according to the bits per sample value given during construction\n - `write_wav` writes the whole image to a Microsoft WAV file\n\nThe above methods all build upon those above them, for example `write_wav`\ncalls `gen_samples`, while latter calls `gen_values`, so typically, only\nthe first and the last, maybe the last two should be called directly, the\nothers are just listed here for the sake of completeness and to make the\nflow easier to understand.\n\nLicense\n-------\n\nThe whole project is available under MIT license.\n\nUseful links\n------------\n\n - receive-only \"counterpart\": https://github.com/windytan/slowrx\n - free SSTV handbook: http://www.sstv-handbook.com/\n - robot 36 encoder/decoder in C: https://github.com/xdsopl/robot36/\n\nDependencies\n------------\n\n - Python 3.5 or later\n - Python Imaging Library (Debian/Ubuntu package: `python3-pil`)\n","funding_links":[],"categories":["Other SDR Software"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdnet%2FpySSTV","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdnet%2FpySSTV","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdnet%2FpySSTV/lists"}