Skip to content

Instantly share code, notes, and snippets.

@tuxcanfly
Last active August 29, 2015 14:06
Show Gist options
  • Save tuxcanfly/e85fe40b7afe0eeb4c65 to your computer and use it in GitHub Desktop.
Save tuxcanfly/e85fe40b7afe0eeb4c65 to your computer and use it in GitHub Desktop.
// morse.go
// usage:
// go run morse.go "SOS" > sos.au
package main
import (
"encoding/binary"
"fmt"
"io"
"log"
"math"
"os"
)
var MorseCode = map[string]string{
"A": ".-",
"B": "-...",
"C": "-.-.",
"D": "-..",
"E": ".",
"F": "..-.",
"G": "--.",
"H": "....",
"I": "..",
"J": ".---",
"K": "-.-",
"L": ".-..",
"M": "--",
"N": "-.",
"O": "---",
"P": ".--.",
"Q": "--.-",
"R": ".-.",
"S": "...",
"T": "-",
"U": "..--",
"V": "...-",
"W": ".--",
"X": "-..-",
"Y": "-.--",
"Z": "--..",
"0": "-----",
"1": ".----",
"2": "..---",
"3": "...--",
"4": "....-",
"5": ".....",
"6": "-....",
"7": "--...",
"8": "---..",
"9": "----.",
}
type au struct {
file io.Writer
sampleRate int
gain float64
}
func (a *au) writeHeader() {
var offset, size, format, rate, channels uint32
magic := [4]byte{'.', 's', 'n', 'd'}
offset = 24
size = 0xffffffff
format = 2
rate = uint32(a.sampleRate)
channels = 1
if err := binary.Write(a.file, binary.BigEndian, magic); err != nil {
log.Fatalf("%v", err)
}
if err := binary.Write(a.file, binary.BigEndian, offset); err != nil {
log.Fatalf("%v", err)
}
if err := binary.Write(a.file, binary.BigEndian, size); err != nil {
log.Fatalf("%v", err)
}
if err := binary.Write(a.file, binary.BigEndian, format); err != nil {
log.Fatalf("%v", err)
}
if err := binary.Write(a.file, binary.BigEndian, rate); err != nil {
log.Fatalf("%v", err)
}
if err := binary.Write(a.file, binary.BigEndian, channels); err != nil {
log.Fatalf("%v", err)
}
}
func (a *au) beep(seconds, freq float64) {
samples := float64(a.sampleRate) * seconds
for i := 0; i < int(samples); i++ {
var t float64
var value int8
t = float64(i) / float64(a.sampleRate)
value = int8(math.Sin(t*2*math.Pi*freq) * 128 * a.gain)
if err := binary.Write(a.file, binary.BigEndian, value); err != nil {
log.Fatalf("%v", err)
}
}
}
func (a *au) silence(seconds float64) {
samples := float64(a.sampleRate) * seconds
for i := 0; i < int(samples); i++ {
var value float64
if err := binary.Write(a.file, binary.BigEndian, value); err != nil {
log.Fatalf("%v", err)
}
}
}
func (a *au) writeString(message string) {
for _, s := range message {
c, ok := MorseCode[string(s)]
if !ok {
a.silence(0.7)
continue
}
for _, x := range c {
switch x {
case 46:
fmt.Printf(".\n")
a.beep(0.2, 1000)
case 45:
fmt.Printf("_\n")
a.beep(0.6, 1000)
}
a.silence(0.1)
}
}
}
func main() {
a := &au{os.Stdout, 8000, 0.4}
a.writeHeader()
a.writeString(os.Args[1])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment