Last active
August 29, 2015 14:06
-
-
Save tuxcanfly/e85fe40b7afe0eeb4c65 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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