Add Martin M2, M3, and M4

This commit is contained in:
Holly Stubbs 2025-04-26 12:43:09 +01:00
parent a2901aec3a
commit 864fe39adb
Signed by: tgpholly
GPG key ID: B8583C4B7D18119E
9 changed files with 158 additions and 2 deletions

View file

@ -1,5 +1,5 @@
extends SSTVEncoder extends SSTVEncoder
class_name Martin1 class_name MartinM1
const COLOR_FREQ_MULT = 3.1372549 const COLOR_FREQ_MULT = 3.1372549

View file

@ -0,0 +1,50 @@
extends SSTVEncoder
class_name MartinM2
const COLOR_FREQ_MULT = 3.1372549
func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array:
var color = image.get_pixel(scanLinePos, scanLine)
var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0
var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0
var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0
return [redFreq, greenFreq, blueFreq]
const IMAGE_WIDTH = 160.0
const IMAGE_HEIGHT = 256.0
const BLANKING_INTERVAL = 0.000572
const SCAN_LINE_LENGTH = 0.073216
const SYNC_PULSE_LENGTH = 0.004862
var preparedImage = []
func PrepareImage(image: Image):
image.resize(IMAGE_WIDTH, IMAGE_HEIGHT)
image.convert(Image.FORMAT_RGB8)
for scanLine in range(0, IMAGE_HEIGHT):
var red = []
var green = []
var blue = []
for vertPos in range(0, IMAGE_WIDTH):
var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos)
red.push_back(freqs[0])
green.push_back(freqs[1])
blue.push_back(freqs[2])
preparedImage.push_back([green, blue, red])
func EncodeSSTV(image: Image, skipHeader: bool = false):
PrepareImage(image)
if not skipHeader:
EncodePrefix()
EncodeHeader([false, true, false, true, false, false, false])
for scanLine in range(0, IMAGE_HEIGHT):
outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
for dataLine in range(0, 3):
outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
return outputFloats

View file

@ -0,0 +1 @@
uid://70y3sjnd0v3r

View file

@ -0,0 +1,50 @@
extends SSTVEncoder
class_name MartinM3
const COLOR_FREQ_MULT = 3.1372549
func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array:
var color = image.get_pixel(scanLinePos, scanLine)
var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0
var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0
var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0
return [redFreq, greenFreq, blueFreq]
const IMAGE_WIDTH = 320.0
const IMAGE_HEIGHT = 128.0
const BLANKING_INTERVAL = 0.000572
const SCAN_LINE_LENGTH = 0.146432
const SYNC_PULSE_LENGTH = 0.004862
var preparedImage = []
func PrepareImage(image: Image):
image.resize(IMAGE_WIDTH, IMAGE_HEIGHT)
image.convert(Image.FORMAT_RGB8)
for scanLine in range(0, IMAGE_HEIGHT):
var red = []
var green = []
var blue = []
for vertPos in range(0, IMAGE_WIDTH):
var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos)
red.push_back(freqs[0])
green.push_back(freqs[1])
blue.push_back(freqs[2])
preparedImage.push_back([green, blue, red])
func EncodeSSTV(image: Image, skipHeader: bool = false):
PrepareImage(image)
if not skipHeader:
EncodePrefix()
EncodeHeader([false, true, false, false, true, false, false])
for scanLine in range(0, IMAGE_HEIGHT):
outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
for dataLine in range(0, 3):
outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
return outputFloats

View file

@ -0,0 +1 @@
uid://ccf7kch1577re

View file

@ -0,0 +1,50 @@
extends SSTVEncoder
class_name MartinM4
const COLOR_FREQ_MULT = 3.1372549
func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array:
var color = image.get_pixel(scanLinePos, scanLine)
var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0
var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0
var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0
return [redFreq, greenFreq, blueFreq]
const IMAGE_WIDTH = 160.0
const IMAGE_HEIGHT = 128.0
const BLANKING_INTERVAL = 0.000572
const SCAN_LINE_LENGTH = 0.073216
const SYNC_PULSE_LENGTH = 0.004862
var preparedImage = []
func PrepareImage(image: Image):
image.resize(IMAGE_WIDTH, IMAGE_HEIGHT)
image.convert(Image.FORMAT_RGB8)
for scanLine in range(0, IMAGE_HEIGHT):
var red = []
var green = []
var blue = []
for vertPos in range(0, IMAGE_WIDTH):
var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos)
red.push_back(freqs[0])
green.push_back(freqs[1])
blue.push_back(freqs[2])
preparedImage.push_back([green, blue, red])
func EncodeSSTV(image: Image, skipHeader: bool = false):
PrepareImage(image)
if not skipHeader:
EncodePrefix()
EncodeHeader([false, true, false, false, false, false, false])
for scanLine in range(0, IMAGE_HEIGHT):
outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
for dataLine in range(0, 3):
outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH))
outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL))
return outputFloats

View file

@ -0,0 +1 @@
uid://cj7mcnr5e463v

View file

@ -1,7 +1,10 @@
extends Node3D extends Node3D
func encode_sstv(): func encode_sstv():
var encoder = Martin1.new() #var encoder = MartinM4.new()
#var encoder = MartinM3.new()
#var encoder = MartinM1.new()
var encoder = Scottie1.new()
#var encoder = RobotBW8.new() #var encoder = RobotBW8.new()
var cameraImage = get_viewport().get_texture().get_image() var cameraImage = get_viewport().get_texture().get_image()
#var cameraImage = load("res://tests/checker.png").get_image() #var cameraImage = load("res://tests/checker.png").get_image()