Je me demande si quelqu'un a rencontré un moyen de générer des tons dans l'iPhone SDK. J'essaie de générer des tons DTMF et je ne peux sembler trouver rien de substantiel là-bas. Je veux pouvoir spécifier combien de temps pour jouer la tonalité pour aussi (c'est-à-dire de simuler le bouton enfoncé au lieu de simplement en appuyer brièvement. P>
J'ai trouvé une application open source appelée iphreak. C'est censé générer des tons DTMF pour tromper les téléphones de paiement (je vous assure que ce n'est pas mon intention - mon entreprise traite des systèmes d'intercom basés sur téléphone). Le seul problème avec cette application est qu'il y a des fichiers manqués dans le projet Open Source. Peut-être que quelqu'un d'autre a eu ce projet de travailler dans le passé? P>
Si quelqu'un a une idée de l'endroit où je chercherais quelque chose comme ça, je serais très reconnaissant avec mes votes :) p>
3 Réponses :
devrait être assez facile pour vous générer.
Étant donné que le matériel peut lire un tampon PCM (échantillons de 16 bits) à 44,1 kHz (ce qu'il peut sûrement avec une fonction de bibliothèque ou l'autre), vous ne pouvez pas simplement calculer la forme d'onde: Le 16383 est fait depuis que j'utilise la synthèse additive (il suffit d'ajouter les sinus-ondes ensemble). Par conséquent, le résultat maximum est -2,0 - 2.0 Donc, après avoir multiplié par 16383, je reçois plus ou moins le résultat maximum 16 bits: -32768 - +32767 P> EDIT:
Les 2 fréquences sont les fréquences de l'article de Wikipedia l'autre personne qui a répondu lié à. Deux fréquences uniques font un son DTMF p> p>
Ok, peut-être que je suis un peu derrière la courbe à ce sujet. Pouvez-vous me donner un exemple de la façon dont vous appelez cela (par exemple pour le n ° 3)? Je comprends la Freq mais ne reçoivent pas vraiment le concept de tampon.
Vous créez un tampon de longueur suffisante d'un type de données signé de 16 bits (je ne sais pas comment cela se fait dans l'objectif c). Vous choisissez ensuite les 2 fréquences appartenant au ton DTMF de 3 (697Hz et 1477Hz). Appelez ma fonction avec un pointeur sur le tampon, la longueur que vous avez allouée puis la fonction le remplira avec la forme d'onde de la tonalité DTMF. Cette forme d'onde que vous devrez ensuite passer à la fonction de la bibliothèque iPhone qui peut émettre le contenu d'un tampon à l'audiohardwareware.
Notez que le tampon est rendu avec 44100 échantillons / SEQ. Donc, lorsque vous jouez la forme d'onde, le matériel audio doit utiliser la même fréquence ou la même fréquence DTMF. Notez également que si vous voulez que la forme d'onde dure 10 secondes durera 10 secondes, la longueur de la mémoire tampon doit être LectureFreq * 10. J'espère que cela l'explique un peu. Plus d'informations sur PCM (la manière dont une forme d'onde est stockée dans la mémoire de l'ordinateur) peut être trouvée ici: FR. wikipedia.org/wiki/pulse-code_modulation
Cela a du sens maintenant, même si je n'ai toujours aucune idée d'où commencer ... à partir des docs. Merci beaucoup.
REINIER: Je crois que w est 2pi * f / c alors ne causerait pas une partie de la formule être péché (i * (PI2 * (FREQ1 / lectureFREQ))?
La réponse facile est la suivante:
soundArray = [[NSArray alloc] initWithObjects: [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-0.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-1.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-2.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-3.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-4.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-5.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-6.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-7.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-8.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-9.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-0.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-pound.caf"] autorelease], [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-star.caf"] autorelease], nil];
J'espère générer les tons de manière programmatique ... pour que je puisse les jouer pendant tout le temps. Cela peut être une bonne retombe si je ne peux pas le faire fonctionner correctement.
Vous pouvez vous en protéger, avec diverses quantités de travail en fonction de la façon dont vous avez choisi de les jouer. Bien sûr, ils sont vraiment deux ondes sinusoïles pures et facile à créer. Cependant, vous devez toujours les créer dans une certaine longueur finie et les transmettre à un joueur sonore, auquel cas vous devriez vous en protéger également une fois que le lecteur sonore est à court de données. De toute façon, vous devrez peut-être faire le travail supplémentaire de boucle.
Cela vous sera-t-il rejeté de l'App Store?
Techniquement, vous n'utilisez aucune API interdite ou privée. En outre, vous n'avez pas eu à faire quoi que ce soit difficile de sortir de votre bac à sable. Je l'utiliserais comme cela, et s'il ya un problème, allez-y et copiez ces fichiers dans votre ensemble et distribuez avec votre application. Ce ne sera pas un coup énorme si vous avez été rejeté et devait l'utiliser comme votre plan B.
Cet exemple a des fuites de mémoire. Ne postez pas de code avec des fuites de mémoire évidentes.
@RPetrich: Comment ça va? Parlez-vous de retenir les comptes sur des objets de tableau 2 après cet extrait?
@MAhbouds: Ignorer Retenir les comptes, ils ne sont que pour le débogage. Considérer la propriété. Dans votre exemple, le bloc environnant possède les effets sonores ajoutés à la matrice, mais les blocs environnants ne leur ont pas de référence, ainsi une fuite. Ajouter des appels d'autorelease pour résoudre ce problème.
Je vois ce que tu veux dire. Je corrige. Merci. Je n'appelle pas ça une fuite, mais je me suis en train de se mettre en place pour une fuite :-)
Quelqu'un a-t-il réellement utilisé cette technique? Était-ce rejeté par Apple?
Hey @mahboudz! Quelle est cette classe SoundEffect?
@Danik: Soundeffet est une classe incluse dans de nombreux échantillons de pommes.
J'échangeais avec la génération de données PCM et je suis arrivé à cela à Swift. Cette fonction générera un chacun DTMF est composé d'une paire de tons, d'une longueur de marque (250 ms), d'une longueur d'espace (250 ms) et, bien sûr, vous devez spécifier une fréquence d'échantillon (8000 Hz). Mark and Space est généralement d'environ 250 ms pour ce que j'appellerais la numérotation humaine standard. La fréquence de l'échantillon est amusante à jouer, mais doit être deux fois supérieure à la fréquence la plus élevée. Pour le plaisir, vous pouvez le laisser tomber en dessous de cela pour entendre ce qui se passe. P> Le terrain de jeu complet peut être téléchargé sur github . P> h2> [float] code> qui sont les échantillons audio. Vous pouvez les jouer avec
Avaaudio code>. P>