Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Wednesday 15 January 2020

Crowdfunded hardware startups are breathing fresh life into music making

I love music. Seriously, it’s one of the few things that brings solace in this cold, lonely world. Want to go deep on Joni Mitchell, William Onyeabor or Pablo Casals? I’m game. Yes, I worked at multiple record stores years before TechCrunch. Yes, I will always be that guy. What I will never be, however, is a musician, professional or otherwise.

I’m resolved to this fact at this point in my life. I’ll never be a rock star like I’ll never be a professional baseball player — both facts I’ve mostly made peace with. We don’t need to go into the two years of junior high when I played the trombone, or the decade and a half I attempted to master the guitar. All you need to know is I had absolutely zero aptitude for either.

It’s not for lack of desire to make music. It’s just a straight-up, good-old-fashioned lack of talent. For precisely this reason, I view any new piece of musical equipment with great interest. There’s a ton of money to be made for the startup that can truly unlock the potential of music making for those lacking the basic skills to do so.

Roli has long been of interest to me for this reason. I was one of the first people to cover the Seaboard when it debuted at SXSW a number of years ago. It’s a fascinating instrument, letting users bend notes courtesy of a soft material makeup, but mastering it — or, really, making any music at all — requires some ability to play piano.The company’s modular block system, announced a few years ago, was even more compelling, but similarly failed to scratch that itch.

Last week at CES, the fine folks at Kickstarter introduced me to the founders of a trio of crowdfunding companies that fit the bill to some degree. French startup Joué actually went on to win top prize at our CES pitch-off this year, with its modular MIDI controller of the same name.

The device operates on a similar principle as the Sensel Morph we’ve covered before, with silicone skins that overlay atop a touch surface to offer a variety of different controllers. JouĂ©’s take is more music-focused than Sensel’s ever was. And besides, based on a conversation with Sensel at the show, I think it’s pretty fair to say that the company is turning most of its focus away from that device, in favor of compelling touch components it’s working to build into third-party handsets.

The Kickstarter project is an impressive one, as evidenced by the brief demo. It’s extremely versatile, requiring just a new skin and sound pack for the system to take on completely different aural qualities. The company also discussed the potential for customized sound packs. JouĂ© brought NWA founder Arabian Prince in to perform at its both all week. An odd fit for CES, to be sure, but an interesting example of the kinds of artists such a product might be able to draw. It’s easy to see musicians expressing interest in a customized pad.

That said, while the company seems to be positioning the product as perfect for beginners, I do expect there’s a reasonably large learning curve here. That seems removed somewhat from Rhythmo. The Austin-based startup’s project combines music making with a guided dip into the maker world.

It’s a MIDI controller drum kit that you make out of a cardboard box. It ships with all of the pieces, and putting it together offers a nice connection into the process of creating a musical instrument. Founder Ethan Jin let me take a constructed model for a spin on the CES floor. The demo was a little glitchy for various reasons, but it was fun. The kit features large arcade buttons that can be mapped to a variety of sounds. You can use the Rhythmo app or interface with your music software of choice in iPad, desktop, etc. It’s a fun entry into that world.

Artiphon, however, is probably closest to fulfilling my very specific desires. The company is best known for its massively successful Kickstarter project, Instrument 1. That racked in a mind-boggling $1.3 million with the promise of delivering a guitar, violin, piano and drum machine all in a single device.

The newer Orba ($1.4 million this time), however, really caught my eye. The puck-shaped device is a pocket synthesizer/looper/MIDI controller that requires little if any musical knowledge to get up and running. After a conversation with founder Mike Butera, I’ve come to regard it at a very base-level as a sort of musical fidget spinner.

That is to say, it’s simple enough that you can use it absentmindedly to make music while you pace around your apartment, trying to come up with a half-decent headline for the story of crowdfunded music projects at CES you’ve been writing (a purely hypothetical example that in no way reflects my life).

Of the three, that’s the one I’m most key to review, in hopes of finally scratching that musical itch.

CES 2020 coverage - TechCrunch



from TechCrunch https://ift.tt/2u6CUQQ
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support