{"id":31989,"date":"2025-10-16T11:31:35","date_gmt":"2025-10-16T08:31:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/"},"modified":"2025-10-16T11:31:35","modified_gmt":"2025-10-16T08:31:35","slug":"temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/","title":{"rendered":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?"},"content":{"rendered":"<p>Morse kodunun zamana meydan okuyan gizemini, modern web teknolojileriyle birle\u015ftirmeye haz\u0131r m\u0131s\u0131n\u0131z? Dijital \u00e7a\u011fda, anl\u0131k mesajla\u015fma ve video konferanslarla dolu ileti\u015fim d\u00fcnyas\u0131nda, geleneksel y\u00f6ntemlerin de kendine \u00f6zg\u00fc bir \u00e7ekicili\u011fi ve hatta pratik faydalar\u0131 olabilece\u011fini ke\u015ffetmek olduk\u00e7a ilgin\u00e7 olabilir. Bu makalede, Next.js 15&#8217;in g\u00fcc\u00fcn\u00fc ve Web Audio API&#8217;nin sundu\u011fu esnekli\u011fi kullanarak, metni sesli Morse koduna \u00e7evirebilen interaktif bir ara\u00e7 geli\u015ftirmeyi ad\u0131m ad\u0131m inceleyece\u011fiz. Hem performansl\u0131 bir kullan\u0131c\u0131 deneyimi sunacak hem de taray\u0131c\u0131 \u00fczerinden do\u011frudan ses sentezi yapabilen bu projeyi in\u015fa ederken, modern web geli\u015ftirme pratiklerini de yak\u0131ndan tan\u0131ma f\u0131rsat\u0131 bulacaks\u0131n\u0131z.<\/p>\n<p>\u0130leti\u015fim, insanl\u0131k tarihi boyunca s\u00fcrekli evrim ge\u00e7iren bir alan olmu\u015ftur. Telgraf\u0131n icad\u0131yla birlikte hayat\u0131m\u0131za giren ve basit ama etkili bir ileti\u015fim arac\u0131 olan Morse kodu, \u00f6zellikle k\u0131s\u0131tl\u0131 bant geni\u015fli\u011fi veya zorlu ko\u015fullarda bile bilginin aktar\u0131labilmesini sa\u011flam\u0131\u015ft\u0131r. Nokta (.) ve \u00e7izgi (-) kombinasyonlar\u0131ndan olu\u015fan bu sistem, her harfe ve say\u0131ya \u00f6zel bir temsil atayarak metin tabanl\u0131 ileti\u015fimi ses veya \u0131\u015f\u0131k sinyallerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Basitli\u011fi ve evrenselli\u011fi sayesinde amat\u00f6r telsizcilikten acil durum ileti\u015fimine kadar pek \u00e7ok alanda hala kullan\u0131lmaktad\u0131r. Bir Morse kodu \u00e7evirici in\u015fa etmek, bu tarihi ileti\u015fim y\u00f6ntemini modern web teknolojileriyle bulu\u015fturman\u0131n heyecan verici bir yoludur. Peki, bu projede neden Next.js 15 ve Web Audio API gibi \u00e7a\u011fda\u015f ara\u00e7lar\u0131 tercih ediyoruz?<\/p>\n<p>Next.js, React tabanl\u0131 bir framework olup, \u00f6zellikle performans ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan sundu\u011fu avantajlarla pop\u00fclerli\u011fini s\u00fcrd\u00fcrmektedir. Next.js 15 (veya en g\u00fcncel s\u00fcr\u00fcm\u00fcn getirdi\u011fi yenilikler), App Router mimarisi ve React Server Components (RSC) gibi \u00f6zellikleriyle, istemci taraf\u0131 ile sunucu taraf\u0131 aras\u0131ndaki ayr\u0131m\u0131 daha net hale getirerek, daha h\u0131zl\u0131 y\u00fcklenen ve daha etkili \u00e7al\u0131\u015fan uygulamalar geli\u015ftirmemize olanak tan\u0131r. Uygulaman\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131n sunucuda olu\u015fturulmas\u0131, ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcrelerini k\u0131salt\u0131rken, yaln\u0131zca etkile\u015fimli bile\u015fenlerin istemcide \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede, a\u011f\u0131r JavaScript paketlerinin \u00f6n\u00fcne ge\u00e7ilir ve \u00f6zellikle mobil cihazlarda bile ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunulur. Ayr\u0131ca, geli\u015fmi\u015f veri getirme (data fetching) stratejileri ve optimize edilmi\u015f g\u00f6rseller gibi \u00f6zellikler de Next.js&#8217;in bu t\u00fcr projeler i\u00e7in ideal bir se\u00e7im olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Di\u011fer yandan, Web Audio API, taray\u0131c\u0131da karma\u015f\u0131k ses i\u015flemleri yapmam\u0131z\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir JavaScript API&#8217;sidir. Ses dosyalar\u0131n\u0131 \u00e7almaktan \u00e7ok daha fazlas\u0131n\u0131 sunar; do\u011frudan ses dalgalar\u0131 sentezleyebilir, ses efektleri uygulayabilir, hatta canl\u0131 ses giri\u015flerini i\u015fleyebilir. Bir Morse kodu \u00e7eviricisi i\u00e7in, metni do\u011frudan ses sinyallerine d\u00f6n\u00fc\u015ft\u00fcrmek amac\u0131yla <code>AudioContext<\/code>, <code>OscillatorNode<\/code> ve <code>GainNode<\/code> gibi temel yap\u0131 ta\u015flar\u0131n\u0131 kullanmam\u0131z gerekecek. <code>OscillatorNode<\/code> belirli bir frekansta ses dalgalar\u0131 \u00fcretirken, <code>GainNode<\/code> sesin \u015fiddetini kontrol etmemizi sa\u011flar. Bu API sayesinde, standart ses dosyalar\u0131na ba\u011fl\u0131 kalmadan, dinamik ve \u00f6zelle\u015ftirilebilir Morse kodu sesleri \u00fcretebiliriz. Bu, uygulaman\u0131n esnekli\u011fini art\u0131r\u0131rken, kullan\u0131c\u0131n\u0131n sesin frekans\u0131 veya h\u0131z\u0131 gibi parametreleri de\u011fi\u015ftirebilmesine olanak tan\u0131r. K\u0131sacas\u0131, Next.js 15 modern ve performansl\u0131 bir aray\u00fcz sa\u011flarken, Web Audio API taray\u0131c\u0131 i\u00e7inde kusursuz bir ses deneyimi sunar, bu da Morse kodu \u00e7evirici projemizi hem g\u00fc\u00e7l\u00fc hem de etkile\u015fimli k\u0131lar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Next.js&#8217;in App Router yap\u0131s\u0131, uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin (\u00f6rn. metin giri\u015fi ve ses \u00e7\u0131k\u0131\u015f\u0131) sunucu veya istemci bile\u015fenleri olarak optimize edilmesine olanak tan\u0131r. Web Audio API&#8217;nin do\u011frudan taray\u0131c\u0131da \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 unutmay\u0131n, bu y\u00fczden ses \u00fcretim mant\u0131\u011f\u0131n\u0131n mutlaka bir &#8220;use client&#8221; direktifi i\u00e7eren bir istemci bile\u015feninde yer almas\u0131 gerekecektir. Bu ayr\u0131m, hem performans hem de geli\u015ftirme verimlili\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.\n<\/div>\n<h2>Projemizi Ba\u015flatmak: Next.js 15 Ortam\u0131n\u0131 Nas\u0131l Kurar\u0131z?<\/h2>\n<p>Herhangi bir modern web uygulamas\u0131 geli\u015ftirme s\u00fcrecinde ilk ad\u0131m, uygun bir proje ortam\u0131 kurmakt\u0131r. Next.js 15 ile \u00e7al\u0131\u015fmaya ba\u015flamak da olduk\u00e7a basittir, zira g\u00fc\u00e7l\u00fc CLI (Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc) ara\u00e7lar\u0131 bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Projemizi ba\u015flatmak i\u00e7in terminalimizi a\u00e7\u0131p a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rmam\u0131z yeterli olacakt\u0131r:<\/p>\n<pre><code>\n  npx create-next-app@latest morse-translator-app\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>morse-translator-app<\/code> ad\u0131nda yeni bir Next.js projesi olu\u015fturacakt\u0131r. <code>npx create-next-app@latest<\/code> ifadesi, Next.js'in mevcut en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc (bu durumda 15 veya en yak\u0131n g\u00fcncel s\u00fcr\u00fcm\u00fcn\u00fc) kullanarak bir proje olu\u015fturulmas\u0131n\u0131 sa\u011flar. Kurulum sihirbaz\u0131 size TypeScript, ESLint, Tailwind CSS ve App Router gibi se\u00e7enekleri soracakt\u0131r. Bu projede, tip g\u00fcvenli\u011fi i\u00e7in TypeScript'i, kod kalitesi i\u00e7in ESLint'i ve h\u0131zl\u0131 stil olu\u015fturma i\u00e7in Tailwind CSS'i tercih etmek, geli\u015ftirme s\u00fcrecinizi olduk\u00e7a verimli hale getirecektir. App Router ise Next.js 13 ve sonras\u0131 s\u00fcr\u00fcmlerde gelen modern bir y\u00f6nlendirme ve veri getirme (data fetching) \u00e7\u00f6z\u00fcm\u00fcd\u00fcr ve bu projemizde de temel mimariyi olu\u015fturacakt\u0131r.<\/p>\n<p>Proje ba\u015far\u0131yla olu\u015fturulduktan sonra, olu\u015fturulan dizine ge\u00e7i\u015f yapmam\u0131z ve geli\u015ftirme sunucusunu ba\u015flatmam\u0131z gerekecek:<\/p>\n<pre><code>\n  cd morse-translator-app\n  npm run dev\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutlarla, uygulaman\u0131z <code>http:\/\/localhost:3000<\/code> adresinde \u00e7al\u0131\u015fmaya ba\u015flayacakt\u0131r. Taray\u0131c\u0131n\u0131zda bu adrese giderek Next.js'in varsay\u0131lan kar\u015f\u0131lama sayfas\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<p>Proje yap\u0131s\u0131na gelince, App Router mimarisi <code>app<\/code> dizini etraf\u0131nda \u015fekillenir. Temel olarak, bu dizinin alt\u0131nda yer alan her klas\u00f6r bir rotay\u0131 temsil eder ve i\u00e7erisindeki <code>page.tsx<\/code> dosyas\u0131 o rotan\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc tan\u0131mlar. <code>layout.tsx<\/code> dosyas\u0131 ise belirli bir rota segmenti veya t\u00fcm uygulama i\u00e7in payla\u015f\u0131lan bir d\u00fczeni belirler. Bizim projemizde, ana sayfam\u0131z i\u00e7in <code>app\/page.tsx<\/code> dosyas\u0131n\u0131 kullanaca\u011f\u0131z. Ayr\u0131ca, Morse kodu \u00e7evirme mant\u0131\u011f\u0131 ve ses \u00fcretimini ayr\u0131 ayr\u0131 mod\u00fcllere ay\u0131rarak projemizin daha d\u00fczenli ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flayaca\u011f\u0131z. \u00d6rne\u011fin, <code>lib<\/code> veya <code>utils<\/code> ad\u0131nda klas\u00f6rler olu\u015fturarak Morse kodu s\u00f6zl\u00fc\u011f\u00fcn\u00fc, metni Morse'a \u00e7evirme fonksiyonunu ve ses \u00e7alma fonksiyonlar\u0131n\u0131 burada tutabiliriz. <code>components<\/code> klas\u00f6r\u00fc ise kullan\u0131c\u0131 aray\u00fcz\u00fc bile\u015fenlerimizi bar\u0131nd\u0131racakt\u0131r, \u00f6rne\u011fin bir metin giri\u015f alan\u0131 ve \u00e7eviri sonucunu g\u00f6steren bir bile\u015fen gibi.<\/p>\n<p>Bu yap\u0131 sayesinde, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerini birbirinden ba\u011f\u0131ms\u0131z olarak geli\u015ftirebilir ve y\u00f6netebiliriz. Next.js 15'in sundu\u011fu Server Components ve Client Components ayr\u0131m\u0131 da burada devreye girer. Kullan\u0131c\u0131 etkile\u015fimi gerektiren (input alanlar\u0131, buton t\u0131klamalar\u0131 gibi) veya taray\u0131c\u0131ya \u00f6zg\u00fc API'leri (Web Audio API gibi) kullanan bile\u015fenlerin ba\u015f\u0131na <code>&#039;use client&#039;<\/code> y\u00f6nergesini eklememiz gerekecek. Aksi takdirde, Next.js varsay\u0131lan olarak bu bile\u015fenleri Server Component olarak kabul edecek ve taray\u0131c\u0131ya uygun \u015fekilde render etmeyebilir. Projemizin temel iskeleti bu \u015fekilde kuruldu\u011funda, art\u0131k Morse kodu mant\u0131\u011f\u0131n\u0131 geli\u015ftirmeye ve Web Audio API ile ses \u00fcretimine ge\u00e7ebiliriz.<\/p>\n<h2>Morse Kodu Mant\u0131\u011f\u0131: Metin Nas\u0131l Ses Dalgalar\u0131na D\u00f6n\u00fc\u015f\u00fcr?<\/h2>\n<p>Bir metin dizgisini sesli Morse koduna d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in \u00f6ncelikle metni Morse koduna kar\u015f\u0131l\u0131k gelen noktalara ve \u00e7izgilere \u00e7evirmemiz gerekir. Bu s\u00fcre\u00e7, temelde bir harita \u00e7\u0131karma (mapping) i\u015flemidir. Her harfin, rakam\u0131n ve baz\u0131 \u00f6zel karakterlerin Morse kodunda belirli bir kar\u015f\u0131l\u0131\u011f\u0131 vard\u0131r. Bu kar\u015f\u0131l\u0131klar\u0131 i\u00e7eren bir JavaScript objesi veya Map yap\u0131s\u0131 olu\u015fturmak, \u00e7eviri mant\u0131\u011f\u0131m\u0131z\u0131n ilk ad\u0131m\u0131n\u0131 olu\u015fturur.<\/p>\n<p>\u00d6rne\u011fin, 'A' harfi '.-', 'B' harfi '-...' ve '1' rakam\u0131 '.----' \u015feklinde temsil edilir. Bo\u015fluklar da Morse kodunda \u00f6nemlidir; kelimeler aras\u0131 bo\u015fluklar ve karakterler aras\u0131 bo\u015fluklar, sesin ritmini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 sa\u011flar. Standart Morse kodu kurallar\u0131na g\u00f6re:<\/p>\n<p>*   Bir nokta (dit) temel zaman birimidir.<br \/>\n*   Bir \u00e7izgi (dah) \u00fc\u00e7 nokta uzunlu\u011fundad\u0131r.<br \/>\n*   Ayn\u0131 karakter i\u00e7indeki noktalar ve \u00e7izgiler aras\u0131ndaki bo\u015fluk bir nokta uzunlu\u011fundad\u0131r.<br \/>\n*   Karakterler aras\u0131ndaki bo\u015fluk \u00fc\u00e7 nokta uzunlu\u011fundad\u0131r.<br \/>\n*   Kelimeler aras\u0131ndaki bo\u015fluk yedi nokta uzunlu\u011fundad\u0131r.<\/p>\n<p>Bu kurallar, sesi do\u011fru zamanlama ile \u00fcretebilmemiz i\u00e7in kritik \u00f6neme sahiptir. \u015eimdi, bu s\u00f6zl\u00fc\u011f\u00fc ve \u00e7eviri mant\u0131\u011f\u0131n\u0131 <code>utils\/morse.ts<\/code> gibi bir dosyada tan\u0131mlayal\u0131m.<\/p>\n<pre><code>\n  \/\/ utils\/morse.ts\n\n  interface MorseDictionary {\n    [key: string]: string;\n  }\n\n  export const morseDictionary: MorseDictionary = {\n    'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.',\n    'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',\n    'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.',\n    'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',\n    'Y': '-.--', 'Z': '--..',\n    '0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-',\n    '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',\n    '.': '.-.-.-', ',': '--..--', '?': '..--..', '\/': '-..-.', '-': '-....-',\n    '(': '-.--.', ')': '-.--.-', '&': '.-...', ': '---...', ';': '-.-.-.',\n    '=': '-...-', '+': '.-.-.', '@': '.--.-.', '$': '...-..-', '!': '-.-.--',\n    ' ': ' ' \/\/ Kelime bo\u015flu\u011funu temsil etmek i\u00e7in \u00f6zel bir bo\u015fluk\n  };\n\n  export function textToMorse(text: string): string {\n    return text.toUpperCase().split('').map(char => {\n      \/\/ Karakter s\u00f6zl\u00fckte yoksa, tan\u0131ms\u0131z b\u0131rak veya hata ver.\n      \/\/ Basitlik i\u00e7in burada bo\u015fluk b\u0131rakal\u0131m.\n      return morseDictionary[char] || '';\n    }).join(' '); \/\/ Her karakterin Morse kar\u015f\u0131l\u0131\u011f\u0131 aras\u0131na bir bo\u015fluk koy.\n  }\n\n  \/\/ Morse kodunun zamanlama birimlerini de burada tan\u0131mlayabiliriz\n  export const MORSE_UNIT_DURATION_MS = 100; \/\/ 1 nokta (dit) 100 milisaniye\n\n  export const MORSE_TIMINGS = {\n    dit: MORSE_UNIT_DURATION_MS,\n    dah: MORSE_UNIT_DURATION_MS * 3,\n    intraCharSpace: MORSE_UNIT_DURATION_MS, \/\/ Ayn\u0131 karakter i\u00e7indeki nokta\/\u00e7izgi aras\u0131\n    charSpace: MORSE_UNIT_DURATION_MS * 3, \/\/ Karakterler aras\u0131 bo\u015fluk\n    wordSpace: MORSE_UNIT_DURATION_MS * 7, \/\/ Kelimeler aras\u0131 bo\u015fluk\n  };\n<\/pre>\n<p><\/code><\/p>\n<p><code>textToMorse<\/code> fonksiyonu, ald\u0131\u011f\u0131 metni b\u00fcy\u00fck harflere d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve her bir karakter i\u00e7in <code>morseDictionary<\/code>'de arama yapar. Bulunan Morse kar\u015f\u0131l\u0131klar\u0131n\u0131 bir bo\u015flukla birle\u015ftirir. E\u011fer bir karakter s\u00f6zl\u00fckte yoksa, o karakterin yerine bo\u015f bir dize eklenir, bu da bilinmeyen karakterlerin atlanmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, \"Merhaba D\u00fcnya\" metni \"M E R H A B A   D \u00dc N Y A\" olarak \u00e7evrilir ve her harfin Morse kodu kar\u015f\u0131l\u0131\u011f\u0131 aras\u0131na standart bir bo\u015fluk eklenir.<\/p>\n<p>Bu metin tabanl\u0131 \u00e7eviri yap\u0131ld\u0131ktan sonra, ortaya \u00e7\u0131kan Morse kodunu (<code>.-- . .-. .... .- .--. .--. . ... ...--<\/code>) tekrar ayr\u0131\u015ft\u0131rmam\u0131z ve her bir nokta, \u00e7izgi veya bo\u015fluk i\u00e7in Web Audio API'yi kullanarak belirli s\u00fcrelerde sesler \u00fcretmemiz gerekecektir. <code>MORSE_UNIT_DURATION_MS<\/code> de\u011fi\u015fkeni, temel zaman birimini (bir noktan\u0131n s\u00fcresi) belirler ve di\u011fer t\u00fcm s\u00fcreler buna oranla hesaplan\u0131r. Bu, Morse kodunun h\u0131z\u0131n\u0131 ayarlamak istedi\u011fimizde sadece tek bir de\u011feri de\u011fi\u015ftirerek t\u00fcm zamanlamay\u0131 etkilememizi sa\u011flar. Bu \u015fekilde, metin girdi\u011fimizde, \u00f6ncelikle bu metni bir dizi Morse sembol\u00fcne \u00e7eviririz. Ard\u0131ndan, bu sembol dizisini okuyarak, her bir sembol i\u00e7in uygun sesleri ve sessizlikleri Web Audio API arac\u0131l\u0131\u011f\u0131yla s\u0131raya koyaca\u011f\u0131z. Bu yap\u0131, hem \u00e7eviri mant\u0131\u011f\u0131n\u0131 netle\u015ftirir hem de gelecekteki de\u011fi\u015fiklikler i\u00e7in esnek bir temel olu\u015fturur.<\/p>\n<h2>Web Audio API ile Ses \u00dcretimi: Dot ve Dash Seslerini Nas\u0131l Olu\u015ftururuz?<\/h2>\n<p>Metin girdi\u011fimizi ve <code>textToMorse<\/code> fonksiyonu ile Morse koduna \u00e7evirdi\u011fimizi varsayal\u0131m. \u015eimdi s\u0131ra, bu Morse kodunu ger\u00e7ek ses dalgalar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmekte. \u0130\u015fte tam bu noktada Web Audio API devreye giriyor. Bu API, taray\u0131c\u0131da dinamik olarak ses \u00fcretmemizi ve kontrol etmemizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bir Morse kodu \u00e7eviricisi i\u00e7in, belirli bir frekansta (genellikle 600-800 Hz aras\u0131) k\u0131sa s\u00fcreli sesler (noktalar) ve daha uzun s\u00fcreli sesler (\u00e7izgiler) \u00fcretmemiz gerekecek.<\/p>\n<p>\u00d6ncelikle, bir <code>AudioContext<\/code> nesnesi olu\u015fturmam\u0131z gerekiyor. Bu nesne, t\u00fcm ses i\u015flemleri i\u00e7in bir ba\u011flam sa\u011flar ve Web Audio API'nin t\u00fcm di\u011fer d\u00fc\u011f\u00fcmlerinin (nodes) ba\u011flanaca\u011f\u0131 ana a\u011f ge\u00e7ididir. Taray\u0131c\u0131lar\u0131n otomatik oynatma politikalar\u0131 nedeniyle, <code>AudioContext<\/code>'in genellikle bir kullan\u0131c\u0131 etkile\u015fimi (\u00f6rne\u011fin bir d\u00fc\u011fmeye t\u0131klama) sonucu ba\u015flat\u0131lmas\u0131 gerekti\u011fini unutmamal\u0131y\u0131z.<\/p>\n<pre><code>\n  \/\/ utils\/audio.ts\n  'use client'; \/\/ Bu dosya istemci taraf\u0131nda \u00e7al\u0131\u015fmal\u0131d\u0131r\n\n  let audioContext: AudioContext | null = null;\n  const MORSE_FREQUENCY = 700; \/\/ Hz cinsinden Morse sesi frekans\u0131\n\n  function getAudioContext(): AudioContext {\n    if (!audioContext) {\n      audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n    }\n    return audioContext;\n  }\n\n  \/\/ Tek bir Morse sinyalini (nokta veya \u00e7izgi) \u00e7alan fonksiyon\n  function playSignal(duration: number, startTime: number): void {\n    const context = getAudioContext();\n    const oscillator = context.createOscillator();\n    const gainNode = context.createGain();\n\n    oscillator.type = 'sine'; \/\/ Sin\u00fcs dalgas\u0131 kullan\u0131yoruz, daha yumu\u015fak bir ses\n    oscillator.frequency.setValueAtTime(MORSE_FREQUENCY, context.currentTime); \/\/ Frekans ayar\u0131\n\n    gainNode.gain.setValueAtTime(0, startTime); \/\/ Sesi ba\u015fta s\u0131f\u0131rla\n    gainNode.gain.linearRampToValueAtTime(0.7, startTime + 0.01); \/\/ Yumu\u015fak y\u00fckseli\u015f (attack)\n    gainNode.gain.linearRampToValueAtTime(0, startTime + duration); \/\/ Yumu\u015fak ini\u015f (decay)\n\n    oscillator.connect(gainNode);\n    gainNode.connect(context.destination);\n\n    oscillator.start(startTime);\n    oscillator.stop(startTime + duration);\n  }\n\n  export async function playMorseSound(morseCode: string): Promise<void> {\n    const context = getAudioContext();\n    let currentTime = context.currentTime; \/\/ Seslerin ba\u015flama zaman\u0131n\u0131 takip edece\u011fiz\n\n    const { dit, dah, intraCharSpace, charSpace, wordSpace } = await import('.\/morse').then(m => m.MORSE_TIMINGS);\n\n    for (const char of morseCode) {\n      if (char === '.') {\n        playSignal(dit \/ 1000, currentTime);\n        currentTime += (dit + intraCharSpace) \/ 1000;\n      } else if (char === '-') {\n        playSignal(dah \/ 1000, currentTime);\n        currentTime += (dah + intraCharSpace) \/ 1000;\n      } else if (char === ' ') {\n        \/\/ Kelimeler aras\u0131 bo\u015fluk i\u00e7in daha uzun bir duraklama\n        \/\/ Birden fazla bo\u015fluk gelirse sadece bir tanesini kelime bo\u015flu\u011fu olarak de\u011ferlendir.\n        if (morseCode.indexOf('  ') > -1 && char === ' ' && morseCode[morseCode.indexOf(char) - 1] === ' ') {\n             \/\/ Bu kontrol basit bir yakla\u015f\u0131md\u0131r, daha sa\u011flam bir ayr\u0131\u015ft\u0131rma gerekebilir\n             currentTime += wordSpace \/ 1000;\n        } else {\n             currentTime += charSpace \/ 1000;\n        }\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda, <code>getAudioContext<\/code> fonksiyonu taray\u0131c\u0131da <code>AudioContext<\/code> \u00f6rne\u011fini olu\u015fturur veya mevcut olan\u0131 d\u00f6nd\u00fcr\u00fcr. <code>playSignal<\/code> fonksiyonu, belirli bir s\u00fcre (duration) ve ba\u015flang\u0131\u00e7 zaman\u0131 (startTime) i\u00e7in bir osilat\u00f6r (sin\u00fcs dalgas\u0131 \u00fcreten) ve bir gain (ses \u015fiddeti) d\u00fc\u011f\u00fcm\u00fc kullanarak tek bir ses sinyali \u00fcretir. <code>GainNode<\/code> \u00fczerindeki <code>linearRampToValueAtTime<\/code> metodlar\u0131, sesin aniden ba\u015flamak yerine yumu\u015fak bir y\u00fckseli\u015f (attack) ve ini\u015f (decay) yapmas\u0131n\u0131 sa\u011flayarak daha ho\u015f bir dinleme deneyimi sunar. Bu, \"t\u0131k\" seslerini engellemek i\u00e7in \u00f6nemlidir.<\/p>\n<p><code>playMorseSound<\/code> ana fonksiyonudur. Bu fonksiyon, <code>textToMorse<\/code>'dan gelen Morse kodunu al\u0131r ve her bir karakteri (nokta, \u00e7izgi, bo\u015fluk) tek tek i\u015fler. Her sembol i\u00e7in <code>playSignal<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131r ve seslerin birbiri ard\u0131na do\u011fru zamanlamayla \u00e7al\u0131nmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>currentTime<\/code> de\u011fi\u015fkenini g\u00fcnceller. S\u00fcre de\u011ferlerini milisaniyeden saniyeye \u00e7evirmek i\u00e7in 1000'e b\u00f6ld\u00fc\u011f\u00fcm\u00fcze dikkat edin, zira Web Audio API zamanlamalar\u0131 saniye cinsinden bekler. Morse kodu zamanlamalar\u0131n\u0131 (<code>MORSE_TIMINGS<\/code>) dinamik olarak import ederek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha iyi y\u00f6netmi\u015f ve kodu mod\u00fcler hale getirmi\u015f oluyoruz.<\/p>\n<p>\u00d6nemli bir nokta, Web Audio API'nin zamanlamalar\u0131 <code>AudioContext.currentTime<\/code> \u00fczerinden yapmas\u0131d\u0131r. <code>setTimeout<\/code> kullanmak yerine bu yakla\u015f\u0131m\u0131 tercih etmek, seslerin taray\u0131c\u0131n\u0131n olay d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z olarak daha hassas ve do\u011fru bir \u015fekilde senkronize edilmesini sa\u011flar. Bu, \u00f6zellikle karma\u015f\u0131k ses dizileri veya h\u0131zl\u0131 Morse kodlar\u0131 i\u00e7in kritik \u00f6neme sahiptir. Bu temel ses \u00fcretim mant\u0131\u011f\u0131 ile, art\u0131k kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc olu\u015fturarak metin girdilerini al\u0131p bu sesleri tetikleyebiliriz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Sesin \"t\u0131k\" yapmas\u0131n\u0131 \u00f6nlemek i\u00e7in <code>GainNode<\/code>'un <code>setValueAtTime<\/code> ve <code>linearRampToValueAtTime<\/code> metodlar\u0131n\u0131 kullan\u0131n. Bu metodlar, ses seviyesinin aniden de\u011fi\u015fmesi yerine belirli bir zaman aral\u0131\u011f\u0131nda kademeli olarak de\u011fi\u015fmesini sa\u011flayarak, daha p\u00fcr\u00fczs\u00fcz bir ses ba\u015flang\u0131c\u0131 ve biti\u015fi sunar. Ayr\u0131ca, performans a\u00e7\u0131s\u0131ndan, <code>AudioContext<\/code>'i her seferinde yeniden olu\u015fturmak yerine tek bir \u00f6rne\u011fini (singleton) kullanmaya \u00f6zen g\u00f6sterin.\n<\/div>\n<h2>Kullan\u0131c\u0131 Aray\u00fcz\u00fc Geli\u015ftirme: Next.js ile Etkile\u015fimli Bir \u00c7evirici Nas\u0131l Yapar\u0131z?<\/h2>\n<p>Next.js projemizin temelini att\u0131k ve Morse kodu ile ses \u00fcretim mant\u0131\u011f\u0131n\u0131 olu\u015fturduk. \u015eimdi s\u0131ra, kullan\u0131c\u0131lar\u0131n metin girebilece\u011fi, \u00e7eviriyi ba\u015flatabilece\u011fi ve sesi dinleyebilece\u011fi etkile\u015fimli bir aray\u00fcz olu\u015fturmaya geldi. Bu aray\u00fcz\u00fc, Next.js'in App Router yap\u0131s\u0131 ve Client Components \u00f6zelliklerini kullanarak geli\u015ftirece\u011fiz. Kullan\u0131c\u0131 etkile\u015fimi gerektiren t\u00fcm bile\u015fenler <code>use client<\/code> direktifi ile i\u015faretlenmelidir.<\/p>\n<p><code>components\/Translator.tsx<\/code> ad\u0131nda bir bile\u015fen olu\u015ftural\u0131m:<\/p>\n<pre><code>\n  \/\/ components\/Translator.tsx\n  'use client';\n\n  import React, { useState } from 'react';\n  import { textToMorse } from '..\/utils\/morse';\n  import { playMorseSound } from '..\/utils\/audio';\n\n  export default function Translator() {\n    const [inputText, setInputText] = useState('');\n    const [morseOutput, setMorseOutput] = useState('');\n    const [isPlaying, setIsPlaying] = useState(false);\n\n    const handleTranslate = () => {\n      if (inputText.trim()) {\n        const morse = textToMorse(inputText);\n        setMorseOutput(morse);\n      } else {\n        setMorseOutput('');\n      }\n    };\n\n    const handlePlaySound = async () => {\n      if (morseOutput && !isPlaying) {\n        setIsPlaying(true);\n        try {\n          await playMorseSound(morseOutput);\n        } catch (error) {\n          console.error(\"Morse kodu sesi \u00e7al\u0131n\u0131rken bir hata olu\u015ftu:\", error);\n        } finally {\n          setIsPlaying(false);\n        }\n      }\n    };\n\n    return (\n      <div className=\"flex flex-col items-center justify-center min-h-screen bg-gray-100 p-4\">\n        <h2 className=\"text-4xl font-bold mb-8 text-gray-800\">Morse Kodu \u00c7evirici<\/h2>\n\n        <div className=\"w-full max-w-2xl bg-white shadow-lg rounded-lg p-6 mb-6\">\n          <label htmlFor=\"input-text\" className=\"block text-gray-700 text-sm font-bold mb-2\">\n            Metin Girin:\n          <\/label>\n          <textarea\n            id=\"input-text\"\n            className=\"shadow appearance-none border rounded w-full py-3 px-4 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mb-4 resize-y h-32\"\n            placeholder=\"\u00c7evirmek istedi\u011finiz metni buraya yaz\u0131n...\"\n            value={inputText}\n            onChange={(e) => setInputText(e.target.value)}\n          ><\/textarea>\n          <button\n            onClick={handleTranslate}\n            className=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline w-full mb-4 transition duration-300 ease-in-out\"\n          >\n            Morse Koduna \u00c7evir\n          <\/button>\n        <\/div>\n\n        {morseOutput && (\n          <div className=\"w-full max-w-2xl bg-white shadow-lg rounded-lg p-6 mb-6\">\n            <label htmlFor=\"morse-output\" className=\"block text-gray-700 text-sm font-bold mb-2\">\n              Morse Kodu \u00c7\u0131kt\u0131s\u0131:\n            <\/label>\n            <textarea\n              id=\"morse-output\"\n              className=\"shadow appearance-none border rounded w-full py-3 px-4 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mb-4 bg-gray-50 resize-y h-24\"\n              value={morseOutput}\n              readOnly\n            ><\/textarea>\n            <button\n              onClick={handlePlaySound}\n              disabled={isPlaying}\n              className={<code>font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline w-full transition duration-300 ease-in-out ${\n                isPlaying ? &#039;bg-gray-400 cursor-not-allowed&#039; : &#039;bg-green-500 hover:bg-green-700 text-white&#039;\n              }<\/code>}\n            >\n              {isPlaying ? '\u00c7al\u0131yor...' : 'Sesi \u00c7al'}\n            <\/button>\n          <\/div>\n        )}\n      <\/div>\n    );\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Translator<\/code> bile\u015feni, temel olarak \u00fc\u00e7 durumu y\u00f6netir: <code>inputText<\/code> (kullan\u0131c\u0131n\u0131n girdi\u011fi metin), <code>morseOutput<\/code> (\u00e7evrilmi\u015f Morse kodu) ve <code>isPlaying<\/code> (sesin \u00e7al\u0131n\u0131p \u00e7al\u0131nmad\u0131\u011f\u0131n\u0131 g\u00f6steren bir bayrak).<\/p>\n<p>1.  <strong>Metin Giri\u015f Alan\u0131<\/strong>: Bir <code><textarea><\/code> etiketi kullanarak kullan\u0131c\u0131dan metin giri\u015fi al\u0131r\u0131z. <code>useState<\/code> kancas\u0131 ile <code>inputText<\/code> durumunu g\u00fcncelleriz.<br \/>\n2.  <strong>\u00c7evir Butonu<\/strong>: Kullan\u0131c\u0131 \"Morse Koduna \u00c7evir\" butonuna t\u0131klad\u0131\u011f\u0131nda, <code>handleTranslate<\/code> fonksiyonu <code>inputText<\/code>'i <code>textToMorse<\/code> fonksiyonuna g\u00f6nderir ve sonucu <code>morseOutput<\/code> durumuna kaydeder.<br \/>\n3.  <strong>Morse Kodu \u00c7\u0131kt\u0131s\u0131 ve Ses \u00c7alma Butonu<\/strong>: <code>morseOutput<\/code> durumu bo\u015f de\u011filse, \u00e7evrilmi\u015f Morse kodunu g\u00f6steren ba\u015fka bir <code><textarea><\/code> ve \"Sesi \u00c7al\" butonu g\u00f6r\u00fcn\u00fcr hale gelir. \"Sesi \u00c7al\" butonuna bas\u0131ld\u0131\u011f\u0131nda <code>handlePlaySound<\/code> fonksiyonu devreye girer. Bu fonksiyon, <code>playMorseSound<\/code> yard\u0131mc\u0131 fonksiyonunu \u00e7a\u011f\u0131rarak Morse kodunun sesli olarak \u00e7al\u0131nmas\u0131n\u0131 tetikler. <code>isPlaying<\/code> durumu, ses \u00e7alarken butonun devre d\u0131\u015f\u0131 kalmas\u0131n\u0131 ve kullan\u0131c\u0131n\u0131n birden fazla kez t\u0131klamas\u0131n\u0131 engellemeyi sa\u011flar.<\/p>\n<p>Bu bile\u015feni <code>app\/page.tsx<\/code> dosyam\u0131za dahil ederek ana sayfam\u0131zda g\u00f6r\u00fcnmesini sa\u011flayabiliriz:<\/p>\n<pre><code>\n  \/\/ app\/page.tsx\n  import Translator from '..\/components\/Translator';\n\n  export default function HomePage() {\n    return (\n      <main>\n        <Translator \/>\n      <\/main>\n    );\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu d\u00fczenlemelerle birlikte, Next.js projemiz art\u0131k tam fonksiyonlu bir Morse kodu \u00e7eviriciye sahip olacak. Tailwind CSS s\u0131n\u0131flar\u0131n\u0131 kullanarak basit ama i\u015flevsel bir tasar\u0131m ekledik. Bu tasar\u0131m, giri\u015f alanlar\u0131n\u0131, butonlar\u0131 ve \u00e7\u0131k\u0131\u015f alan\u0131n\u0131 merkezi bir d\u00fczende hizalayarak kullan\u0131c\u0131 dostu bir deneyim sunar. B\u00f6ylece, kullan\u0131c\u0131lar kolayca metin girebilir, \u00e7evirisini g\u00f6rebilir ve sesi dinleyebilirler. Bu ad\u0131m, projemizi son kullan\u0131c\u0131 i\u00e7in ger\u00e7ek bir ara\u00e7 haline getirir.<\/p>\n<h2>\u0130leri D\u00fczey Optimizasyonlar ve Ek \u00d6zellikler: Performans ve Kullan\u0131c\u0131 Deneyimi Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>Temel Morse kodu \u00e7eviricimiz art\u0131k \u00e7al\u0131\u015f\u0131yor, ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda performans, kullan\u0131c\u0131 deneyimi ve eri\u015filebilirlik gibi fakt\u00f6rler b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Next.js 15 ve Web Audio API ile in\u015fa etti\u011fimiz bu arac\u0131 daha da ileriye ta\u015f\u0131mak i\u00e7in baz\u0131 ileri d\u00fczey optimizasyonlar ve ek \u00f6zellikler ekleyebiliriz.<\/p>\n<h3>Duyarl\u0131 Tasar\u0131m ve Mobil Uyumluluk<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131 web sitelerine mobil cihazlardan eri\u015fiyor. Bu nedenle, \u00e7eviricimizin farkl\u0131 ekran boyutlar\u0131nda sorunsuz \u00e7al\u0131\u015fmas\u0131 kritik. Tailwind CSS gibi bir \u00e7er\u00e7eve kullanmak, duyarl\u0131 tasar\u0131m\u0131 zaten kolayla\u015ft\u0131rsa da, bazen spesifik d\u00fczenlemeler gerekebilir. A\u015fa\u011f\u0131daki CSS \u00f6rne\u011fi, k\u00fc\u00e7\u00fck ekranlarda metin alanlar\u0131n\u0131n y\u00fcksekli\u011fini otomatik olarak ayarlayarak daha iyi bir g\u00f6r\u00fcn\u00fcm sa\u011flar:<\/p>\n<pre><code>\n  \/* globals.css veya bile\u015fenin kendi CSS mod\u00fcl\u00fc *\/\n  @media (max-width: 640px) {\n    textarea {\n      min-height: 100px; \/* Mobil cihazlarda daha k\u00fc\u00e7\u00fck varsay\u0131lan y\u00fckseklik *\/\n    }\n    .h-32 {\n      height: auto; \/* Tailwind h-32'yi override et *\/\n    }\n    .p-6 {\n      padding: 1rem; \/* K\u00fc\u00e7\u00fck ekranlarda daha az padding *\/\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu t\u00fcr medya sorgular\u0131, uygulaman\u0131n mobil cihazlarda daha kullan\u0131\u015fl\u0131 g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<h3>Geri Besleme Mekanizmalar\u0131 ve Gecikme Azaltma<\/h3>\n<p>Kullan\u0131c\u0131lar \"Sesi \u00c7al\" butonuna bast\u0131klar\u0131nda, sesin hemen ba\u015flamas\u0131n\u0131 beklerler. Web Audio API, <code>AudioContext.currentTime<\/code> ile hassas zamanlama sa\u011flasa da, JS y\u00fcr\u00fctme veya taray\u0131c\u0131 y\u00fck\u00fc nedeniyle k\u00fc\u00e7\u00fck gecikmeler ya\u015fanabilir. Bu gecikmeleri minimize etmek i\u00e7in, <code>AudioContext<\/code>'i m\u00fcmk\u00fcn olan en erken a\u015famada ba\u015flatmak (\u00f6rne\u011fin ilk kullan\u0131c\u0131 etkile\u015fiminde) ve ses verilerini \u00f6nceden haz\u0131rlamak faydal\u0131 olabilir. Ayr\u0131ca, ses \u00e7alma s\u0131ras\u0131nda bir y\u00fckleme g\u00f6stergesi veya buton metnini \"\u00c7al\u0131yor...\" olarak de\u011fi\u015ftirmek gibi g\u00f6rsel geri bildirimler, kullan\u0131c\u0131n\u0131n uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Eri\u015filebilirlik (A11y)<\/h3>\n<p>Web uygulamalar\u0131n\u0131n herkes taraf\u0131ndan kullan\u0131labilir olmas\u0131 gerekir. Klavyeyle gezinme, ekran okuyucular i\u00e7in uygun etiketler ve yeterli renk kontrast\u0131 gibi eri\u015filebilirlik standartlar\u0131 \u00f6nemlidir.<\/p>\n<p>*   <strong>Klavye Navigasyonu<\/strong>: T\u00fcm buton ve form elemanlar\u0131n\u0131n <code>tabindex<\/code> \u00f6zelli\u011fi ile klavyeden eri\u015filebilir oldu\u011fundan emin olun.<br \/>\n*   <strong>ARIA Etiketleri<\/strong>: <code>aria-label<\/code> veya <code>aria-describedby<\/code> gibi ARIA \u00f6zelliklerini kullanarak ekran okuyuculara daha fazla ba\u011flam sa\u011flay\u0131n. \u00d6rne\u011fin, metin giri\u015f alan\u0131na <code>aria-label=\"Morse koduna \u00e7evrilecek metin\"<\/code> eklenebilir.<br \/>\n*   <strong>Odak Y\u00f6netimi<\/strong>: Kullan\u0131c\u0131 bir butona t\u0131klad\u0131\u011f\u0131nda veya bir i\u015flem tamamland\u0131\u011f\u0131nda oda\u011f\u0131n mant\u0131kl\u0131 bir yere ta\u015f\u0131nmas\u0131, \u00f6zellikle ekran okuyucu kullan\u0131c\u0131lar\u0131 i\u00e7in \u00f6nemlidir.<\/p>\n<h3>PWA Entegrasyonu (Progressive Web App)<\/h3>\n<p>Uygulamam\u0131z\u0131 bir PWA olarak sunmak, kullan\u0131c\u0131lar\u0131n uygulamay\u0131 ana ekranlar\u0131na eklemesine, \u00e7evrimd\u0131\u015f\u0131 kullanmas\u0131na ve bir mobil uygulama hissi almas\u0131na olanak tan\u0131r. Next.js, <code>next-pwa<\/code> gibi k\u00fct\u00fcphanelerle PWA entegrasyonunu kolayla\u015ft\u0131r\u0131r. Bir <code>manifest.json<\/code> dosyas\u0131 ve bir Service Worker kayd\u0131 ile bu \u00f6zellikler h\u0131zl\u0131ca eklenebilir. Bu sayede, internet ba\u011flant\u0131s\u0131 olmasa bile \u00e7evirici \u00e7al\u0131\u015fmaya devam edebilir, bu da \u00f6zellikle acil durum ileti\u015fimi senaryolar\u0131 i\u00e7in paha bi\u00e7ilmez bir \u00f6zellik olabilir.<\/p>\n<h3>Ses Ayarlar\u0131 ve H\u0131z Kontrol\u00fc<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n sesin frekans\u0131n\u0131 (tonunu) veya Morse kodunun \u00e7alma h\u0131z\u0131n\u0131 de\u011fi\u015ftirebilmesi, uygulamaya \u00f6nemli bir esneklik katar. <code>MORSE_FREQUENCY<\/code> ve <code>MORSE_UNIT_DURATION_MS<\/code> de\u011fi\u015fkenlerini kullan\u0131c\u0131 aray\u00fcz\u00fcnden kontrol edilebilir hale getirerek (\u00f6rne\u011fin bir slider veya select box ile), ki\u015fiselle\u015ftirilmi\u015f bir deneyim sunabiliriz.<\/p>\n<p>*   <strong>H\u0131z Kontrol\u00fc<\/strong>: Kullan\u0131c\u0131 <code>MORSE_UNIT_DURATION_MS<\/code> de\u011ferini d\u00fc\u015f\u00fcrd\u00fck\u00e7e Morse kodu daha h\u0131zl\u0131 \u00e7al\u0131n\u0131r, art\u0131rd\u0131k\u00e7a yava\u015flar.<br \/>\n*   <strong>Frekans Kontrol\u00fc<\/strong>: <code>MORSE_FREQUENCY<\/code> de\u011ferini de\u011fi\u015ftirerek sesin tonunu ayarlayabilirler.<\/p>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131c\u0131 Geri Bildirimi<\/h3>\n<p>Ge\u00e7ersiz giri\u015fler (\u00f6rne\u011fin sadece \u00f6zel karakterler i\u00e7eren bir metin) veya Web Audio API'nin ba\u015flat\u0131lamamas\u0131 gibi durumlar i\u00e7in sa\u011flam hata y\u00f6netimi \u00f6nemlidir. Kullan\u0131c\u0131ya, bir sorun olu\u015ftu\u011funda anla\u015f\u0131l\u0131r mesajlar g\u00f6stermek, uygulaman\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, <code>playMorseSound<\/code> fonksiyonunda bir <code>try-catch<\/code> blo\u011fu kullanarak ses \u00e7alma hatalar\u0131n\u0131 yakalad\u0131k.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Karma\u015f\u0131k form elemanlar\u0131 veya s\u0131k\u00e7a de\u011fi\u015fen durumlar i\u00e7in React'\u0131n <code>useReducer<\/code> kancas\u0131n\u0131 kullanmak, <code>useState<\/code> yerine daha temiz ve y\u00f6netilebilir bir durum y\u00f6netimi sa\u011flayabilir. \u00d6zellikle Morse h\u0131z\u0131 veya ses frekans\u0131 gibi birden fazla ayar oldu\u011funda bu faydal\u0131 olur. Ayr\u0131ca, uzun metinler i\u00e7in Morse kodu \u00e7alarken, bir ilerleme \u00e7ubu\u011fu veya hangi karakterin \u00e7al\u0131nd\u0131\u011f\u0131n\u0131 g\u00f6steren bir vurgu, kullan\u0131c\u0131 deneyimini zenginle\u015ftirir.\n<\/div>\n<h3>Vaka Analizi: Acil Durum \u0130leti\u015fiminde Morse Kodunun Rol\u00fc ve Modern Entegrasyonu<\/h3>\n<p>Morse kodu, icad\u0131ndan bu yana bir\u00e7ok \u00f6nemli an\u0131n, \u00f6zellikle de acil durum ileti\u015fiminin vazge\u00e7ilmez bir par\u00e7as\u0131 olmu\u015ftur. Titanic'in bat\u0131\u015f\u0131 s\u0131ras\u0131nda g\u00f6nderilen SOS sinyallerinden, II. D\u00fcnya Sava\u015f\u0131'ndaki askeri ileti\u015fime kadar, Morse kodu, teknolojinin s\u0131n\u0131rl\u0131 oldu\u011fu veya di\u011fer ileti\u015fim kanallar\u0131n\u0131n \u00e7\u00f6kt\u00fc\u011f\u00fc zamanlarda hayati bir k\u00f6pr\u00fc g\u00f6revi g\u00f6rm\u00fc\u015ft\u00fcr. Peki, g\u00fcn\u00fcm\u00fcz\u00fcn y\u00fcksek bant geni\u015flikli d\u00fcnyas\u0131nda, Next.js ve Web Audio API ile olu\u015fturdu\u011fumuz bu t\u00fcr bir \u00e7evirici hala ne gibi roller \u00fcstlenebilir?<\/p>\n<p>\u00d6ncelikle, <strong>amat\u00f6r telsizcilik<\/strong> camias\u0131 i\u00e7in Morse kodu hala aktif bir ileti\u015fim y\u00f6ntemidir. D\u00fc\u015f\u00fck sinyal-g\u00fcr\u00fclt\u00fc oranlar\u0131nda bile Mors sinyallerini ay\u0131rt etmek, sesli ileti\u015fime g\u00f6re daha kolay olabilir. Next.js tabanl\u0131 bir \u00e7evirici, amat\u00f6r telsizcilerin mesajlar\u0131n\u0131 h\u0131zl\u0131ca kodlay\u0131p \u00e7\u00f6zmelerine, hatta e\u011fitim ama\u00e7l\u0131 pratik yapmalar\u0131na olanak tan\u0131r. \u00c7evirici, radyo operat\u00f6rlerinin klavyeden yazd\u0131klar\u0131 metni an\u0131nda sesli Morse'a d\u00f6n\u00fc\u015ft\u00fcrerek, telsizleri arac\u0131l\u0131\u011f\u0131yla yay\u0131nlamalar\u0131na yard\u0131mc\u0131 olabilir. Bu, \u00f6zellikle yeni ba\u015flayanlar i\u00e7in b\u00fcy\u00fck bir \u00f6\u011frenme arac\u0131d\u0131r.<\/p>\n<p>\u0130kinci olarak, <strong>e\u011fitim ve fark\u0131ndal\u0131k<\/strong> olu\u015fturma a\u00e7\u0131s\u0131ndan de\u011feri b\u00fcy\u00fckt\u00fcr. \u00d6\u011frencilere veya merakl\u0131lara Morse kodunun nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 deneyimsel olarak \u00f6\u011fretmek i\u00e7in harika bir interaktif ara\u00e7t\u0131r. Bir web uygulamas\u0131n\u0131n kolay eri\u015filebilirli\u011fi sayesinde, herkes bir taray\u0131c\u0131dan Morse kodunu \u00f6\u011frenmeye ba\u015flayabilir. G\u00f6rsel olarak hem metni hem de Morse e\u015fde\u011ferini g\u00f6sterirken, sesli geri bildirimle \u00f6\u011frenme s\u00fcrecini h\u0131zland\u0131rabilir.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc olarak, <strong>d\u00fc\u015f\u00fck bant geni\u015fli\u011fi veya \u00e7evrimd\u0131\u015f\u0131 senaryolar<\/strong> i\u00e7in potansiyel bir yedek ileti\u015fim kanal\u0131 olabilir. E\u011fer bir PWA olarak optimize edilirse, internet ba\u011flant\u0131s\u0131 kesildi\u011finde bile yerel olarak \u00e7al\u0131\u015fabilir. Felaket b\u00f6lgelerinde, altyap\u0131n\u0131n \u00e7\u00f6kt\u00fc\u011f\u00fc durumlarda, di\u011fer dijital ileti\u015fim y\u00f6ntemlerinin kullan\u0131lamad\u0131\u011f\u0131 anlarda, basitle\u015ftirilmi\u015f bir metinden Morse'a \u00e7evirici, belirli mesajlar\u0131n aktar\u0131lmas\u0131na yard\u0131mc\u0131 olabilir. Bu senaryolarda, sesli sinyallerin daha d\u00fc\u015f\u00fck bir bant geni\u015fli\u011fi gerektirmesi, alternatif bir ileti\u015fim yolu sunar. Bir ak\u0131ll\u0131 telefonun veya diz\u00fcst\u00fc bilgisayar\u0131n dahili hoparl\u00f6rleri arac\u0131l\u0131\u011f\u0131yla Morse kodunu \u00e7almak, herhangi bir ek donan\u0131m olmaks\u0131z\u0131n temel bir ileti\u015fimi m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<p>Son olarak, <strong>eri\u015filebilirlik alan\u0131nda<\/strong> ni\u015f bir kullan\u0131m alan\u0131 bulabilir. \u0130\u015fitme engelli bireyler i\u00e7in metinden titre\u015fime veya \u0131\u015f\u0131k sinyallerine d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilen bir Morse \u00e7evirici, farkl\u0131 duyusal kanallardan ileti\u015fim kurma imkan\u0131 sunar. Web Audio API'ye ek olarak, Web Vibration API veya g\u00f6rsel sinyal yan\u0131p s\u00f6nmeleri gibi \u00f6zelliklerle entegre edildi\u011finde, daha kapsay\u0131c\u0131 bir ileti\u015fim arac\u0131 haline gelebilir.<\/p>\n<p>Bu vaka analizleri, Next.js 15 ve Web Audio API ile in\u015fa etti\u011fimiz basit bir Morse kodu \u00e7eviricisinin, sadece bir teknoloji demosu olman\u0131n \u00f6tesinde, ger\u00e7ek d\u00fcnyada hala anlaml\u0131 ve faydal\u0131 kullan\u0131mlar\u0131 olabilece\u011fini g\u00f6stermektedir. Geleneksel bir ileti\u015fim y\u00f6ntemini modern web teknolojileriyle birle\u015ftirmek, ge\u00e7mi\u015fle gelece\u011fi harmanlayan yenilik\u00e7i \u00e7\u00f6z\u00fcmler \u00fcretmemizin bir \u00f6rne\u011fidir.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fin \u0130leti\u015fiminde Geleneksel Y\u00f6ntemlerin Yeri Var m\u0131?<\/h2>\n<p>Bu makalede, Next.js 15'in modern geli\u015ftirme yeteneklerini ve Web Audio API'nin g\u00fc\u00e7l\u00fc ses sentezi \u00f6zelliklerini bir araya getirerek, metni sesli Morse koduna \u00e7eviren etkile\u015fimli bir web uygulamas\u0131 in\u015fa etme s\u00fcrecini ad\u0131m ad\u0131m inceledik. Projemizi nas\u0131l kuraca\u011f\u0131m\u0131z\u0131, Morse kodu \u00e7eviri mant\u0131\u011f\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131, Web Audio API ile sesleri nas\u0131l sentezleyece\u011fimizi ve son olarak kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc nas\u0131l geli\u015ftirece\u011fimizi \u00f6\u011frendik. Ayr\u0131ca, uygulaman\u0131n performans\u0131n\u0131, eri\u015filebilirli\u011fini ve kullan\u0131c\u0131 deneyimini art\u0131racak ileri d\u00fczey optimizasyonlar\u0131 ve mobil uyumluluk gibi ek \u00f6zellikleri de ele ald\u0131k. Geleneksel bir ileti\u015fim y\u00f6ntemi olan Morse kodunun, modern web teknolojileriyle birle\u015fti\u011finde hala ne kadar anlaml\u0131 ve i\u015flevsel olabilece\u011fini g\u00f6steren bir vaka analizine de yer verdik.<\/p>\n<p>\u00d6zetle, Next.js 15, h\u0131zl\u0131 y\u00fckleme s\u00fcreleri, geli\u015fmi\u015f y\u00f6nlendirme ve g\u00fc\u00e7l\u00fc sunucu taraf\u0131 yetenekleri ile karma\u015f\u0131k web uygulamalar\u0131 geli\u015ftirmek i\u00e7in m\u00fckemmel bir temel sunar. Web Audio API ise, taray\u0131c\u0131 i\u00e7inde do\u011frudan ses dalgalar\u0131 \u00fcretme ve i\u015fleme konusunda e\u015fsiz bir esneklik sa\u011flar. Bu iki teknolojinin birle\u015fimi, hem e\u011fitici hem de pratik faydalar\u0131 olan bu t\u00fcr ni\u015f projelerin hayata ge\u00e7irilmesini m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<p>Gelecekte, bu \u00e7eviriciyi daha da geli\u015ftirmek i\u00e7in farkl\u0131 ses tonlar\u0131, h\u0131z ayarlar\u0131, g\u00f6rsel geri bildirimler (\u00f6rne\u011fin \u00e7al\u0131nan karakterin vurgulanmas\u0131) ve hatta Morse kodunu metne \u00e7evirme (dinleme) yetene\u011fi gibi \u00f6zellikler eklenebilir. Belki de bir g\u00fcn, bu t\u00fcr ara\u00e7lar, k\u0131s\u0131tl\u0131 bant geni\u015fli\u011fi veya zorlu \u00e7evre ko\u015fullar\u0131nda ileti\u015fimi s\u00fcrd\u00fcrmek i\u00e7in beklenmedik bir \u015fekilde kritik hale gelecektir. Geleneksel ileti\u015fim y\u00f6ntemleri, modern teknolojinin sa\u011flad\u0131\u011f\u0131 olanaklarla yeniden yorumland\u0131\u011f\u0131nda, gelece\u011fin ileti\u015fim d\u00fcnyas\u0131nda hala \u00f6nemli bir yer edinebilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n    <strong>Web Audio API'nin taray\u0131c\u0131 deste\u011fi nedir?<\/strong><\/p>\n<p>Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix'leri (<code>webkitAudioContext<\/code> gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.<\/p>\n<\/li>\n<li>\n    <strong>Next.js 15 neden bu t\u00fcr projeler i\u00e7in iyi bir se\u00e7imdir?<\/strong><\/p>\n<p>Next.js 15, performans odakl\u0131 yap\u0131s\u0131, App Router mimarisi ve React Server Components (RSC) deste\u011fi sayesinde hem h\u0131zl\u0131 y\u00fcklenen hem de etkile\u015fimli uygulamalar geli\u015ftirmeye olanak tan\u0131r. \u00d6zellikle SEO uyumlu ve h\u0131zl\u0131 ba\u015flang\u0131\u00e7 s\u00fcreleri gerektiren projelerde tercih edilir. Kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc h\u0131zl\u0131 bir \u015fekilde olu\u015ftururken, Web Audio API gibi istemci taraf\u0131 \u00f6zelliklerini sorunsuz bir \u015fekilde entegre etme esnekli\u011fi sunar.<\/p>\n<\/li>\n<li>\n    <strong>Morse kodu \u00e7eviriciyi ba\u015fka hangi alanlarda kullanabilirim?<\/strong><\/p>\n<p>Morse kodu \u00e7eviriciler, amat\u00f6r telsizcilikte, e\u011fitim ama\u00e7l\u0131 (Morse kodunu \u00f6\u011frenmek veya \u00f6\u011fretmek i\u00e7in), acil durum ileti\u015fim senaryolar\u0131nda (d\u00fc\u015f\u00fck bant geni\u015fli\u011fi veya \u00e7evrimd\u0131\u015f\u0131 durumlarda), hatta sanatsal veya deneysel ses projelerinde kullan\u0131labilir. Ayr\u0131ca, eri\u015filebilirlik \u00e7\u00f6z\u00fcmleri i\u00e7in bir temel olarak da de\u011ferlendirilebilir.<\/p>\n<\/li>\n<li>\n    <strong>Performans\u0131 daha da art\u0131rmak i\u00e7in ne yapabilirim?<\/strong><\/p>\n<p>Performans\u0131 art\u0131rmak i\u00e7in <code>AudioContext<\/code>'i tekil (singleton) olarak kullanmaya devam edin. Uzun metinler i\u00e7in Morse kodunu \u00f6nceden hesaplay\u0131p bir \"buffer\"da tutabilir, b\u00f6ylece \u00e7alma an\u0131nda anl\u0131k hesaplama y\u00fck\u00fcn\u00fc azaltabilirsiniz. Ayr\u0131ca, Next.js'in g\u00f6rsel optimizasyonlar\u0131 (Image Component) ve kod b\u00f6lme (code splitting) \u00f6zellikleri ile uygulaman\u0131n genel y\u00fckleme h\u0131z\u0131n\u0131 iyile\u015ftirebilirsiniz.<\/p>\n<\/li>\n<li>\n    <strong>Bu projeyi mobil uygulama olarak geli\u015ftirebilir miyim?<\/strong><\/p>\n<p>Evet, Next.js projenizi bir Progressive Web App (PWA) olarak yap\u0131land\u0131rarak mobil cihazlarda ana ekran uygulamas\u0131 gibi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Ayr\u0131ca, React Native veya Capacitor\/Ionic gibi ara\u00e7larla Next.js bile\u015fenlerinizi yeniden kullanarak ger\u00e7ek mobil uygulamalar (iOS\/Android) geli\u015ftirmek de m\u00fcmk\u00fcnd\u00fcr, ancak bu daha fazla adaptasyon ve platforma \u00f6zg\u00fc kodlama gerektirir.<\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Morse kodunun zamana meydan okuyan gizemini, modern web teknolojileriyle birle\u015ftirmeye haz\u0131r m\u0131s\u0131n\u0131z? Dijital \u00e7a\u011fda, anl\u0131k mesajla\u015fma ve video&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1469],"tags":[],"class_list":{"0":"post-31989","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-nextjs","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?<\/title>\n<meta name=\"description\" content=\"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix&#039;leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?\" \/>\n<meta property=\"og:description\" content=\"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix&#039;leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T08:31:35+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?\",\"datePublished\":\"2025-10-16T08:31:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\"},\"wordCount\":4505,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"NextJS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\",\"name\":\"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-16T08:31:35+00:00\",\"description\":\"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix'leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?","description":"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix'leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/","og_locale":"tr_TR","og_type":"article","og_title":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?","og_description":"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix'leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.","og_url":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-16T08:31:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?","datePublished":"2025-10-16T08:31:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/"},"wordCount":4505,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["NextJS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/","url":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/","name":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-16T08:31:35+00:00","description":"Web Audio API, g\u00fcn\u00fcm\u00fczdeki modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan geni\u015f \u00e7apta desteklenmektedir (Chrome, Firefox, Safari, Edge, Opera gibi). Ancak, baz\u0131 eski taray\u0131c\u0131larda veya mobil cihazlarda tam destek bulunmayabilir veya vendor prefix'leri (`webkitAudioContext` gibi) gerekebilir. Genellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan sorun te\u015fkil etmez.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlar-morse-kodu-next-js-15-ve-web-audio-api-neden-onemli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Temel Kavramlar: Morse Kodu, Next.js 15 ve Web Audio API Neden \u00d6nemli?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31989"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31989\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}