Isso realmente depende de quão técnico você quer fazer isso. Se você realmente não se importa em obter uma taxa de dados razoável, existem vários esquemas de modulação simples que você pode usar, como desvio de freqüência keying ou um dos algoritmos modulação de pulso , PWM e PPM provavelmente sendo os mais simples. Onde você tem que ter cuidado é no fato de que as linhas telefônicas têm uma largura de banda muito limitada, então certas frequências não vão passar.
Sintetizar seus tons não deve ser muito difícil. Olhe para as APIs de áudio do .NET, não sei muito sobre elas. A detecção no final do recebimento será a parte mais difícil, dependendo do esquema de modulação escolhido. A modulação de pulso será a mais fácil de fazer, porque você pode simplesmente medir o valor absoluto médio do sinal em um período de meio período do seu sinal e chamá-lo de pulso se ultrapassar um limite. Dessa maneira, você pode converter do seu sinal analógico para um sinal digital, que pode então ser decodificado de volta para os bytes reais dos dados que você transmitiu.
Os modems reais usam uma codificação bastante sofisticada, baseada no conhecimento detalhado do sistema de telecomunicações, bem como técnicas de sincronização e correção de erros. Então, provavelmente é muito irreal pensar que você chegará perto de 56kbps ou que seu sistema soará como algo real.
Você tem apenas cerca de 7000Hz de largura de banda, o que significa que você não pode transmitir nenhuma freqüência maior que 3500Hz, e seus tempos de subida e descida são bem longos. Realisticamente, você pode conseguir algo em torno de 500bps, se o seu sistema realmente funciona bem e você tem uma conexão realmente silenciosa.